Coverage Report

Created: 2026-09-28 07:09

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/nanopb/pb_decode.c
Line
Count
Source
1
/* pb_decode.c -- decode a protobuf using minimal resources
2
 *
3
 * 2011 Petteri Aimonen <jpa@kapsi.fi>
4
 */
5
6
/* Use the GCC warn_unused_result attribute to check that all return values
7
 * are propagated correctly. On other compilers, gcc before 3.4.0 and iar
8
 * before 9.40.1 just ignore the annotation.
9
 */
10
#if (defined(__GNUC__) && ((__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))) || \
11
    (defined(__IAR_SYSTEMS_ICC__) && (__VER__ >= 9040001))
12
    #define checkreturn __attribute__((warn_unused_result))
13
#else
14
    #define checkreturn
15
#endif
16
17
#include "pb.h"
18
#include "pb_decode.h"
19
#include "pb_common.h"
20
21
/**************************************
22
 * Declarations internal to this file *
23
 **************************************/
24
25
static bool checkreturn buf_read(pb_istream_t *stream, pb_byte_t *buf, size_t count);
26
static bool checkreturn read_raw_value(pb_istream_t *stream, pb_wire_type_t wire_type, pb_byte_t *buf, size_t *size);
27
static bool checkreturn decode_basic_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *field);
28
static bool checkreturn decode_static_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *field);
29
static bool checkreturn decode_pointer_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *field);
30
static bool checkreturn decode_callback_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *field);
31
static bool checkreturn decode_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *field);
32
static bool checkreturn default_extension_decoder(pb_istream_t *stream, pb_extension_t *extension, uint32_t tag, pb_wire_type_t wire_type);
33
static bool checkreturn decode_extension(pb_istream_t *stream, uint32_t tag, pb_wire_type_t wire_type, pb_extension_t *extension);
34
static bool pb_field_set_to_default(pb_field_iter_t *field);
35
static bool pb_message_set_to_defaults(pb_field_iter_t *iter);
36
static bool checkreturn pb_dec_bool(pb_istream_t *stream, const pb_field_iter_t *field);
37
static bool checkreturn pb_dec_varint(pb_istream_t *stream, const pb_field_iter_t *field);
38
static bool checkreturn pb_dec_bytes(pb_istream_t *stream, const pb_field_iter_t *field);
39
static bool checkreturn pb_dec_string(pb_istream_t *stream, const pb_field_iter_t *field);
40
static bool checkreturn pb_dec_submessage(pb_istream_t *stream, const pb_field_iter_t *field);
41
static bool checkreturn pb_dec_fixed_length_bytes(pb_istream_t *stream, const pb_field_iter_t *field);
42
static bool checkreturn pb_skip_varint(pb_istream_t *stream);
43
static bool checkreturn pb_skip_string(pb_istream_t *stream);
44
45
#ifdef PB_ENABLE_MALLOC
46
static bool checkreturn allocate_field(pb_istream_t *stream, void *pData, size_t data_size, size_t array_size);
47
static void initialize_pointer_field(void *pItem, pb_field_iter_t *field);
48
static bool checkreturn pb_release_union_field(pb_istream_t *stream, pb_field_iter_t *field);
49
static void pb_release_single_field(pb_field_iter_t *field);
50
#endif
51
52
#ifdef PB_WITHOUT_64BIT
53
#define pb_int64_t int32_t
54
#define pb_uint64_t uint32_t
55
#else
56
18.0M
#define pb_int64_t int64_t
57
13.5M
#define pb_uint64_t uint64_t
58
#endif
59
60
typedef struct {
61
    uint32_t bitfield[(PB_MAX_REQUIRED_FIELDS + 31) / 32];
62
} pb_fields_seen_t;
63
64
/*******************************
65
 * pb_istream_t implementation *
66
 *******************************/
67
68
static bool checkreturn buf_read(pb_istream_t *stream, pb_byte_t *buf, size_t count)
69
81.4M
{
70
81.4M
    const pb_byte_t *source = (const pb_byte_t*)stream->state;
71
81.4M
    stream->state = (pb_byte_t*)stream->state + count;
72
    
73
81.4M
    if (buf != NULL)
74
81.4M
    {
75
81.4M
        memcpy(buf, source, count * sizeof(pb_byte_t));
76
81.4M
    }
77
    
78
81.4M
    return true;
79
81.4M
}
80
81
bool checkreturn pb_read(pb_istream_t *stream, pb_byte_t *buf, size_t count)
82
2.54M
{
83
2.54M
    if (count == 0)
84
832k
        return true;
85
86
1.71M
#ifndef PB_BUFFER_ONLY
87
1.71M
  if (buf == NULL && stream->callback != buf_read)
88
30.6k
  {
89
    /* Skip input bytes */
90
30.6k
    pb_byte_t tmp[16];
91
204k
    while (count > 16)
92
174k
    {
93
174k
      if (!pb_read(stream, tmp, 16))
94
0
        return false;
95
      
96
174k
      count -= 16;
97
174k
    }
98
    
99
30.6k
    return pb_read(stream, tmp, count);
100
30.6k
  }
101
1.68M
#endif
102
103
1.68M
    if (stream->bytes_left < count)
104
269
        PB_RETURN_ERROR(stream, "end-of-stream");
105
    
106
1.68M
#ifndef PB_BUFFER_ONLY
107
1.68M
    if (!stream->callback(stream, buf, count))
108
0
        PB_RETURN_ERROR(stream, "io error");
109
#else
110
    if (!buf_read(stream, buf, count))
111
        return false;
112
#endif
113
    
114
1.68M
    if (stream->bytes_left < count)
115
0
        stream->bytes_left = 0;
116
1.68M
    else
117
1.68M
        stream->bytes_left -= count;
118
119
1.68M
    return true;
120
1.68M
}
121
122
/* Read a single byte from input stream. buf may not be NULL.
123
 * This is an optimization for the varint decoding. */
124
static bool checkreturn pb_readbyte(pb_istream_t *stream, pb_byte_t *buf)
125
114M
{
126
114M
    if (stream->bytes_left == 0)
127
395
        PB_RETURN_ERROR(stream, "end-of-stream");
128
129
114M
#ifndef PB_BUFFER_ONLY
130
114M
    if (!stream->callback(stream, buf, 1))
131
1.66k
        PB_RETURN_ERROR(stream, "io error");
132
#else
133
    *buf = *(const pb_byte_t*)stream->state;
134
    stream->state = (pb_byte_t*)stream->state + 1;
135
#endif
136
137
114M
    stream->bytes_left--;
138
    
139
114M
    return true;    
140
114M
}
141
142
pb_istream_t pb_istream_from_buffer(const pb_byte_t *buf, size_t msglen)
143
11.5k
{
144
11.5k
    pb_istream_t stream;
145
    /* Cast away the const from buf without a compiler error.  We are
146
     * careful to use it only in a const manner in the callbacks.
147
     */
148
11.5k
    union {
149
11.5k
        void *state;
150
11.5k
        const void *c_state;
151
11.5k
    } state;
152
#ifdef PB_BUFFER_ONLY
153
    stream.callback = NULL;
154
#else
155
11.5k
    stream.callback = &buf_read;
156
11.5k
#endif
157
11.5k
    state.c_state = buf;
158
11.5k
    stream.state = state.state;
159
11.5k
    stream.bytes_left = msglen;
160
11.5k
#ifndef PB_NO_ERRMSG
161
11.5k
    stream.errmsg = NULL;
162
11.5k
#endif
163
#ifdef PB_MESSAGE_NESTING_MAX
164
    stream.depth = 0;
165
#endif
166
11.5k
    return stream;
167
11.5k
}
168
169
170
/********************
171
 * Helper functions *
172
 ********************/
173
174
bool checkreturn pb_decode_varint32(pb_istream_t *stream, uint32_t *dest)
175
66.2M
{
176
66.2M
    pb_byte_t byte;
177
66.2M
    uint32_t result;
178
    
179
66.2M
    if (!pb_readbyte(stream, &byte))
180
1.90k
    {
181
1.90k
        return false;
182
1.90k
    }
183
    
184
66.2M
    if ((byte & 0x80) == 0)
185
35.3M
    {
186
        /* Quick case, 1 byte value */
187
35.3M
        result = byte;
188
35.3M
    }
189
30.9M
    else
190
30.9M
    {
191
        /* Multibyte case */
192
30.9M
        uint_fast8_t bitpos = 7;
193
30.9M
        result = byte & 0x7F;
194
        
195
30.9M
        do
196
31.0M
        {
197
31.0M
            if (!pb_readbyte(stream, &byte))
198
61
                return false;
199
            
200
31.0M
            if (bitpos >= 32)
201
7.81k
            {
202
                /* Note: The varint could have trailing 0x80 bytes, or 0xFF for negative. */
203
7.81k
                pb_byte_t sign_extension = (bitpos < 63) ? 0xFF : 0x01;
204
7.81k
                bool valid_extension = ((byte & 0x7F) == 0x00 ||
205
3.54k
                         ((result >> 31) != 0 && byte == sign_extension));
206
207
7.81k
                if (bitpos >= 64 || !valid_extension)
208
73
                {
209
73
                    PB_RETURN_ERROR(stream, "varint overflow");
210
73
                }
211
7.81k
            }
212
31.0M
            else if (bitpos == 28)
213
12.1k
            {
214
12.1k
                if ((byte & 0x70) != 0 && (byte & 0x78) != 0x78)
215
39
                {
216
39
                    PB_RETURN_ERROR(stream, "varint overflow");
217
39
                }
218
12.1k
                result |= (uint32_t)(byte & 0x0F) << bitpos;
219
12.1k
            }
220
31.0M
            else
221
31.0M
            {
222
31.0M
                result |= (uint32_t)(byte & 0x7F) << bitpos;
223
31.0M
            }
224
31.0M
            bitpos = (uint_fast8_t)(bitpos + 7);
225
31.0M
        } while (byte & 0x80);
226
30.9M
   }
227
   
228
66.2M
   *dest = result;
229
66.2M
   return true;
230
66.2M
}
231
232
#ifndef PB_WITHOUT_64BIT
233
bool checkreturn pb_decode_varint(pb_istream_t *stream, uint64_t *dest)
234
9.86M
{
235
9.86M
    pb_byte_t byte;
236
9.86M
    uint_fast8_t bitpos = 0;
237
9.86M
    uint64_t result = 0;
238
    
239
9.86M
    do
240
17.5M
    {
241
17.5M
        if (!pb_readbyte(stream, &byte))
242
97
            return false;
243
244
17.5M
        if (bitpos >= 63 && (byte & 0xFE) != 0)
245
40
            PB_RETURN_ERROR(stream, "varint overflow");
246
247
17.5M
        result |= (uint64_t)(byte & 0x7F) << bitpos;
248
17.5M
        bitpos = (uint_fast8_t)(bitpos + 7);
249
17.5M
    } while (byte & 0x80);
250
    
251
9.86M
    *dest = result;
252
9.86M
    return true;
253
9.86M
}
254
#endif
255
256
bool checkreturn pb_skip_varint(pb_istream_t *stream)
257
130k
{
258
130k
    pb_byte_t byte;
259
130k
    do
260
150k
    {
261
150k
        if (!pb_read(stream, &byte, 1))
262
71
            return false;
263
150k
    } while (byte & 0x80);
264
130k
    return true;
265
130k
}
266
267
bool checkreturn pb_skip_string(pb_istream_t *stream)
268
125k
{
269
125k
    uint32_t length;
270
125k
    if (!pb_decode_varint32(stream, &length))
271
52
        return false;
272
    
273
125k
    if ((size_t)length != length)
274
0
    {
275
0
        PB_RETURN_ERROR(stream, "size too large");
276
0
    }
277
278
125k
    return pb_read(stream, NULL, (size_t)length);
279
125k
}
280
281
bool checkreturn pb_decode_tag(pb_istream_t *stream, pb_wire_type_t *wire_type, uint32_t *tag, bool *eof)
282
32.5M
{
283
32.5M
    uint32_t temp;
284
32.5M
    *eof = false;
285
32.5M
    *wire_type = (pb_wire_type_t) 0;
286
32.5M
    *tag = 0;
287
288
32.5M
    if (stream->bytes_left == 0)
289
177k
    {
290
177k
        *eof = true;
291
177k
        return false;
292
177k
    }
293
294
32.3M
    if (!pb_decode_varint32(stream, &temp))
295
1.77k
    {
296
1.77k
#ifndef PB_BUFFER_ONLY
297
        /* Workaround for issue #1017
298
         *
299
         * Callback streams don't set bytes_left to 0 on eof until after being called by pb_decode_varint32,
300
         * which results in "io error" being raised. This contrasts the behavior of buffer streams who raise
301
         * no error on eof as bytes_left is already 0 on entry. This causes legitimate errors (e.g. missing
302
         * required fields) to be incorrectly reported by callback streams.
303
         */
304
1.77k
        if (stream->callback != buf_read && stream->bytes_left == 0)
305
1.66k
        {
306
1.66k
#ifndef PB_NO_ERRMSG
307
1.66k
            if (strcmp(stream->errmsg, "io error") == 0)
308
1.66k
                stream->errmsg = NULL;
309
1.66k
#endif
310
1.66k
            *eof = true;
311
1.66k
        }
312
1.77k
#endif
313
1.77k
        return false;
314
1.77k
    }
315
    
316
32.3M
    *tag = temp >> 3;
317
32.3M
    *wire_type = (pb_wire_type_t)(temp & 7);
318
32.3M
    return true;
319
32.3M
}
320
321
bool checkreturn pb_skip_field(pb_istream_t *stream, pb_wire_type_t wire_type)
322
308k
{
323
308k
    switch (wire_type)
324
308k
    {
325
130k
        case PB_WT_VARINT: return pb_skip_varint(stream);
326
10.2k
        case PB_WT_64BIT: return pb_read(stream, NULL, 8);
327
125k
        case PB_WT_STRING: return pb_skip_string(stream);
328
41.1k
        case PB_WT_32BIT: return pb_read(stream, NULL, 4);
329
0
  case PB_WT_PACKED: 
330
            /* Calling pb_skip_field with a PB_WT_PACKED is an error.
331
             * Explicitly handle this case and fallthrough to default to avoid
332
             * compiler warnings.
333
             */
334
106
        default: PB_RETURN_ERROR(stream, "invalid wire_type");
335
308k
    }
336
308k
}
337
338
/* Read a raw value to buffer, for the purpose of passing it to callback as
339
 * a substream. Size is maximum size on call, and actual size on return.
340
 */
341
static bool checkreturn read_raw_value(pb_istream_t *stream, pb_wire_type_t wire_type, pb_byte_t *buf, size_t *size)
342
4.53k
{
343
4.53k
    size_t max_size = *size;
344
4.53k
    switch (wire_type)
345
4.53k
    {
346
2.51k
        case PB_WT_VARINT:
347
2.51k
            *size = 0;
348
2.51k
            do
349
4.19k
            {
350
4.19k
                (*size)++;
351
4.19k
                if (*size > max_size)
352
4
                    PB_RETURN_ERROR(stream, "varint overflow");
353
354
4.18k
                if (!pb_read(stream, buf, 1))
355
27
                    return false;
356
4.18k
            } while (*buf++ & 0x80);
357
2.48k
            return true;
358
            
359
952
        case PB_WT_64BIT:
360
952
            *size = 8;
361
952
            return pb_read(stream, buf, 8);
362
        
363
1.06k
        case PB_WT_32BIT:
364
1.06k
            *size = 4;
365
1.06k
            return pb_read(stream, buf, 4);
366
        
367
0
        case PB_WT_STRING:
368
            /* Calling read_raw_value with a PB_WT_STRING is an error.
369
             * Explicitly handle this case and fallthrough to default to avoid
370
             * compiler warnings.
371
             */
372
373
0
  case PB_WT_PACKED: 
374
            /* Calling read_raw_value with a PB_WT_PACKED is an error.
375
             * Explicitly handle this case and fallthrough to default to avoid
376
             * compiler warnings.
377
             */
378
379
5
        default: PB_RETURN_ERROR(stream, "invalid wire_type");
380
4.53k
    }
381
4.53k
}
382
383
/* Decode string length from stream and return a substream with limited length.
384
 * Remember to close the substream using pb_close_string_substream().
385
 */
386
bool checkreturn pb_make_string_substream(pb_istream_t *stream, pb_istream_t *substream)
387
262k
{
388
262k
    uint32_t size;
389
262k
    if (!pb_decode_varint32(stream, &size))
390
122
        return false;
391
    
392
262k
    *substream = *stream;
393
262k
    if (substream->bytes_left < size)
394
119
        PB_RETURN_ERROR(stream, "parent stream too short");
395
    
396
#ifdef PB_MESSAGE_NESTING_MAX
397
    substream->depth++;
398
    if (substream->depth > PB_MESSAGE_NESTING_MAX)
399
        PB_RETURN_ERROR(stream, "max depth");
400
#endif
401
402
262k
    substream->bytes_left = (size_t)size;
403
262k
    stream->bytes_left -= (size_t)size;
404
262k
    return true;
405
262k
}
406
407
bool checkreturn pb_close_string_substream(pb_istream_t *stream, pb_istream_t *substream)
408
262k
{
409
262k
    if (substream->bytes_left) {
410
657
        if (!pb_read(substream, NULL, substream->bytes_left))
411
0
            return false;
412
657
    }
413
414
262k
    stream->state = substream->state;
415
416
262k
#ifndef PB_NO_ERRMSG
417
262k
    stream->errmsg = substream->errmsg;
418
262k
#endif
419
262k
    return true;
420
262k
}
421
422
/*************************
423
 * Decode a single field *
424
 *************************/
425
426
static bool checkreturn decode_basic_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *field)
427
43.7M
{
428
43.7M
    switch (PB_LTYPE(field->type))
429
43.7M
    {
430
3.15M
        case PB_LTYPE_BOOL:
431
3.15M
            if (wire_type != PB_WT_VARINT && wire_type != PB_WT_PACKED)
432
11
                PB_RETURN_ERROR(stream, "wrong wire type");
433
434
3.15M
            return pb_dec_bool(stream, field);
435
436
5.30M
        case PB_LTYPE_VARINT:
437
6.16M
        case PB_LTYPE_UVARINT:
438
9.86M
        case PB_LTYPE_SVARINT:
439
9.86M
            if (wire_type != PB_WT_VARINT && wire_type != PB_WT_PACKED)
440
81
                PB_RETURN_ERROR(stream, "wrong wire type");
441
442
9.86M
            return pb_dec_varint(stream, field);
443
444
81.4k
        case PB_LTYPE_FIXED32:
445
81.4k
            if (wire_type != PB_WT_32BIT && wire_type != PB_WT_PACKED)
446
15
                PB_RETURN_ERROR(stream, "wrong wire type");
447
448
81.4k
            return pb_decode_fixed32(stream, field->pData);
449
450
60.9k
        case PB_LTYPE_FIXED64:
451
60.9k
            if (wire_type != PB_WT_64BIT && wire_type != PB_WT_PACKED)
452
14
                PB_RETURN_ERROR(stream, "wrong wire type");
453
454
#ifdef PB_CONVERT_DOUBLE_FLOAT
455
            if (field->data_size == sizeof(float))
456
            {
457
                return pb_decode_double_as_float(stream, (float*)field->pData);
458
            }
459
#endif
460
461
#ifdef PB_WITHOUT_64BIT
462
            PB_RETURN_ERROR(stream, "invalid data_size");
463
#else
464
60.9k
            return pb_decode_fixed64(stream, field->pData);
465
0
#endif
466
467
664k
        case PB_LTYPE_BYTES:
468
664k
            if (wire_type != PB_WT_STRING)
469
14
                PB_RETURN_ERROR(stream, "wrong wire type");
470
471
664k
            return pb_dec_bytes(stream, field);
472
473
112k
        case PB_LTYPE_STRING:
474
112k
            if (wire_type != PB_WT_STRING)
475
11
                PB_RETURN_ERROR(stream, "wrong wire type");
476
477
112k
            return pb_dec_string(stream, field);
478
479
172k
        case PB_LTYPE_SUBMESSAGE:
480
172k
        case PB_LTYPE_SUBMSG_W_CB:
481
172k
            if (wire_type != PB_WT_STRING)
482
25
                PB_RETURN_ERROR(stream, "wrong wire type");
483
484
172k
            return pb_dec_submessage(stream, field);
485
486
29.6M
        case PB_LTYPE_FIXED_LENGTH_BYTES:
487
29.6M
            if (wire_type != PB_WT_STRING)
488
6
                PB_RETURN_ERROR(stream, "wrong wire type");
489
490
29.6M
            return pb_dec_fixed_length_bytes(stream, field);
491
492
0
        default:
493
0
            PB_RETURN_ERROR(stream, "invalid field type");
494
43.7M
    }
495
43.7M
}
496
497
static bool checkreturn decode_static_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *field)
498
11.8k
{
499
11.8k
    switch (PB_HTYPE(field->type))
500
11.8k
    {
501
3.69k
        case PB_HTYPE_REQUIRED:
502
3.69k
            return decode_basic_field(stream, wire_type, field);
503
            
504
1.23k
        case PB_HTYPE_OPTIONAL:
505
1.23k
            if (field->pSize != NULL)
506
1.23k
                *(bool*)field->pSize = true;
507
1.23k
            return decode_basic_field(stream, wire_type, field);
508
    
509
0
        case PB_HTYPE_REPEATED:
510
0
            if (wire_type == PB_WT_STRING
511
0
                && PB_LTYPE(field->type) <= PB_LTYPE_LAST_PACKABLE)
512
0
            {
513
                /* Packed array */
514
0
                bool status = true;
515
0
                pb_istream_t substream;
516
0
                pb_size_t *size = (pb_size_t*)field->pSize;
517
0
                field->pData = (char*)field->pField + field->data_size * (*size);
518
519
0
                if (!pb_make_string_substream(stream, &substream))
520
0
                    return false;
521
522
0
                while (substream.bytes_left > 0 && *size < field->array_size)
523
0
                {
524
0
                    if (!decode_basic_field(&substream, PB_WT_PACKED, field))
525
0
                    {
526
0
                        status = false;
527
0
                        break;
528
0
                    }
529
0
                    (*size)++;
530
0
                    field->pData = (char*)field->pData + field->data_size;
531
0
                }
532
533
0
                if (substream.bytes_left != 0)
534
0
                    PB_RETURN_ERROR(stream, "array overflow");
535
0
                if (!pb_close_string_substream(stream, &substream))
536
0
                    return false;
537
538
0
                return status;
539
0
            }
540
0
            else
541
0
            {
542
                /* Repeated field */
543
0
                pb_size_t *size = (pb_size_t*)field->pSize;
544
0
                field->pData = (char*)field->pField + field->data_size * (*size);
545
546
0
                if ((*size)++ >= field->array_size)
547
0
                    PB_RETURN_ERROR(stream, "array overflow");
548
549
0
                return decode_basic_field(stream, wire_type, field);
550
0
            }
551
552
6.92k
        case PB_HTYPE_ONEOF:
553
6.92k
            if (PB_LTYPE_IS_SUBMSG(field->type) &&
554
5.53k
                *(pb_size_t*)field->pSize != field->tag)
555
2.84k
            {
556
                /* We memset to zero so that any callbacks are set to NULL.
557
                 * This is because the callbacks might otherwise have values
558
                 * from some other union field.
559
                 * If callbacks are needed inside oneof field, use .proto
560
                 * option submsg_callback to have a separate callback function
561
                 * that can set the fields before submessage is decoded.
562
                 * pb_dec_submessage() will set any default values. */
563
2.84k
                memset(field->pData, 0, (size_t)field->data_size);
564
565
                /* Set default values for the submessage fields. */
566
2.84k
                if (field->submsg_desc->default_value != NULL ||
567
2.84k
                    field->submsg_desc->field_callback != NULL ||
568
2.84k
                    field->submsg_desc->submsg_info[0] != NULL)
569
0
                {
570
0
                    pb_field_iter_t submsg_iter;
571
0
                    if (pb_field_iter_begin(&submsg_iter, field->submsg_desc, field->pData))
572
0
                    {
573
0
                        if (!pb_message_set_to_defaults(&submsg_iter))
574
0
                            PB_RETURN_ERROR(stream, "failed to set defaults");
575
0
                    }
576
0
                }
577
2.84k
            }
578
6.92k
            *(pb_size_t*)field->pSize = field->tag;
579
580
6.92k
            return decode_basic_field(stream, wire_type, field);
581
582
0
        default:
583
0
            PB_RETURN_ERROR(stream, "invalid field type");
584
11.8k
    }
585
11.8k
}
586
587
#ifdef PB_ENABLE_MALLOC
588
/* Allocate storage for the field and store the pointer at iter->pData.
589
 * array_size is the number of entries to reserve in an array.
590
 * Zero size is not allowed, use pb_free() for releasing.
591
 */
592
static bool checkreturn allocate_field(pb_istream_t *stream, void *pData, size_t data_size, size_t array_size)
593
33.5M
{    
594
33.5M
    void *ptr = *(void**)pData;
595
    
596
33.5M
    if (data_size == 0 || array_size == 0)
597
0
        PB_RETURN_ERROR(stream, "invalid size");
598
    
599
#ifdef __AVR__
600
    /* Workaround for AVR libc bug 53284: http://savannah.nongnu.org/bugs/?53284
601
     * Realloc to size of 1 byte can cause corruption of the malloc structures.
602
     */
603
    if (data_size == 1 && array_size == 1)
604
    {
605
        data_size = 2;
606
    }
607
#endif
608
609
    /* Check for multiplication overflows.
610
     * This code avoids the costly division if the sizes are small enough.
611
     * Multiplication is safe as long as only half of bits are set
612
     * in either multiplicand.
613
     */
614
33.5M
    {
615
33.5M
        const size_t check_limit = (size_t)1 << (sizeof(size_t) * 4);
616
33.5M
        if (data_size >= check_limit || array_size >= check_limit)
617
0
        {
618
0
            const size_t size_max = (size_t)-1;
619
0
            if (size_max / array_size < data_size)
620
0
            {
621
0
                PB_RETURN_ERROR(stream, "size too large");
622
0
            }
623
0
        }
624
33.5M
    }
625
    
626
    /* Allocate new or expand previous allocation */
627
    /* Note: on failure the old pointer will remain in the structure,
628
     * the message must be freed by caller also on error return. */
629
33.5M
    ptr = pb_realloc(ptr, array_size * data_size);
630
33.5M
    if (ptr == NULL)
631
0
        PB_RETURN_ERROR(stream, "realloc failed");
632
    
633
33.5M
    *(void**)pData = ptr;
634
33.5M
    return true;
635
33.5M
}
636
637
/* Clear a newly allocated item in case it contains a pointer, or is a submessage. */
638
static void initialize_pointer_field(void *pItem, pb_field_iter_t *field)
639
43.5M
{
640
43.5M
    if (PB_LTYPE(field->type) == PB_LTYPE_STRING ||
641
43.5M
        PB_LTYPE(field->type) == PB_LTYPE_BYTES)
642
669k
    {
643
669k
        *(void**)pItem = NULL;
644
669k
    }
645
42.9M
    else if (PB_LTYPE_IS_SUBMSG(field->type))
646
163k
    {
647
        /* We memset to zero so that any callbacks are set to NULL.
648
         * Default values will be set by pb_dec_submessage(). */
649
163k
        memset(pItem, 0, field->data_size);
650
163k
    }
651
43.5M
}
652
#endif
653
654
static bool checkreturn decode_pointer_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *field)
655
32.0M
{
656
#ifndef PB_ENABLE_MALLOC
657
    PB_UNUSED(wire_type);
658
    PB_UNUSED(field);
659
    PB_RETURN_ERROR(stream, "no malloc support");
660
#else
661
32.0M
    switch (PB_HTYPE(field->type))
662
32.0M
    {
663
1.53M
        case PB_HTYPE_REQUIRED:
664
1.55M
        case PB_HTYPE_OPTIONAL:
665
1.56M
        case PB_HTYPE_ONEOF:
666
1.56M
            if (PB_LTYPE_IS_SUBMSG(field->type) && *(void**)field->pField != NULL)
667
39.4k
            {
668
                /* Duplicate field, have to release the old allocation first. */
669
                /* FIXME: Does this work correctly for oneofs? */
670
39.4k
                pb_release_single_field(field);
671
39.4k
            }
672
        
673
1.56M
            if (PB_HTYPE(field->type) == PB_HTYPE_ONEOF)
674
10.6k
            {
675
10.6k
                *(pb_size_t*)field->pSize = field->tag;
676
10.6k
            }
677
678
1.56M
            if (PB_LTYPE(field->type) == PB_LTYPE_STRING ||
679
1.47M
                PB_LTYPE(field->type) == PB_LTYPE_BYTES)
680
105k
            {
681
                /* pb_dec_string and pb_dec_bytes handle allocation themselves */
682
105k
                field->pData = field->pField;
683
105k
                return decode_basic_field(stream, wire_type, field);
684
105k
            }
685
1.45M
            else
686
1.45M
            {
687
1.45M
                if (!allocate_field(stream, field->pField, field->data_size, 1))
688
0
                    return false;
689
                
690
1.45M
                field->pData = *(void**)field->pField;
691
1.45M
                initialize_pointer_field(field->pData, field);
692
1.45M
                return decode_basic_field(stream, wire_type, field);
693
1.45M
            }
694
    
695
30.4M
        case PB_HTYPE_REPEATED:
696
30.4M
            if (wire_type == PB_WT_STRING
697
30.4M
                && PB_LTYPE(field->type) <= PB_LTYPE_LAST_PACKABLE)
698
88.1k
            {
699
                /* Packed array, multiple items come in at once. */
700
88.1k
                bool status = true;
701
88.1k
                pb_size_t *size = (pb_size_t*)field->pSize;
702
88.1k
                size_t allocated_size = *size;
703
88.1k
                pb_istream_t substream;
704
                
705
88.1k
                if (!pb_make_string_substream(stream, &substream))
706
54
                    return false;
707
                
708
11.8M
                while (substream.bytes_left)
709
11.7M
                {
710
11.7M
                    if (*size == PB_SIZE_MAX)
711
6
                    {
712
6
#ifndef PB_NO_ERRMSG
713
6
                        stream->errmsg = "too many array entries";
714
6
#endif
715
6
                        status = false;
716
6
                        break;
717
6
                    }
718
719
11.7M
                    if ((size_t)*size + 1 > allocated_size)
720
925k
                    {
721
                        /* Allocate more storage. This tries to guess the
722
                         * number of remaining entries. Round the division
723
                         * upwards. */
724
925k
                        size_t remain = (substream.bytes_left - 1) / field->data_size + 1;
725
925k
                        if (remain < PB_SIZE_MAX - allocated_size)
726
251k
                            allocated_size += remain;
727
673k
                        else
728
673k
                            allocated_size += 1;
729
                        
730
925k
                        if (!allocate_field(&substream, field->pField, field->data_size, allocated_size))
731
0
                        {
732
0
                            status = false;
733
0
                            break;
734
0
                        }
735
925k
                    }
736
737
                    /* Decode the array entry */
738
11.7M
                    field->pData = *(char**)field->pField + field->data_size * (*size);
739
11.7M
                    if (field->pData == NULL)
740
0
                    {
741
                        /* Shouldn't happen, but satisfies static analyzers */
742
0
                        status = false;
743
0
                        break;
744
0
                    }
745
11.7M
                    initialize_pointer_field(field->pData, field);
746
11.7M
                    if (!decode_basic_field(&substream, PB_WT_PACKED, field))
747
104
                    {
748
104
                        status = false;
749
104
                        break;
750
104
                    }
751
                    
752
11.7M
                    (*size)++;
753
11.7M
                }
754
88.0k
                if (!pb_close_string_substream(stream, &substream))
755
0
                    return false;
756
                
757
88.0k
                return status;
758
88.0k
            }
759
30.3M
            else
760
30.3M
            {
761
                /* Normal repeated field, i.e. only one item at a time. */
762
30.3M
                pb_size_t *size = (pb_size_t*)field->pSize;
763
764
30.3M
                if (*size == PB_SIZE_MAX)
765
1
                    PB_RETURN_ERROR(stream, "too many array entries");
766
                
767
30.3M
                if (!allocate_field(stream, field->pField, field->data_size, (size_t)(*size + 1)))
768
0
                    return false;
769
            
770
30.3M
                field->pData = *(char**)field->pField + field->data_size * (*size);
771
30.3M
                (*size)++;
772
30.3M
                initialize_pointer_field(field->pData, field);
773
30.3M
                return decode_basic_field(stream, wire_type, field);
774
30.3M
            }
775
776
0
        default:
777
0
            PB_RETURN_ERROR(stream, "invalid field type");
778
32.0M
    }
779
32.0M
#endif
780
32.0M
}
781
782
static bool checkreturn decode_callback_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *field)
783
6.15k
{
784
    /* Clear any data that may have been decoded for another oneof field
785
     * that has come before this callback field.
786
     */
787
6.15k
    if (PB_HTYPE(field->type) == PB_HTYPE_ONEOF)
788
6.15k
    {
789
6.15k
        if (*(pb_size_t*)field->pSize != 0 && *(pb_size_t*)field->pSize != field->tag)
790
2.43k
        {
791
2.43k
            memset(field->pData, 0, (size_t)field->data_size);
792
2.43k
        }
793
6.15k
        *(pb_size_t*)field->pSize = field->tag;
794
6.15k
    }
795
796
6.15k
    if (!field->descriptor->field_callback)
797
0
        return pb_skip_field(stream, wire_type);
798
799
6.15k
    if (wire_type == PB_WT_STRING)
800
1.62k
    {
801
1.62k
        pb_istream_t substream;
802
1.62k
        size_t prev_bytes_left;
803
        
804
1.62k
        if (!pb_make_string_substream(stream, &substream))
805
50
            return false;
806
807
        /* If the callback field is inside a submsg, first call the submsg_callback which
808
         * should set the decoder for the callback field. */
809
1.57k
        if (PB_LTYPE(field->type) == PB_LTYPE_SUBMSG_W_CB && field->pSize != NULL) {
810
0
            pb_callback_t* callback;
811
0
            *(pb_size_t*)field->pSize = field->tag;
812
0
            callback = (pb_callback_t*)field->pSize - 1;
813
814
0
            if (callback->funcs.decode)
815
0
            {
816
0
                if (!callback->funcs.decode(&substream, field, &callback->arg)) {
817
0
                    PB_SET_ERROR(stream, substream.errmsg ? substream.errmsg : "submsg callback failed");
818
0
                    return false;
819
0
                }
820
0
            }
821
0
        }
822
        
823
1.57k
        do
824
1.57k
        {
825
1.57k
            prev_bytes_left = substream.bytes_left;
826
1.57k
            if (!field->descriptor->field_callback(&substream, NULL, field))
827
0
            {
828
0
                PB_SET_ERROR(stream, substream.errmsg ? substream.errmsg : "callback failed");
829
0
                return false;
830
0
            }
831
1.57k
        } while (substream.bytes_left > 0 && substream.bytes_left < prev_bytes_left);
832
        
833
1.57k
        if (!pb_close_string_substream(stream, &substream))
834
0
            return false;
835
836
1.57k
        return true;
837
1.57k
    }
838
4.53k
    else
839
4.53k
    {
840
        /* Copy the single scalar value to stack.
841
         * This is required so that we can limit the stream length,
842
         * which in turn allows to use same callback for packed and
843
         * not-packed fields. */
844
4.53k
        pb_istream_t substream;
845
4.53k
        pb_byte_t buffer[10];
846
4.53k
        size_t size = sizeof(buffer);
847
        
848
4.53k
        if (!read_raw_value(stream, wire_type, buffer, &size))
849
49
            return false;
850
4.48k
        substream = pb_istream_from_buffer(buffer, size);
851
        
852
4.48k
        return field->descriptor->field_callback(&substream, NULL, field);
853
4.53k
    }
854
6.15k
}
855
856
static bool checkreturn decode_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *field)
857
32.0M
{
858
32.0M
#ifdef PB_ENABLE_MALLOC
859
    /* When decoding an oneof field, check if there is old data that must be
860
     * released first. */
861
32.0M
    if (PB_HTYPE(field->type) == PB_HTYPE_ONEOF)
862
23.7k
    {
863
23.7k
        if (!pb_release_union_field(stream, field))
864
0
            return false;
865
23.7k
    }
866
32.0M
#endif
867
868
32.0M
    switch (PB_ATYPE(field->type))
869
32.0M
    {
870
11.8k
        case PB_ATYPE_STATIC:
871
11.8k
            return decode_static_field(stream, wire_type, field);
872
        
873
32.0M
        case PB_ATYPE_POINTER:
874
32.0M
            return decode_pointer_field(stream, wire_type, field);
875
        
876
6.15k
        case PB_ATYPE_CALLBACK:
877
6.15k
            return decode_callback_field(stream, wire_type, field);
878
        
879
0
        default:
880
0
            PB_RETURN_ERROR(stream, "invalid field type");
881
32.0M
    }
882
32.0M
}
883
884
/* Default handler for extension fields. Expects to have a pb_msgdesc_t
885
 * pointer in the extension->type->arg field, pointing to a message with
886
 * only one field in it.  */
887
static bool checkreturn default_extension_decoder(pb_istream_t *stream,
888
    pb_extension_t *extension, uint32_t tag, pb_wire_type_t wire_type)
889
75.3k
{
890
75.3k
    pb_field_iter_t iter;
891
892
75.3k
    if (!pb_field_iter_begin_extension(&iter, extension))
893
0
        PB_RETURN_ERROR(stream, "invalid extension");
894
895
75.3k
    if (iter.tag != tag || !iter.message)
896
71.6k
        return true;
897
898
3.69k
    extension->found = true;
899
3.69k
    return decode_field(stream, wire_type, &iter);
900
75.3k
}
901
902
/* Try to decode an unknown field as an extension field. Tries each extension
903
 * decoder in turn, until one of them handles the field or loop ends. */
904
static bool checkreturn decode_extension(pb_istream_t *stream,
905
    uint32_t tag, pb_wire_type_t wire_type, pb_extension_t *extension)
906
75.3k
{
907
75.3k
    size_t pos = stream->bytes_left;
908
    
909
150k
    while (extension != NULL && pos == stream->bytes_left)
910
75.3k
    {
911
75.3k
        bool status;
912
75.3k
        if (extension->type->decode)
913
0
            status = extension->type->decode(stream, extension, tag, wire_type);
914
75.3k
        else
915
75.3k
            status = default_extension_decoder(stream, extension, tag, wire_type);
916
917
75.3k
        if (!status)
918
110
            return false;
919
        
920
75.2k
        extension = extension->next;
921
75.2k
    }
922
    
923
75.2k
    return true;
924
75.3k
}
925
926
/* Initialize message fields to default values, recursively */
927
static bool pb_field_set_to_default(pb_field_iter_t *field)
928
1.05M
{
929
1.05M
    pb_type_t type;
930
1.05M
    type = field->type;
931
932
1.05M
    if (PB_LTYPE(type) == PB_LTYPE_EXTENSION)
933
8.74k
    {
934
8.74k
        pb_extension_t *ext = *(pb_extension_t* const *)field->pData;
935
15.8k
        while (ext != NULL)
936
7.07k
        {
937
7.07k
            pb_field_iter_t ext_iter;
938
7.07k
            if (pb_field_iter_begin_extension(&ext_iter, ext))
939
7.07k
            {
940
7.07k
                ext->found = false;
941
7.07k
                if (!pb_message_set_to_defaults(&ext_iter))
942
0
                    return false;
943
7.07k
            }
944
7.07k
            ext = ext->next;
945
7.07k
        }
946
8.74k
    }
947
1.04M
    else if (PB_ATYPE(type) == PB_ATYPE_STATIC)
948
33.3k
    {
949
33.3k
        bool init_data = true;
950
33.3k
        if (PB_HTYPE(type) == PB_HTYPE_OPTIONAL && field->pSize != NULL)
951
0
        {
952
            /* Set has_field to false. Still initialize the optional field
953
             * itself also. */
954
0
            *(bool*)field->pSize = false;
955
0
        }
956
33.3k
        else if (PB_HTYPE(type) == PB_HTYPE_REPEATED ||
957
33.3k
                 PB_HTYPE(type) == PB_HTYPE_ONEOF)
958
26.2k
        {
959
            /* REPEATED: Set array count to 0, no need to initialize contents.
960
               ONEOF: Set which_field to 0. */
961
26.2k
            *(pb_size_t*)field->pSize = 0;
962
26.2k
            init_data = false;
963
26.2k
        }
964
965
33.3k
        if (init_data)
966
7.07k
        {
967
7.07k
            if (PB_LTYPE_IS_SUBMSG(field->type) &&
968
7.07k
                (field->submsg_desc->default_value != NULL ||
969
7.07k
                 field->submsg_desc->field_callback != NULL ||
970
7.07k
                 field->submsg_desc->submsg_info[0] != NULL))
971
0
            {
972
                /* Initialize submessage to defaults.
973
                 * Only needed if it has default values
974
                 * or callback/submessage fields. */
975
0
                pb_field_iter_t submsg_iter;
976
0
                if (pb_field_iter_begin(&submsg_iter, field->submsg_desc, field->pData))
977
0
                {
978
0
                    if (!pb_message_set_to_defaults(&submsg_iter))
979
0
                        return false;
980
0
                }
981
0
            }
982
7.07k
            else
983
7.07k
            {
984
                /* Initialize to zeros */
985
7.07k
                memset(field->pData, 0, (size_t)field->data_size);
986
7.07k
            }
987
7.07k
        }
988
33.3k
    }
989
1.01M
    else if (PB_ATYPE(type) == PB_ATYPE_POINTER)
990
995k
    {
991
        /* Initialize the pointer to NULL. */
992
995k
        *(void**)field->pField = NULL;
993
994
        /* Initialize array count to 0. */
995
995k
        if (PB_HTYPE(type) == PB_HTYPE_REPEATED ||
996
811k
            PB_HTYPE(type) == PB_HTYPE_ONEOF)
997
201k
        {
998
201k
            *(pb_size_t*)field->pSize = 0;
999
201k
        }
1000
995k
    }
1001
17.4k
    else if (PB_ATYPE(type) == PB_ATYPE_CALLBACK)
1002
17.4k
    {
1003
        /* Don't overwrite callback */
1004
17.4k
    }
1005
1006
1.05M
    return true;
1007
1.05M
}
1008
1009
static bool pb_message_set_to_defaults(pb_field_iter_t *iter)
1010
120k
{
1011
120k
    pb_istream_t defstream = PB_ISTREAM_EMPTY;
1012
120k
    uint32_t tag = 0;
1013
120k
    pb_wire_type_t wire_type = PB_WT_VARINT;
1014
120k
    bool eof;
1015
1016
120k
    if (iter->descriptor->default_value)
1017
0
    {
1018
0
        defstream = pb_istream_from_buffer(iter->descriptor->default_value, (size_t)-1);
1019
0
        if (!pb_decode_tag(&defstream, &wire_type, &tag, &eof))
1020
0
            return false;
1021
0
    }
1022
1023
120k
    do
1024
1.05M
    {
1025
1.05M
        if (!pb_field_set_to_default(iter))
1026
0
            return false;
1027
1028
1.05M
        if (tag != 0 && iter->tag == tag)
1029
0
        {
1030
            /* We have a default value for this field in the defstream */
1031
0
            if (!decode_field(&defstream, wire_type, iter))
1032
0
                return false;
1033
0
            if (!pb_decode_tag(&defstream, &wire_type, &tag, &eof))
1034
0
                return false;
1035
1036
0
            if (iter->pSize)
1037
0
                *(bool*)iter->pSize = false;
1038
0
        }
1039
1.05M
    } while (pb_field_iter_next(iter));
1040
1041
120k
    return true;
1042
120k
}
1043
1044
/*********************
1045
 * Decode all fields *
1046
 *********************/
1047
1048
static bool checkreturn pb_decode_inner(pb_istream_t *stream, const pb_msgdesc_t *fields, void *dest_struct, unsigned int flags)
1049
181k
{
1050
    /* If the message contains extension fields, the extension handlers
1051
     * are called when tag number is >= extension_range_start. This precheck
1052
     * is just for speed, and the handlers will check for precise match.
1053
     */
1054
181k
    uint32_t extension_range_start = 0;
1055
181k
    pb_extension_t *extensions = NULL;
1056
1057
    /* 'fixed_count_field' and 'fixed_count_size' track position of a repeated fixed
1058
     * count field. This can only handle _one_ repeated fixed count field that
1059
     * is unpacked and unordered among other (non repeated fixed count) fields.
1060
     */
1061
181k
    pb_size_t fixed_count_field = PB_SIZE_MAX;
1062
181k
    pb_size_t fixed_count_size = 0;
1063
181k
    pb_size_t fixed_count_total_size = 0;
1064
1065
    /* Tag and wire type of next field from the input stream */
1066
181k
    uint32_t tag;
1067
181k
    pb_wire_type_t wire_type;
1068
181k
    bool eof;
1069
1070
    /* Track presence of required fields */
1071
181k
    pb_fields_seen_t fields_seen = {{0, 0}};
1072
181k
    const uint32_t allbits = ~(uint32_t)0;
1073
1074
    /* Descriptor for the structure field matching the tag decoded from stream */
1075
181k
    pb_field_iter_t iter;
1076
1077
181k
    if (pb_field_iter_begin(&iter, fields, dest_struct))
1078
122k
    {
1079
122k
        if ((flags & PB_DECODE_NOINIT) == 0)
1080
113k
        {
1081
113k
            if (!pb_message_set_to_defaults(&iter))
1082
0
                PB_RETURN_ERROR(stream, "failed to set defaults");
1083
113k
        }
1084
122k
    }
1085
1086
32.5M
    while (pb_decode_tag(stream, &wire_type, &tag, &eof))
1087
32.3M
    {
1088
32.3M
        if (tag == 0)
1089
71
        {
1090
71
          if (flags & PB_DECODE_NULLTERMINATED)
1091
0
          {
1092
0
            eof = true;
1093
0
            break;
1094
0
          }
1095
71
          else
1096
71
          {
1097
71
            PB_RETURN_ERROR(stream, "zero tag");
1098
71
          }
1099
71
        }
1100
1101
32.3M
        if (!pb_field_iter_find(&iter, tag) || PB_LTYPE(iter.type) == PB_LTYPE_EXTENSION)
1102
312k
        {
1103
            /* No match found, check if it matches an extension. */
1104
312k
            if (extension_range_start == 0)
1105
10.7k
            {
1106
10.7k
                if (pb_field_iter_find_extension(&iter))
1107
4.17k
                {
1108
4.17k
                    extensions = *(pb_extension_t* const *)iter.pData;
1109
4.17k
                    extension_range_start = iter.tag;
1110
4.17k
                }
1111
1112
10.7k
                if (!extensions)
1113
7.31k
                {
1114
7.31k
                    extension_range_start = (uint32_t)-1;
1115
7.31k
                }
1116
10.7k
            }
1117
1118
312k
            if (tag >= extension_range_start)
1119
75.3k
            {
1120
75.3k
                size_t pos = stream->bytes_left;
1121
1122
75.3k
                if (!decode_extension(stream, tag, wire_type, extensions))
1123
110
                    return false;
1124
1125
75.2k
                if (pos != stream->bytes_left)
1126
3.58k
                {
1127
                    /* The field was handled */
1128
3.58k
                    continue;
1129
3.58k
                }
1130
75.2k
            }
1131
1132
            /* No match found, skip data */
1133
308k
            if (!pb_skip_field(stream, wire_type))
1134
336
                return false;
1135
308k
            continue;
1136
308k
        }
1137
1138
        /* If a repeated fixed count field was found, get size from
1139
         * 'fixed_count_field' as there is no counter contained in the struct.
1140
         */
1141
32.0M
        if (PB_HTYPE(iter.type) == PB_HTYPE_REPEATED && iter.pSize == &iter.array_size)
1142
1.27k
        {
1143
1.27k
            if (fixed_count_field != iter.index) {
1144
                /* If the new fixed count field does not match the previous one,
1145
                 * check that the previous one is NULL or that it finished
1146
                 * receiving all the expected data.
1147
                 */
1148
1.00k
                if (fixed_count_field != PB_SIZE_MAX &&
1149
486
                    fixed_count_size != fixed_count_total_size)
1150
3
                {
1151
3
                    PB_RETURN_ERROR(stream, "wrong size for fixed count field");
1152
3
                }
1153
1154
1.00k
                fixed_count_field = iter.index;
1155
1.00k
                fixed_count_size = 0;
1156
1.00k
                fixed_count_total_size = iter.array_size;
1157
1.00k
            }
1158
1159
1.27k
            iter.pSize = &fixed_count_size;
1160
1.27k
        }
1161
1162
32.0M
        if (PB_HTYPE(iter.type) == PB_HTYPE_REQUIRED
1163
1.53M
            && iter.required_field_index < PB_MAX_REQUIRED_FIELDS)
1164
1.53M
        {
1165
1.53M
            uint32_t tmp = ((uint32_t)1 << (iter.required_field_index & 31));
1166
1.53M
            fields_seen.bitfield[iter.required_field_index >> 5] |= tmp;
1167
1.53M
        }
1168
1169
32.0M
        if (!decode_field(stream, wire_type, &iter))
1170
1.50k
            return false;
1171
32.0M
    }
1172
1173
179k
    if (!eof)
1174
106
    {
1175
        /* pb_decode_tag() returned error before end of stream */
1176
106
        return false;
1177
106
    }
1178
1179
    /* Check that all elements of the last decoded fixed count field were present. */
1180
179k
    if (fixed_count_field != PB_SIZE_MAX &&
1181
454
        fixed_count_size != fixed_count_total_size)
1182
46
    {
1183
46
        PB_RETURN_ERROR(stream, "wrong size for fixed count field");
1184
46
    }
1185
1186
    /* Check that all required fields were present. */
1187
179k
    {
1188
179k
        pb_size_t req_field_count = iter.descriptor->required_field_count;
1189
1190
179k
        if (req_field_count > 0)
1191
114k
        {
1192
114k
            pb_size_t i;
1193
1194
114k
            if (req_field_count > PB_MAX_REQUIRED_FIELDS)
1195
0
                req_field_count = PB_MAX_REQUIRED_FIELDS;
1196
1197
            /* Check the whole words */
1198
114k
            for (i = 0; i < (req_field_count >> 5); i++)
1199
0
            {
1200
0
                if (fields_seen.bitfield[i] != allbits)
1201
0
                    PB_RETURN_ERROR(stream, "missing required field");
1202
0
            }
1203
1204
            /* Check the remaining bits (if any) */
1205
114k
            if ((req_field_count & 31) != 0)
1206
114k
            {
1207
114k
                if (fields_seen.bitfield[req_field_count >> 5] !=
1208
114k
                    (allbits >> (uint_least8_t)(32 - (req_field_count & 31))))
1209
481
                {
1210
481
                    PB_RETURN_ERROR(stream, "missing required field");
1211
481
                }
1212
114k
            }
1213
114k
        }
1214
179k
    }
1215
1216
178k
    return true;
1217
179k
}
1218
1219
bool checkreturn pb_decode_ex(pb_istream_t *stream, const pb_msgdesc_t *fields, void *dest_struct, unsigned int flags)
1220
8.74k
{
1221
8.74k
    bool status;
1222
1223
8.74k
    if ((flags & PB_DECODE_DELIMITED) == 0)
1224
8.74k
    {
1225
8.74k
      status = pb_decode_inner(stream, fields, dest_struct, flags);
1226
8.74k
    }
1227
0
    else
1228
0
    {
1229
0
      pb_istream_t substream;
1230
0
      if (!pb_make_string_substream(stream, &substream))
1231
0
        return false;
1232
1233
0
      status = pb_decode_inner(&substream, fields, dest_struct, flags);
1234
1235
0
      if (!pb_close_string_substream(stream, &substream))
1236
0
        status = false;
1237
0
    }
1238
    
1239
8.74k
#ifdef PB_ENABLE_MALLOC
1240
8.74k
    if (!status)
1241
2.31k
        pb_release(fields, dest_struct);
1242
8.74k
#endif
1243
    
1244
8.74k
    return status;
1245
8.74k
}
1246
1247
bool checkreturn pb_decode(pb_istream_t *stream, const pb_msgdesc_t *fields, void *dest_struct)
1248
3.09k
{
1249
3.09k
    return pb_decode_ex(stream, fields, dest_struct, 0);
1250
3.09k
}
1251
1252
#ifdef PB_ENABLE_MALLOC
1253
/* Given an oneof field, if there has already been a field inside this oneof,
1254
 * release it before overwriting with a different one. */
1255
static bool pb_release_union_field(pb_istream_t *stream, pb_field_iter_t *field)
1256
23.7k
{
1257
23.7k
    pb_field_iter_t old_field = *field;
1258
23.7k
    pb_size_t old_tag = *(pb_size_t*)field->pSize; /* Previous which_ value */
1259
23.7k
    pb_size_t new_tag = field->tag; /* New which_ value */
1260
1261
23.7k
    if (old_tag == 0)
1262
1.77k
        return true; /* Ok, no old data in union */
1263
1264
21.9k
    if (old_tag == new_tag)
1265
13.5k
        return true; /* Ok, old data is of same type => merge */
1266
1267
    /* Release old data. The find can fail if the message struct contains
1268
     * invalid data. */
1269
8.43k
    if (!pb_field_iter_find(&old_field, old_tag))
1270
0
        PB_RETURN_ERROR(stream, "invalid union tag");
1271
1272
8.43k
    pb_release_single_field(&old_field);
1273
1274
8.43k
    if (PB_ATYPE(field->type) == PB_ATYPE_POINTER)
1275
2.48k
    {
1276
        /* Initialize the pointer to NULL to make sure it is valid
1277
         * even in case of error return. */
1278
2.48k
        *(void**)field->pField = NULL;
1279
2.48k
        field->pData = NULL;
1280
2.48k
    }
1281
1282
8.43k
    return true;
1283
8.43k
}
1284
1285
static void pb_release_single_field(pb_field_iter_t *field)
1286
1.13M
{
1287
1.13M
    pb_type_t type;
1288
1.13M
    type = field->type;
1289
1290
1.13M
    if (PB_HTYPE(type) == PB_HTYPE_ONEOF)
1291
78.7k
    {
1292
78.7k
        if (*(pb_size_t*)field->pSize != field->tag)
1293
61.0k
            return; /* This is not the current field in the union */
1294
78.7k
    }
1295
1296
    /* Release anything contained inside an extension or submsg.
1297
     * This has to be done even if the submsg itself is statically
1298
     * allocated. */
1299
1.07M
    if (PB_LTYPE(type) == PB_LTYPE_EXTENSION)
1300
8.98k
    {
1301
        /* Release fields from all extensions in the linked list */
1302
8.98k
        pb_extension_t *ext = *(pb_extension_t**)field->pData;
1303
16.2k
        while (ext != NULL)
1304
7.31k
        {
1305
7.31k
            pb_field_iter_t ext_iter;
1306
7.31k
            if (pb_field_iter_begin_extension(&ext_iter, ext))
1307
7.31k
            {
1308
7.31k
                pb_release_single_field(&ext_iter);
1309
7.31k
            }
1310
7.31k
            ext = ext->next;
1311
7.31k
        }
1312
8.98k
    }
1313
1.06M
    else if (PB_LTYPE_IS_SUBMSG(type) && PB_ATYPE(type) != PB_ATYPE_CALLBACK)
1314
133k
    {
1315
        /* Release fields in submessage or submsg array */
1316
133k
        pb_size_t count = 1;
1317
        
1318
133k
        if (PB_ATYPE(type) == PB_ATYPE_POINTER)
1319
123k
        {
1320
123k
            field->pData = *(void**)field->pField;
1321
123k
        }
1322
10.1k
        else
1323
10.1k
        {
1324
10.1k
            field->pData = field->pField;
1325
10.1k
        }
1326
        
1327
133k
        if (PB_HTYPE(type) == PB_HTYPE_REPEATED)
1328
17.9k
        {
1329
17.9k
            count = *(pb_size_t*)field->pSize;
1330
1331
17.9k
            if (PB_ATYPE(type) == PB_ATYPE_STATIC && count > field->array_size)
1332
0
            {
1333
                /* Protect against corrupted _count fields */
1334
0
                count = field->array_size;
1335
0
            }
1336
17.9k
        }
1337
        
1338
133k
        if (field->pData)
1339
88.4k
        {
1340
262k
            for (; count > 0; count--)
1341
173k
            {
1342
173k
                pb_release(field->submsg_desc, field->pData);
1343
173k
                field->pData = (char*)field->pData + field->data_size;
1344
173k
            }
1345
88.4k
        }
1346
133k
    }
1347
    
1348
1.07M
    if (PB_ATYPE(type) == PB_ATYPE_POINTER)
1349
1.04M
    {
1350
1.04M
        if (PB_HTYPE(type) == PB_HTYPE_REPEATED &&
1351
188k
            (PB_LTYPE(type) == PB_LTYPE_STRING ||
1352
179k
             PB_LTYPE(type) == PB_LTYPE_BYTES))
1353
17.9k
        {
1354
            /* Release entries in repeated string or bytes array */
1355
17.9k
            void **pItem = *(void***)field->pField;
1356
17.9k
            pb_size_t count = *(pb_size_t*)field->pSize;
1357
687k
            for (; count > 0; count--)
1358
669k
            {
1359
669k
                pb_free(*pItem);
1360
669k
                *pItem++ = NULL;
1361
669k
            }
1362
17.9k
        }
1363
        
1364
1.04M
        if (PB_HTYPE(type) == PB_HTYPE_REPEATED)
1365
188k
        {
1366
            /* We are going to release the array, so set the size to 0 */
1367
188k
            *(pb_size_t*)field->pSize = 0;
1368
188k
        }
1369
        
1370
        /* Release main pointer */
1371
1.04M
        pb_free(*(void**)field->pField);
1372
1.04M
        *(void**)field->pField = NULL;
1373
1.04M
    }
1374
1.07M
}
1375
1376
void pb_release(const pb_msgdesc_t *fields, void *dest_struct)
1377
182k
{
1378
182k
    pb_field_iter_t iter;
1379
    
1380
182k
    if (!dest_struct)
1381
0
        return; /* Ignore NULL pointers, similar to free() */
1382
1383
182k
    if (!pb_field_iter_begin(&iter, fields, dest_struct))
1384
59.1k
        return; /* Empty message type */
1385
    
1386
123k
    do
1387
1.07M
    {
1388
1.07M
        pb_release_single_field(&iter);
1389
1.07M
    } while (pb_field_iter_next(&iter));
1390
123k
}
1391
#else
1392
void pb_release(const pb_msgdesc_t *fields, void *dest_struct)
1393
{
1394
    /* Nothing to release without PB_ENABLE_MALLOC. */
1395
    PB_UNUSED(fields);
1396
    PB_UNUSED(dest_struct);
1397
}
1398
#endif
1399
1400
/* Field decoders */
1401
1402
bool pb_decode_bool(pb_istream_t *stream, bool *dest)
1403
3.15M
{
1404
3.15M
    uint32_t value;
1405
3.15M
    if (!pb_decode_varint32(stream, &value))
1406
76
        return false;
1407
1408
3.15M
    *(bool*)dest = (value != 0);
1409
3.15M
    return true;
1410
3.15M
}
1411
1412
bool pb_decode_svarint(pb_istream_t *stream, pb_int64_t *dest)
1413
3.69M
{
1414
3.69M
    pb_uint64_t value;
1415
3.69M
    if (!pb_decode_varint(stream, &value))
1416
37
        return false;
1417
    
1418
3.69M
    if (value & 1)
1419
530k
        *dest = (pb_int64_t)(~(value >> 1));
1420
3.16M
    else
1421
3.16M
        *dest = (pb_int64_t)(value >> 1);
1422
    
1423
3.69M
    return true;
1424
3.69M
}
1425
1426
bool pb_decode_fixed32(pb_istream_t *stream, void *dest)
1427
81.4k
{
1428
81.4k
    union {
1429
81.4k
        uint32_t fixed32;
1430
81.4k
        pb_byte_t bytes[4];
1431
81.4k
    } u;
1432
1433
81.4k
    if (!pb_read(stream, u.bytes, 4))
1434
21
        return false;
1435
1436
81.4k
#if defined(PB_LITTLE_ENDIAN_8BIT) && PB_LITTLE_ENDIAN_8BIT == 1
1437
    /* fast path - if we know that we're on little endian, assign directly */
1438
81.4k
    *(uint32_t*)dest = u.fixed32;
1439
#else
1440
    *(uint32_t*)dest = ((uint32_t)u.bytes[0] << 0) |
1441
                       ((uint32_t)u.bytes[1] << 8) |
1442
                       ((uint32_t)u.bytes[2] << 16) |
1443
                       ((uint32_t)u.bytes[3] << 24);
1444
#endif
1445
81.4k
    return true;
1446
81.4k
}
1447
1448
#ifndef PB_WITHOUT_64BIT
1449
bool pb_decode_fixed64(pb_istream_t *stream, void *dest)
1450
60.9k
{
1451
60.9k
    union {
1452
60.9k
        uint64_t fixed64;
1453
60.9k
        pb_byte_t bytes[8];
1454
60.9k
    } u;
1455
1456
60.9k
    if (!pb_read(stream, u.bytes, 8))
1457
19
        return false;
1458
1459
60.9k
#if defined(PB_LITTLE_ENDIAN_8BIT) && PB_LITTLE_ENDIAN_8BIT == 1
1460
    /* fast path - if we know that we're on little endian, assign directly */
1461
60.9k
    *(uint64_t*)dest = u.fixed64;
1462
#else
1463
    *(uint64_t*)dest = ((uint64_t)u.bytes[0] << 0) |
1464
                       ((uint64_t)u.bytes[1] << 8) |
1465
                       ((uint64_t)u.bytes[2] << 16) |
1466
                       ((uint64_t)u.bytes[3] << 24) |
1467
                       ((uint64_t)u.bytes[4] << 32) |
1468
                       ((uint64_t)u.bytes[5] << 40) |
1469
                       ((uint64_t)u.bytes[6] << 48) |
1470
                       ((uint64_t)u.bytes[7] << 56);
1471
#endif
1472
60.9k
    return true;
1473
60.9k
}
1474
#endif
1475
1476
static bool checkreturn pb_dec_bool(pb_istream_t *stream, const pb_field_iter_t *field)
1477
3.15M
{
1478
3.15M
    return pb_decode_bool(stream, (bool*)field->pData);
1479
3.15M
}
1480
1481
static bool checkreturn pb_dec_varint(pb_istream_t *stream, const pb_field_iter_t *field)
1482
9.86M
{
1483
9.86M
    if (PB_LTYPE(field->type) == PB_LTYPE_UVARINT)
1484
856k
    {
1485
856k
        pb_uint64_t value, clamped;
1486
856k
        if (!pb_decode_varint(stream, &value))
1487
48
            return false;
1488
1489
        /* Cast to the proper field size, while checking for overflows */
1490
856k
        if (field->data_size == sizeof(pb_uint64_t))
1491
520k
            clamped = *(pb_uint64_t*)field->pData = value;
1492
335k
        else if (field->data_size == sizeof(uint32_t))
1493
311k
            clamped = *(uint32_t*)field->pData = (uint32_t)value;
1494
23.6k
        else if (field->data_size == sizeof(uint_least16_t))
1495
11.7k
            clamped = *(uint_least16_t*)field->pData = (uint_least16_t)value;
1496
11.9k
        else if (field->data_size == sizeof(uint_least8_t))
1497
11.9k
            clamped = *(uint_least8_t*)field->pData = (uint_least8_t)value;
1498
0
        else
1499
0
            PB_RETURN_ERROR(stream, "invalid data_size");
1500
1501
856k
        if (clamped != value)
1502
113
            PB_RETURN_ERROR(stream, "integer too large");
1503
1504
856k
        return true;
1505
856k
    }
1506
9.00M
    else
1507
9.00M
    {
1508
9.00M
        pb_uint64_t value;
1509
9.00M
        pb_int64_t svalue;
1510
9.00M
        pb_int64_t clamped;
1511
1512
9.00M
        if (PB_LTYPE(field->type) == PB_LTYPE_SVARINT)
1513
3.69M
        {
1514
3.69M
            if (!pb_decode_svarint(stream, &svalue))
1515
37
                return false;
1516
3.69M
        }
1517
5.30M
        else
1518
5.30M
        {
1519
5.30M
            if (!pb_decode_varint(stream, &value))
1520
52
                return false;
1521
1522
            /* See issue 97: Google's C++ protobuf allows negative varint values to
1523
            * be cast as int32_t, instead of the int64_t that should be used when
1524
            * encoding. Nanopb versions before 0.2.5 had a bug in encoding. In order to
1525
            * not break decoding of such messages, we cast <=32 bit fields to
1526
            * int32_t first to get the sign correct.
1527
            */
1528
5.30M
            if (field->data_size == sizeof(pb_int64_t))
1529
684k
                svalue = (pb_int64_t)value;
1530
4.62M
            else
1531
4.62M
                svalue = (int32_t)value;
1532
5.30M
        }
1533
1534
        /* Cast to the proper field size, while checking for overflows */
1535
9.00M
        if (field->data_size == sizeof(pb_int64_t))
1536
4.31M
            clamped = *(pb_int64_t*)field->pData = svalue;
1537
4.68M
        else if (field->data_size == sizeof(int32_t))
1538
4.64M
            clamped = *(int32_t*)field->pData = (int32_t)svalue;
1539
46.9k
        else if (field->data_size == sizeof(int_least16_t))
1540
23.4k
            clamped = *(int_least16_t*)field->pData = (int_least16_t)svalue;
1541
23.5k
        else if (field->data_size == sizeof(int_least8_t))
1542
23.5k
            clamped = *(int_least8_t*)field->pData = (int_least8_t)svalue;
1543
0
        else
1544
0
            PB_RETURN_ERROR(stream, "invalid data_size");
1545
1546
9.00M
        if (clamped != svalue)
1547
87
            PB_RETURN_ERROR(stream, "integer too large");
1548
1549
9.00M
        return true;
1550
9.00M
    }
1551
9.86M
}
1552
1553
static bool checkreturn pb_dec_bytes(pb_istream_t *stream, const pb_field_iter_t *field)
1554
664k
{
1555
664k
    uint32_t size;
1556
664k
    size_t alloc_size;
1557
664k
    pb_bytes_array_t *dest;
1558
    
1559
664k
    if (!pb_decode_varint32(stream, &size))
1560
23
        return false;
1561
    
1562
663k
    if (size > PB_SIZE_MAX)
1563
33
        PB_RETURN_ERROR(stream, "bytes overflow");
1564
    
1565
663k
    alloc_size = PB_BYTES_ARRAY_T_ALLOCSIZE(size);
1566
663k
    if (size > alloc_size)
1567
0
        PB_RETURN_ERROR(stream, "size too large");
1568
    
1569
663k
    if (PB_ATYPE(field->type) == PB_ATYPE_POINTER)
1570
663k
    {
1571
#ifndef PB_ENABLE_MALLOC
1572
        PB_RETURN_ERROR(stream, "no malloc support");
1573
#else
1574
663k
        if (stream->bytes_left < size)
1575
52
            PB_RETURN_ERROR(stream, "end-of-stream");
1576
1577
663k
        if (!allocate_field(stream, field->pData, alloc_size, 1))
1578
0
            return false;
1579
663k
        dest = *(pb_bytes_array_t**)field->pData;
1580
663k
#endif
1581
663k
    }
1582
0
    else
1583
0
    {
1584
0
        if (alloc_size > field->data_size)
1585
0
            PB_RETURN_ERROR(stream, "bytes overflow");
1586
0
        dest = (pb_bytes_array_t*)field->pData;
1587
0
    }
1588
1589
663k
    dest->size = (pb_size_t)size;
1590
663k
    return pb_read(stream, dest->bytes, (size_t)size);
1591
663k
}
1592
1593
static bool checkreturn pb_dec_string(pb_istream_t *stream, const pb_field_iter_t *field)
1594
112k
{
1595
112k
    uint32_t size;
1596
112k
    size_t alloc_size;
1597
112k
    pb_byte_t *dest = (pb_byte_t*)field->pData;
1598
1599
112k
    if (!pb_decode_varint32(stream, &size))
1600
28
        return false;
1601
1602
112k
    if (size == (uint32_t)-1)
1603
3
        PB_RETURN_ERROR(stream, "size too large");
1604
1605
    /* Space for null terminator */
1606
112k
    alloc_size = (size_t)(size + 1);
1607
1608
112k
    if (alloc_size < size)
1609
0
        PB_RETURN_ERROR(stream, "size too large");
1610
1611
112k
    if (PB_ATYPE(field->type) == PB_ATYPE_POINTER)
1612
111k
    {
1613
#ifndef PB_ENABLE_MALLOC
1614
        PB_RETURN_ERROR(stream, "no malloc support");
1615
#else
1616
111k
        if (stream->bytes_left < size)
1617
66
            PB_RETURN_ERROR(stream, "end-of-stream");
1618
1619
111k
        if (!allocate_field(stream, field->pData, alloc_size, 1))
1620
0
            return false;
1621
111k
        dest = *(pb_byte_t**)field->pData;
1622
111k
#endif
1623
111k
    }
1624
1.22k
    else
1625
1.22k
    {
1626
1.22k
        if (alloc_size > field->data_size)
1627
51
            PB_RETURN_ERROR(stream, "string overflow");
1628
1.22k
    }
1629
    
1630
112k
    dest[size] = 0;
1631
1632
112k
    if (!pb_read(stream, dest, (size_t)size))
1633
5
        return false;
1634
1635
#ifdef PB_VALIDATE_UTF8
1636
    if (!pb_validate_utf8((const char*)dest))
1637
        PB_RETURN_ERROR(stream, "invalid utf8");
1638
#endif
1639
1640
112k
    return true;
1641
112k
}
1642
1643
static bool checkreturn pb_dec_submessage(pb_istream_t *stream, const pb_field_iter_t *field)
1644
172k
{
1645
172k
    bool status = true;
1646
172k
    bool submsg_consumed = false;
1647
172k
    pb_istream_t substream;
1648
1649
172k
    if (!pb_make_string_substream(stream, &substream))
1650
137
        return false;
1651
    
1652
172k
    if (field->submsg_desc == NULL)
1653
0
        PB_RETURN_ERROR(stream, "invalid field descriptor");
1654
    
1655
    /* Submessages can have a separate message-level callback that is called
1656
     * before decoding the message. Typically it is used to set callback fields
1657
     * inside oneofs. */
1658
172k
    if (PB_LTYPE(field->type) == PB_LTYPE_SUBMSG_W_CB && field->pSize != NULL)
1659
0
    {
1660
        /* Message callback is stored right before pSize. */
1661
0
        pb_callback_t *callback = (pb_callback_t*)field->pSize - 1;
1662
0
        if (callback->funcs.decode)
1663
0
        {
1664
0
            status = callback->funcs.decode(&substream, field, &callback->arg);
1665
1666
0
            if (substream.bytes_left == 0)
1667
0
            {
1668
0
                submsg_consumed = true;
1669
0
            }
1670
0
        }
1671
0
    }
1672
1673
    /* Now decode the submessage contents */
1674
172k
    if (status && !submsg_consumed)
1675
172k
    {
1676
172k
        unsigned int flags = 0;
1677
1678
        /* Static required/optional fields are already initialized by top-level
1679
         * pb_decode(), no need to initialize them again. */
1680
172k
        if (PB_ATYPE(field->type) == PB_ATYPE_STATIC &&
1681
9.16k
            PB_HTYPE(field->type) != PB_HTYPE_REPEATED)
1682
9.16k
        {
1683
9.16k
            flags = PB_DECODE_NOINIT;
1684
9.16k
        }
1685
1686
172k
        status = pb_decode_inner(&substream, field->submsg_desc, field->pData, flags);
1687
172k
    }
1688
    
1689
172k
    if (!pb_close_string_substream(stream, &substream))
1690
0
        return false;
1691
1692
172k
    return status;
1693
172k
}
1694
1695
static bool checkreturn pb_dec_fixed_length_bytes(pb_istream_t *stream, const pb_field_iter_t *field)
1696
29.6M
{
1697
29.6M
    uint32_t size;
1698
1699
29.6M
    if (!pb_decode_varint32(stream, &size))
1700
3
        return false;
1701
1702
29.6M
    if (size > PB_SIZE_MAX)
1703
31
        PB_RETURN_ERROR(stream, "bytes overflow");
1704
1705
29.6M
    if (size == 0)
1706
28.5M
    {
1707
        /* As a special case, treat empty bytes string as all zeros for fixed_length_bytes. */
1708
28.5M
        memset(field->pData, 0, (size_t)field->data_size);
1709
28.5M
        return true;
1710
28.5M
    }
1711
1712
1.09M
    if (size != field->data_size)
1713
47
        PB_RETURN_ERROR(stream, "incorrect fixed length bytes size");
1714
1715
1.09M
    return pb_read(stream, (pb_byte_t*)field->pData, (size_t)field->data_size);
1716
1.09M
}
1717
1718
#ifdef PB_CONVERT_DOUBLE_FLOAT
1719
bool pb_decode_double_as_float(pb_istream_t *stream, float *dest)
1720
{
1721
    uint_least8_t sign;
1722
    int exponent;
1723
    uint32_t mantissa;
1724
    uint64_t value;
1725
    union { float f; uint32_t i; } out;
1726
1727
    if (!pb_decode_fixed64(stream, &value))
1728
        return false;
1729
1730
    /* Decompose input value */
1731
    sign = (uint_least8_t)((value >> 63) & 1);
1732
    exponent = (int)((value >> 52) & 0x7FF) - 1023;
1733
    mantissa = (value >> 28) & 0xFFFFFF; /* Highest 24 bits */
1734
1735
    /* Figure if value is in range representable by floats. */
1736
    if (exponent == 1024)
1737
    {
1738
        /* Special value */
1739
        exponent = 128;
1740
        mantissa >>= 1;
1741
        /* Preserve NaN if its payload was lost when narrowing the mantissa. */
1742
        if (mantissa == 0 && (uint32_t)value != 0)
1743
            mantissa = 1;
1744
    }
1745
    else
1746
    {
1747
        if (exponent > 127)
1748
        {
1749
            /* Too large, convert to infinity */
1750
            exponent = 128;
1751
            mantissa = 0;
1752
        }
1753
        else if (exponent < -150)
1754
        {
1755
            /* Too small, convert to zero */
1756
            exponent = -127;
1757
            mantissa = 0;
1758
        }
1759
        else if (exponent < -126)
1760
        {
1761
            /* Denormalized */
1762
            mantissa |= 0x1000000;
1763
            mantissa >>= (-126 - exponent);
1764
            exponent = -127;
1765
        }
1766
1767
        /* Round off mantissa */
1768
        mantissa = (mantissa + 1) >> 1;
1769
1770
        /* Check if mantissa went over 2.0 */
1771
        if (mantissa & 0x800000)
1772
        {
1773
            exponent += 1;
1774
            mantissa &= 0x7FFFFF;
1775
            mantissa >>= 1;
1776
        }
1777
    }
1778
1779
    /* Combine fields */
1780
    out.i = mantissa;
1781
    out.i |= (uint32_t)(exponent + 127) << 23;
1782
    out.i |= (uint32_t)sign << 31;
1783
1784
    *dest = out.f;
1785
    return true;
1786
}
1787
#endif