Coverage Report

Created: 2023-06-07 06:44

/src/msgpack-c/include/msgpack/v1/unpack_decl.hpp
Line
Count
Source
1
//
2
// MessagePack for C++ deserializing routine
3
//
4
// Copyright (C) 2008-2016 FURUHASHI Sadayuki and KONDO Takatoshi
5
//
6
//    Distributed under the Boost Software License, Version 1.0.
7
//    (See accompanying file LICENSE_1_0.txt or copy at
8
//    http://www.boost.org/LICENSE_1_0.txt)
9
//
10
#ifndef MSGPACK_V1_UNPACK_DECL_HPP
11
#define MSGPACK_V1_UNPACK_DECL_HPP
12
13
#include "msgpack/versioning.hpp"
14
#include "msgpack/unpack_define.hpp"
15
#include "msgpack/object.hpp"
16
#include "msgpack/zone.hpp"
17
#include "msgpack/cpp_config.hpp"
18
#include "msgpack/sysdep.hpp"
19
#include "msgpack/parse_return.hpp"
20
21
#include <memory>
22
#include <stdexcept>
23
24
#if !defined(MSGPACK_USE_CPP03)
25
#include <atomic>
26
#endif
27
28
29
#if defined(_MSC_VER)
30
// avoiding confliction std::max, std::min, and macro in windows.h
31
#ifndef NOMINMAX
32
#define NOMINMAX
33
#endif
34
#endif // defined(_MSC_VER)
35
36
#ifdef _msgpack_atomic_counter_header
37
#include _msgpack_atomic_counter_header
38
#endif
39
40
const size_t COUNTER_SIZE = sizeof(_msgpack_atomic_counter_t);
41
42
#ifndef MSGPACK_UNPACKER_INIT_BUFFER_SIZE
43
#define MSGPACK_UNPACKER_INIT_BUFFER_SIZE (64*1024)
44
#endif
45
46
#ifndef MSGPACK_UNPACKER_RESERVE_SIZE
47
#define MSGPACK_UNPACKER_RESERVE_SIZE (32*1024)
48
#endif
49
50
51
// backward compatibility
52
#ifndef MSGPACK_UNPACKER_DEFAULT_INITIAL_BUFFER_SIZE
53
#define MSGPACK_UNPACKER_DEFAULT_INITIAL_BUFFER_SIZE MSGPACK_UNPACKER_INIT_BUFFER_SIZE
54
#endif
55
56
57
namespace msgpack {
58
59
/// @cond
60
MSGPACK_API_VERSION_NAMESPACE(v1) {
61
/// @endcond
62
63
/// The type of reference or copy judging function.
64
/**
65
 * @param type msgpack data type.
66
 * @param size msgpack data size.
67
 * @param user_data The user_data that is set by msgpack::unpack functions.
68
 *
69
 * @return If the data should be referenced, then return true, otherwise (should be copied) false.
70
 *
71
 * This function is called when unpacking STR, BIN, or EXT.
72
 *
73
 */
74
typedef bool (*unpack_reference_func)(msgpack::type::object_type type, std::size_t size, void* user_data);
75
76
struct unpack_error;
77
struct parse_error;
78
struct insufficient_bytes;
79
struct size_overflow;
80
struct array_size_overflow;
81
struct map_size_overflow;
82
struct str_size_overflow;
83
struct bin_size_overflow;
84
struct ext_size_overflow;
85
struct depth_size_overflow;
86
87
class unpack_limit {
88
public:
89
    unpack_limit(
90
        std::size_t array = 0xffffffff,
91
        std::size_t map = 0xffffffff,
92
        std::size_t str = 0xffffffff,
93
        std::size_t bin = 0xffffffff,
94
        std::size_t ext = 0xffffffff,
95
        std::size_t depth = 0xffffffff)
96
        :array_(array),
97
         map_(map),
98
         str_(str),
99
         bin_(bin),
100
         ext_(ext),
101
2.23k
         depth_(depth) {}
102
132k
    std::size_t array() const { return array_; }
103
159k
    std::size_t map() const { return map_; }
104
36.9k
    std::size_t str() const { return str_; }
105
9.19k
    std::size_t bin() const { return bin_; }
106
30.2k
    std::size_t ext() const { return ext_; }
107
292k
    std::size_t depth() const { return depth_; }
108
109
private:
110
    std::size_t array_;
111
    std::size_t map_;
112
    std::size_t str_;
113
    std::size_t bin_;
114
    std::size_t ext_;
115
    std::size_t depth_;
116
};
117
118
namespace detail {
119
120
class unpack_user;
121
122
void unpack_uint8(uint8_t d, msgpack::object& o);
123
124
void unpack_uint16(uint16_t d, msgpack::object& o);
125
126
void unpack_uint32(uint32_t d, msgpack::object& o);
127
128
void unpack_uint64(uint64_t d, msgpack::object& o);
129
130
void unpack_int8(int8_t d, msgpack::object& o);
131
132
void unpack_int16(int16_t d, msgpack::object& o);
133
134
void unpack_int32(int32_t d, msgpack::object& o);
135
136
void unpack_int64(int64_t d, msgpack::object& o);
137
138
void unpack_float(float d, msgpack::object& o);
139
140
void unpack_double(double d, msgpack::object& o);
141
142
void unpack_nil(msgpack::object& o);
143
144
void unpack_true(msgpack::object& o);
145
146
void unpack_false(msgpack::object& o);
147
148
struct unpack_array;
149
150
void unpack_array_item(msgpack::object& c, msgpack::object const& o);
151
152
struct unpack_map;
153
154
void unpack_map_item(msgpack::object& c, msgpack::object const& k, msgpack::object const& v);
155
156
void unpack_str(unpack_user& u, const char* p, uint32_t l, msgpack::object& o);
157
158
void unpack_bin(unpack_user& u, const char* p, uint32_t l, msgpack::object& o);
159
160
void unpack_ext(unpack_user& u, const char* p, std::size_t l, msgpack::object& o);
161
162
class unpack_stack;
163
164
void init_count(void* buffer);
165
166
void decr_count(void* buffer);
167
168
void incr_count(void* buffer);
169
170
#if defined(MSGPACK_USE_CPP03)
171
172
_msgpack_atomic_counter_t get_count(void* buffer);
173
174
#else  // defined(MSGPACK_USE_CPP03)
175
176
std::atomic<unsigned int> const& get_count(void* buffer);
177
178
#endif // defined(MSGPACK_USE_CPP03)
179
180
struct fix_tag {
181
    char f1[65]; // FIXME unique size is required. or use is_same meta function.
182
};
183
184
template <typename T>
185
struct value;
186
187
template <typename T>
188
typename msgpack::enable_if<sizeof(T) == sizeof(fix_tag)>::type load(uint32_t& dst, const char* n);
189
190
template <typename T>
191
typename msgpack::enable_if<sizeof(T) == 1>::type load(T& dst, const char* n);
192
193
template <typename T>
194
typename msgpack::enable_if<sizeof(T) == 2>::type load(T& dst, const char* n);
195
196
template <typename T>
197
typename msgpack::enable_if<sizeof(T) == 4>::type load(T& dst, const char* n);
198
199
template <typename T>
200
typename msgpack::enable_if<sizeof(T) == 8>::type load(T& dst, const char* n);
201
202
class context;
203
204
} // detail
205
206
207
typedef object_handle unpacked;
208
209
/// Unpacking class for a stream deserialization.
210
class unpacker;
211
212
/// Unpack msgpack::object from a buffer.
213
/**
214
 * @param data The pointer to the buffer.
215
 * @param len The length of the buffer.
216
 * @param off The offset position of the buffer. It is read and overwritten.
217
 * @param referenced If the unpacked object contains reference of the buffer, then set as true, otherwise false.
218
 * @param f A judging function that msgpack::object refer to the buffer.
219
 * @param user_data This parameter is passed to f.
220
 * @param limit The size limit information of msgpack::object.
221
 *
222
 * @return object_handle that contains unpacked data.
223
 *
224
 */
225
object_handle unpack(
226
    const char* data, std::size_t len, std::size_t& off, bool& referenced,
227
    unpack_reference_func f = MSGPACK_NULLPTR, void* user_data = MSGPACK_NULLPTR, unpack_limit const& limit = unpack_limit());
228
229
/// Unpack msgpack::object from a buffer.
230
/**
231
 * @param data The pointer to the buffer.
232
 * @param len The length of the buffer.
233
 * @param off The offset position of the buffer. It is read and overwritten.
234
 * @param f A judging function that msgpack::object refer to the buffer.
235
 * @param user_data This parameter is passed to f.
236
 * @param limit The size limit information of msgpack::object.
237
 *
238
 * @return object_handle that contains unpacked data.
239
 *
240
 */
241
object_handle unpack(
242
    const char* data, std::size_t len, std::size_t& off,
243
    unpack_reference_func f = MSGPACK_NULLPTR, void* user_data = MSGPACK_NULLPTR, unpack_limit const& limit = unpack_limit());
244
245
/// Unpack msgpack::object from a buffer.
246
/**
247
 * @param data The pointer to the buffer.
248
 * @param len The length of the buffer.
249
 * @param referenced If the unpacked object contains reference of the buffer, then set as true, otherwise false.
250
 * @param f A judging function that msgpack::object refer to the buffer.
251
 * @param user_data This parameter is passed to f.
252
 * @param limit The size limit information of msgpack::object.
253
 *
254
 * @return object_handle that contains unpacked data.
255
 *
256
 */
257
object_handle unpack(
258
    const char* data, std::size_t len, bool& referenced,
259
    unpack_reference_func f = MSGPACK_NULLPTR, void* user_data = MSGPACK_NULLPTR, unpack_limit const& limit = unpack_limit());
260
261
/// Unpack msgpack::object from a buffer.
262
/**
263
 * @param data The pointer to the buffer.
264
 * @param len The length of the buffer.
265
 * @param f A judging function that msgpack::object refer to the buffer.
266
 * @param user_data This parameter is passed to f.
267
 * @param limit The size limit information of msgpack::object.
268
 *
269
 * @return object_handle that contains unpacked data.
270
 *
271
 */
272
object_handle unpack(
273
    const char* data, std::size_t len,
274
    unpack_reference_func f = MSGPACK_NULLPTR, void* user_data = MSGPACK_NULLPTR, unpack_limit const& limit = unpack_limit());
275
276
277
/// Unpack msgpack::object from a buffer.
278
/**
279
 * @param result The object_handle that contains unpacked data.
280
 * @param data The pointer to the buffer.
281
 * @param len The length of the buffer.
282
 * @param off The offset position of the buffer. It is read and overwritten.
283
 * @param referenced If the unpacked object contains reference of the buffer, then set as true, otherwise false.
284
 * @param f A judging function that msgpack::object refer to the buffer.
285
 * @param user_data This parameter is passed to f.
286
 * @param limit The size limit information of msgpack::object.
287
 *
288
 *
289
 */
290
void unpack(
291
    object_handle& result,
292
    const char* data, std::size_t len, std::size_t& off, bool& referenced,
293
    unpack_reference_func f = MSGPACK_NULLPTR, void* user_data = MSGPACK_NULLPTR, unpack_limit const& limit = unpack_limit());
294
295
/// Unpack msgpack::object from a buffer.
296
/**
297
 * @param result The object_handle that contains unpacked data.
298
 * @param data The pointer to the buffer.
299
 * @param len The length of the buffer.
300
 * @param off The offset position of the buffer. It is read and overwritten.
301
 * @param f A judging function that msgpack::object refer to the buffer.
302
 * @param user_data This parameter is passed to f.
303
 * @param limit The size limit information of msgpack::object.
304
 *
305
 *
306
 */
307
void unpack(
308
    object_handle& result,
309
    const char* data, std::size_t len, std::size_t& off,
310
    unpack_reference_func f = MSGPACK_NULLPTR, void* user_data = MSGPACK_NULLPTR, unpack_limit const& limit = unpack_limit());
311
312
/// Unpack msgpack::object from a buffer.
313
/**
314
 * @param result The object_handle that contains unpacked data.
315
 * @param data The pointer to the buffer.
316
 * @param len The length of the buffer.
317
 * @param referenced If the unpacked object contains reference of the buffer, then set as true, otherwise false.
318
 * @param f A judging function that msgpack::object refer to the buffer.
319
 * @param user_data This parameter is passed to f.
320
 * @param limit The size limit information of msgpack::object.
321
 *
322
 *
323
 */
324
void unpack(
325
    object_handle& result,
326
    const char* data, std::size_t len, bool& referenced,
327
    unpack_reference_func f = MSGPACK_NULLPTR, void* user_data = MSGPACK_NULLPTR, unpack_limit const& limit = unpack_limit());
328
329
/// Unpack msgpack::object from a buffer.
330
/**
331
 * @param result The object_handle that contains unpacked data.
332
 * @param data The pointer to the buffer.
333
 * @param len The length of the buffer.
334
 * @param f A judging function that msgpack::object refer to the buffer.
335
 * @param user_data This parameter is passed to f.
336
 * @param limit The size limit information of msgpack::object.
337
 *
338
 *
339
 */
340
void unpack(
341
    object_handle& result,
342
    const char* data, std::size_t len,
343
    unpack_reference_func f = MSGPACK_NULLPTR, void* user_data = MSGPACK_NULLPTR, unpack_limit const& limit = unpack_limit());
344
345
/// Unpack msgpack::object from a buffer.
346
/**
347
 * @param z The msgpack::zone that is used as a memory of unpacked msgpack objects.
348
 * @param data The pointer to the buffer.
349
 * @param len The length of the buffer.
350
 * @param off The offset position of the buffer. It is read and overwritten.
351
 * @param referenced If the unpacked object contains reference of the buffer, then set as true, otherwise false.
352
 * @param f A judging function that msgpack::object refer to the buffer.
353
 * @param user_data This parameter is passed to f.
354
 * @param limit The size limit information of msgpack::object.
355
 *
356
 * @return msgpack::object that contains unpacked data.
357
 *
358
 */
359
msgpack::object unpack(
360
    msgpack::zone& z,
361
    const char* data, std::size_t len, std::size_t& off, bool& referenced,
362
    unpack_reference_func f = MSGPACK_NULLPTR, void* user_data = MSGPACK_NULLPTR, unpack_limit const& limit = unpack_limit());
363
364
/// Unpack msgpack::object from a buffer.
365
/**
366
 * @param z The msgpack::zone that is used as a memory of unpacked msgpack objects.
367
 * @param data The pointer to the buffer.
368
 * @param len The length of the buffer.
369
 * @param off The offset position of the buffer. It is read and overwritten.
370
 * @param f A judging function that msgpack::object refer to the buffer.
371
 * @param user_data This parameter is passed to f.
372
 * @param limit The size limit information of msgpack::object.
373
 *
374
 * @return msgpack::object that contains unpacked data.
375
 *
376
 */
377
msgpack::object unpack(
378
    msgpack::zone& z,
379
    const char* data, std::size_t len, std::size_t& off,
380
    unpack_reference_func f = MSGPACK_NULLPTR, void* user_data = MSGPACK_NULLPTR, unpack_limit const& limit = unpack_limit());
381
382
/// Unpack msgpack::object from a buffer.
383
/**
384
 * @param z The msgpack::zone that is used as a memory of unpacked msgpack objects.
385
 * @param data The pointer to the buffer.
386
 * @param len The length of the buffer.
387
 * @param referenced If the unpacked object contains reference of the buffer, then set as true, otherwise false.
388
 * @param f A judging function that msgpack::object refer to the buffer.
389
 * @param user_data This parameter is passed to f.
390
 * @param limit The size limit information of msgpack::object.
391
 *
392
 * @return msgpack::object that contains unpacked data.
393
 *
394
 */
395
msgpack::object unpack(
396
    msgpack::zone& z,
397
    const char* data, std::size_t len, bool& referenced,
398
    unpack_reference_func f = MSGPACK_NULLPTR, void* user_data = MSGPACK_NULLPTR, unpack_limit const& limit = unpack_limit());
399
400
/// Unpack msgpack::object from a buffer.
401
/**
402
 * @param z The msgpack::zone that is used as a memory of unpacked msgpack objects.
403
 * @param data The pointer to the buffer.
404
 * @param len The length of the buffer.
405
 * @param f A judging function that msgpack::object refer to the buffer.
406
 * @param user_data This parameter is passed to f.
407
 * @param limit The size limit information of msgpack::object.
408
 *
409
 * @return msgpack::object that contains unpacked data.
410
 *
411
 */
412
msgpack::object unpack(
413
    msgpack::zone& z,
414
    const char* data, std::size_t len,
415
    unpack_reference_func f = MSGPACK_NULLPTR, void* user_data = MSGPACK_NULLPTR, unpack_limit const& limit = unpack_limit());
416
417
418
/// Unpack msgpack::object from a buffer. [obsolete]
419
/**
420
 * @param result The object_handle that contains unpacked data.
421
 * @param data The pointer to the buffer.
422
 * @param len The length of the buffer.
423
 * @param off The offset position of the buffer. It is read and overwritten.
424
 * @param referenced If the unpacked object contains reference of the buffer, then set as true, otherwise false.
425
 * @param f A judging function that msgpack::object refer to the buffer.
426
 * @param user_data This parameter is passed to f.
427
 * @param limit The size limit information of msgpack::object.
428
 *
429
 * This function is obsolete. Use the reference inteface version of unpack functions instead of the pointer interface version.
430
 */
431
void unpack(
432
    object_handle* result,
433
    const char* data, std::size_t len, std::size_t* off = MSGPACK_NULLPTR, bool* referenced = MSGPACK_NULLPTR,
434
    unpack_reference_func f = MSGPACK_NULLPTR, void* user_data = MSGPACK_NULLPTR, unpack_limit const& limit = unpack_limit());
435
436
437
namespace detail {
438
439
parse_return
440
unpack_imp(const char* data, std::size_t len, std::size_t& off,
441
           msgpack::zone& result_zone, msgpack::object& result, bool& referenced,
442
           unpack_reference_func f, void* user_data,
443
           unpack_limit const& limit);
444
445
} // detail
446
447
448
/// @cond
449
}  // MSGPACK_API_VERSION_NAMESPACE(v1)
450
/// @endcond
451
452
}  // namespace msgpack
453
454
#endif // MSGPACK_V1_UNPACK_DECL_HPP