Beginnings of malloc support in pb_decode
[apps/agl-service-can-low-level.git] / pb_decode.c
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 and gcc before 3.4.0 just
8  * ignore the annotation.
9  */
10 #if !defined(__GNUC__) || ( __GNUC__ < 3) || (__GNUC__ == 3 && __GNUC_MINOR__ < 4)
11     #define checkreturn
12 #else
13     #define checkreturn __attribute__((warn_unused_result))
14 #endif
15
16 #define NANOPB_INTERNALS
17 #include "pb.h"
18 #include "pb_decode.h"
19
20 /**************************************
21  * Declarations internal to this file *
22  **************************************/
23
24 /* Iterator for pb_field_t list */
25 typedef struct {
26     const pb_field_t *start; /* Start of the pb_field_t array */
27     const pb_field_t *pos; /* Current position of the iterator */
28     unsigned field_index; /* Zero-based index of the field. */
29     unsigned required_field_index; /* Zero-based index that counts only the required fields */
30     void *dest_struct; /* Pointer to the destination structure to decode to */
31     void *pData; /* Pointer where to store current field value */
32     void *pSize; /* Pointer where to store the size of current array field */
33 } pb_field_iterator_t;
34
35 typedef bool (*pb_decoder_t)(pb_istream_t *stream, const pb_field_t *field, void *dest) checkreturn;
36
37 static bool checkreturn buf_read(pb_istream_t *stream, uint8_t *buf, size_t count);
38 static bool checkreturn pb_decode_varint32(pb_istream_t *stream, uint32_t *dest);
39 static bool checkreturn read_raw_value(pb_istream_t *stream, pb_wire_type_t wire_type, uint8_t *buf, size_t *size);
40 static void pb_field_init(pb_field_iterator_t *iter, const pb_field_t *fields, void *dest_struct);
41 static bool pb_field_next(pb_field_iterator_t *iter);
42 static bool checkreturn pb_field_find(pb_field_iterator_t *iter, uint32_t tag);
43 static bool checkreturn decode_static_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iterator_t *iter);
44 static bool checkreturn decode_callback_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iterator_t *iter);
45 static bool checkreturn decode_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iterator_t *iter);
46 static bool checkreturn default_extension_decoder(pb_istream_t *stream, pb_extension_t *extension, uint32_t tag, pb_wire_type_t wire_type);
47 static bool checkreturn decode_extension(pb_istream_t *stream, uint32_t tag, pb_wire_type_t wire_type, pb_field_iterator_t *iter);
48 static bool checkreturn find_extension_field(pb_field_iterator_t *iter);
49 static void pb_message_set_to_defaults(const pb_field_t fields[], void *dest_struct);
50 static bool checkreturn pb_dec_varint(pb_istream_t *stream, const pb_field_t *field, void *dest);
51 static bool checkreturn pb_dec_uvarint(pb_istream_t *stream, const pb_field_t *field, void *dest);
52 static bool checkreturn pb_dec_svarint(pb_istream_t *stream, const pb_field_t *field, void *dest);
53 static bool checkreturn pb_dec_fixed32(pb_istream_t *stream, const pb_field_t *field, void *dest);
54 static bool checkreturn pb_dec_fixed64(pb_istream_t *stream, const pb_field_t *field, void *dest);
55 static bool checkreturn pb_dec_bytes(pb_istream_t *stream, const pb_field_t *field, void *dest);
56 static bool checkreturn pb_dec_string(pb_istream_t *stream, const pb_field_t *field, void *dest);
57 static bool checkreturn pb_dec_submessage(pb_istream_t *stream, const pb_field_t *field, void *dest);
58 static bool checkreturn pb_skip_varint(pb_istream_t *stream);
59 static bool checkreturn pb_skip_string(pb_istream_t *stream);
60
61 /* --- Function pointers to field decoders ---
62  * Order in the array must match pb_action_t LTYPE numbering.
63  */
64 static const pb_decoder_t PB_DECODERS[PB_LTYPES_COUNT] = {
65     &pb_dec_varint,
66     &pb_dec_uvarint,
67     &pb_dec_svarint,
68     &pb_dec_fixed32,
69     &pb_dec_fixed64,
70     
71     &pb_dec_bytes,
72     &pb_dec_string,
73     &pb_dec_submessage,
74     NULL /* extensions */
75 };
76
77 /*******************************
78  * pb_istream_t implementation *
79  *******************************/
80
81 static bool checkreturn buf_read(pb_istream_t *stream, uint8_t *buf, size_t count)
82 {
83     uint8_t *source = (uint8_t*)stream->state;
84     stream->state = source + count;
85     
86     if (buf != NULL)
87     {
88         while (count--)
89             *buf++ = *source++;
90     }
91     
92     return true;
93 }
94
95 bool checkreturn pb_read(pb_istream_t *stream, uint8_t *buf, size_t count)
96 {
97 #ifndef PB_BUFFER_ONLY
98         if (buf == NULL && stream->callback != buf_read)
99         {
100                 /* Skip input bytes */
101                 uint8_t tmp[16];
102                 while (count > 16)
103                 {
104                         if (!pb_read(stream, tmp, 16))
105                                 return false;
106                         
107                         count -= 16;
108                 }
109                 
110                 return pb_read(stream, tmp, count);
111         }
112 #endif
113
114     if (stream->bytes_left < count)
115         PB_RETURN_ERROR(stream, "end-of-stream");
116     
117 #ifndef PB_BUFFER_ONLY
118     if (!stream->callback(stream, buf, count))
119         PB_RETURN_ERROR(stream, "io error");
120 #else
121     if (!buf_read(stream, buf, count))
122         return false;
123 #endif
124     
125     stream->bytes_left -= count;
126     return true;
127 }
128
129 /* Read a single byte from input stream. buf may not be NULL.
130  * This is an optimization for the varint decoding. */
131 static bool checkreturn pb_readbyte(pb_istream_t *stream, uint8_t *buf)
132 {
133     if (!stream->bytes_left)
134         PB_RETURN_ERROR(stream, "end-of-stream");
135
136 #ifndef PB_BUFFER_ONLY
137     if (!stream->callback(stream, buf, 1))
138         PB_RETURN_ERROR(stream, "io error");
139 #else
140     *buf = *(uint8_t*)stream->state;
141     stream->state = (uint8_t*)stream->state + 1;
142 #endif
143
144     stream->bytes_left--;
145     
146     return true;    
147 }
148
149 pb_istream_t pb_istream_from_buffer(uint8_t *buf, size_t bufsize)
150 {
151     pb_istream_t stream;
152 #ifdef PB_BUFFER_ONLY
153     stream.callback = NULL;
154 #else
155     stream.callback = &buf_read;
156 #endif
157     stream.state = buf;
158     stream.bytes_left = bufsize;
159 #ifndef PB_NO_ERRMSG
160     stream.errmsg = NULL;
161 #endif
162     return stream;
163 }
164
165 /********************
166  * Helper functions *
167  ********************/
168
169 static bool checkreturn pb_decode_varint32(pb_istream_t *stream, uint32_t *dest)
170 {
171     uint8_t byte;
172     uint32_t result;
173     
174     if (!pb_readbyte(stream, &byte))
175         return false;
176     
177     if (!(byte & 0x80))
178     {
179         /* Quick case, 1 byte value */
180         result = byte;
181     }
182     else
183     {
184         /* Multibyte case */
185         uint8_t bitpos = 7;
186         result = byte & 0x7F;
187         
188         do
189         {
190             if (bitpos >= 32)
191                 PB_RETURN_ERROR(stream, "varint overflow");
192             
193             if (!pb_readbyte(stream, &byte))
194                 return false;
195             
196             result |= (uint32_t)(byte & 0x7F) << bitpos;
197             bitpos = (uint8_t)(bitpos + 7);
198         } while (byte & 0x80);
199    }
200    
201    *dest = result;
202    return true;
203 }
204
205 bool checkreturn pb_decode_varint(pb_istream_t *stream, uint64_t *dest)
206 {
207     uint8_t byte;
208     uint8_t bitpos = 0;
209     uint64_t result = 0;
210     
211     do
212     {
213         if (bitpos >= 64)
214             PB_RETURN_ERROR(stream, "varint overflow");
215         
216         if (!pb_readbyte(stream, &byte))
217             return false;
218
219         result |= (uint64_t)(byte & 0x7F) << bitpos;
220         bitpos = (uint8_t)(bitpos + 7);
221     } while (byte & 0x80);
222     
223     *dest = result;
224     return true;
225 }
226
227 bool checkreturn pb_skip_varint(pb_istream_t *stream)
228 {
229     uint8_t byte;
230     do
231     {
232         if (!pb_read(stream, &byte, 1))
233             return false;
234     } while (byte & 0x80);
235     return true;
236 }
237
238 bool checkreturn pb_skip_string(pb_istream_t *stream)
239 {
240     uint32_t length;
241     if (!pb_decode_varint32(stream, &length))
242         return false;
243     
244     return pb_read(stream, NULL, length);
245 }
246
247 bool checkreturn pb_decode_tag(pb_istream_t *stream, pb_wire_type_t *wire_type, uint32_t *tag, bool *eof)
248 {
249     uint32_t temp;
250     *eof = false;
251     *wire_type = (pb_wire_type_t) 0;
252     *tag = 0;
253     
254     if (!pb_decode_varint32(stream, &temp))
255     {
256         if (stream->bytes_left == 0)
257             *eof = true;
258
259         return false;
260     }
261     
262     if (temp == 0)
263     {
264         *eof = true; /* Special feature: allow 0-terminated messages. */
265         return false;
266     }
267     
268     *tag = temp >> 3;
269     *wire_type = (pb_wire_type_t)(temp & 7);
270     return true;
271 }
272
273 bool checkreturn pb_skip_field(pb_istream_t *stream, pb_wire_type_t wire_type)
274 {
275     switch (wire_type)
276     {
277         case PB_WT_VARINT: return pb_skip_varint(stream);
278         case PB_WT_64BIT: return pb_read(stream, NULL, 8);
279         case PB_WT_STRING: return pb_skip_string(stream);
280         case PB_WT_32BIT: return pb_read(stream, NULL, 4);
281         default: PB_RETURN_ERROR(stream, "invalid wire_type");
282     }
283 }
284
285 /* Read a raw value to buffer, for the purpose of passing it to callback as
286  * a substream. Size is maximum size on call, and actual size on return.
287  */
288 static bool checkreturn read_raw_value(pb_istream_t *stream, pb_wire_type_t wire_type, uint8_t *buf, size_t *size)
289 {
290     size_t max_size = *size;
291     switch (wire_type)
292     {
293         case PB_WT_VARINT:
294             *size = 0;
295             do
296             {
297                 (*size)++;
298                 if (*size > max_size) return false;
299                 if (!pb_read(stream, buf, 1)) return false;
300             } while (*buf++ & 0x80);
301             return true;
302             
303         case PB_WT_64BIT:
304             *size = 8;
305             return pb_read(stream, buf, 8);
306         
307         case PB_WT_32BIT:
308             *size = 4;
309             return pb_read(stream, buf, 4);
310         
311         default: PB_RETURN_ERROR(stream, "invalid wire_type");
312     }
313 }
314
315 /* Decode string length from stream and return a substream with limited length.
316  * Remember to close the substream using pb_close_string_substream().
317  */
318 bool checkreturn pb_make_string_substream(pb_istream_t *stream, pb_istream_t *substream)
319 {
320     uint32_t size;
321     if (!pb_decode_varint32(stream, &size))
322         return false;
323     
324     *substream = *stream;
325     if (substream->bytes_left < size)
326         PB_RETURN_ERROR(stream, "parent stream too short");
327     
328     substream->bytes_left = size;
329     stream->bytes_left -= size;
330     return true;
331 }
332
333 void pb_close_string_substream(pb_istream_t *stream, pb_istream_t *substream)
334 {
335     stream->state = substream->state;
336
337 #ifndef PB_NO_ERRMSG
338     stream->errmsg = substream->errmsg;
339 #endif
340 }
341
342 static void pb_field_init(pb_field_iterator_t *iter, const pb_field_t *fields, void *dest_struct)
343 {
344     iter->start = iter->pos = fields;
345     iter->field_index = 0;
346     iter->required_field_index = 0;
347     iter->pData = (char*)dest_struct + iter->pos->data_offset;
348     iter->pSize = (char*)iter->pData + iter->pos->size_offset;
349     iter->dest_struct = dest_struct;
350 }
351
352 static bool pb_field_next(pb_field_iterator_t *iter)
353 {
354     bool notwrapped = true;
355     size_t prev_size = iter->pos->data_size;
356     
357     if (PB_ATYPE(iter->pos->type) == PB_ATYPE_STATIC &&
358         PB_HTYPE(iter->pos->type) == PB_HTYPE_REPEATED)
359     {
360         prev_size *= iter->pos->array_size;
361     }
362     
363     if (iter->pos->tag == 0)
364         return false; /* Only happens with empty message types */
365     
366     if (PB_HTYPE(iter->pos->type) == PB_HTYPE_REQUIRED)
367         iter->required_field_index++;
368     
369     iter->pos++;
370     iter->field_index++;
371     if (iter->pos->tag == 0)
372     {
373         iter->pos = iter->start;
374         iter->field_index = 0;
375         iter->required_field_index = 0;
376         iter->pData = iter->dest_struct;
377         prev_size = 0;
378         notwrapped = false;
379     }
380     
381     iter->pData = (char*)iter->pData + prev_size + iter->pos->data_offset;
382     iter->pSize = (char*)iter->pData + iter->pos->size_offset;
383     return notwrapped;
384 }
385
386 static bool checkreturn pb_field_find(pb_field_iterator_t *iter, uint32_t tag)
387 {
388     unsigned start = iter->field_index;
389     
390     do {
391         if (iter->pos->tag == tag &&
392             PB_LTYPE(iter->pos->type) != PB_LTYPE_EXTENSION)
393         {
394             return true;
395         }
396         pb_field_next(iter);
397     } while (iter->field_index != start);
398     
399     return false;
400 }
401
402 /*************************
403  * Decode a single field *
404  *************************/
405
406 static bool checkreturn decode_static_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iterator_t *iter)
407 {
408     pb_type_t type;
409     pb_decoder_t func;
410     
411     type = iter->pos->type;
412     func = PB_DECODERS[PB_LTYPE(type)];
413
414     switch (PB_HTYPE(type))
415     {
416         case PB_HTYPE_REQUIRED:
417             return func(stream, iter->pos, iter->pData);
418             
419         case PB_HTYPE_OPTIONAL:
420             *(bool*)iter->pSize = true;
421             return func(stream, iter->pos, iter->pData);
422     
423         case PB_HTYPE_REPEATED:
424             if (wire_type == PB_WT_STRING
425                 && PB_LTYPE(type) <= PB_LTYPE_LAST_PACKABLE)
426             {
427                 /* Packed array */
428                 bool status = true;
429                 size_t *size = (size_t*)iter->pSize;
430                 pb_istream_t substream;
431                 if (!pb_make_string_substream(stream, &substream))
432                     return false;
433                 
434                 while (substream.bytes_left && *size < iter->pos->array_size)
435                 {
436                     void *pItem = (uint8_t*)iter->pData + iter->pos->data_size * (*size);
437                     if (!func(&substream, iter->pos, pItem))
438                     {
439                         status = false;
440                         break;
441                     }
442                     (*size)++;
443                 }
444                 pb_close_string_substream(stream, &substream);
445                 
446                 if (substream.bytes_left != 0)
447                     PB_RETURN_ERROR(stream, "array overflow");
448                 
449                 return status;
450             }
451             else
452             {
453                 /* Repeated field */
454                 size_t *size = (size_t*)iter->pSize;
455                 void *pItem = (uint8_t*)iter->pData + iter->pos->data_size * (*size);
456                 if (*size >= iter->pos->array_size)
457                     PB_RETURN_ERROR(stream, "array overflow");
458                 
459                 (*size)++;
460                 return func(stream, iter->pos, pItem);
461             }
462
463         default:
464             PB_RETURN_ERROR(stream, "invalid field type");
465     }
466 }
467
468 #ifdef PB_ENABLE_MALLOC
469 /* Allocate storage for the field and store the pointer at iter->pData.
470  * array_size is the number of entries to reserve in an array. */
471 static bool checkreturn allocate_field(pb_istream_t *stream, pb_field_iterator_t *iter, size_t array_size)
472 {    
473     void *ptr = *(void**)iter->pData;
474     size_t size = array_size * iter->pos->data_size;
475     
476     if (ptr == NULL)
477     {
478         /* First allocation */
479         ptr = malloc(size);
480         if (ptr == NULL)
481             PB_RETURN_ERROR(stream, "malloc failed");
482     }
483     else
484     {
485         /* Expand previous allocation */
486         /* Note: on failure the old pointer will remain in the structure,
487          * the message must be freed by caller also on error return. */
488         ptr = realloc(ptr, size);
489         if (ptr == NULL)
490             PB_RETURN_ERROR(stream, "realloc failed");
491     }
492     
493     *(void**)iter->pData = ptr;
494     return true;
495 }
496 #endif
497
498 static bool checkreturn decode_pointer_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iterator_t *iter)
499 {
500 #ifndef PB_ENABLE_MALLOC
501     UNUSED(wire_type);
502     UNUSED(iter);
503     PB_RETURN_ERROR(stream, "no malloc support");
504 #else
505     pb_type_t type;
506     pb_decoder_t func;
507     
508     type = iter->pos->type;
509     func = PB_DECODERS[PB_LTYPE(type)];
510     
511     switch (PB_HTYPE(type))
512     {
513         case PB_HTYPE_REQUIRED:
514         case PB_HTYPE_OPTIONAL:
515             if (!allocate_field(stream, iter, 1))
516                 return false;
517             return func(stream, iter->pos, iter->pData);
518     
519         case PB_HTYPE_REPEATED:
520             if (wire_type == PB_WT_STRING
521                 && PB_LTYPE(type) <= PB_LTYPE_LAST_PACKABLE)
522             {
523                 /* Packed array, multiple items come in at once. */
524                 bool status = true;
525                 size_t *size = (size_t*)iter->pSize;
526                 size_t allocated_size = *size;
527                 void *pItem;
528                 pb_istream_t substream;
529                 
530                 if (!pb_make_string_substream(stream, &substream))
531                     return false;
532                 
533                 while (substream.bytes_left)
534                 {
535                     if (*size + 1 > allocated_size)
536                     {
537                         /* Allocate more storage. This tries to guess the
538                          * number of remaining entries. */
539                         allocated_size += substream.bytes_left / iter->pos->data_size;
540                         if (*size + 1 > allocated_size)
541                             allocated_size++; /* Division gave zero. */
542                         
543                         if (!allocate_field(&substream, iter, allocated_size))
544                         {
545                             status = false;
546                             break;
547                         }
548
549                         /* Decode the array entry */
550                         pItem = (uint8_t*)iter->pData + iter->pos->data_size * (*size);
551                         if (!func(&substream, iter->pos, pItem))
552                         {
553                             status = false;
554                             break;
555                         }
556                         (*size)++;
557                     }
558                 }
559                 pb_close_string_substream(stream, &substream);
560                 
561                 return status;
562             }
563             else
564             {
565                 /* Normal repeated field, i.e. only one item at a time. */
566                 size_t *size = (size_t*)iter->pSize;
567                 void *pItem = (uint8_t*)iter->pData + iter->pos->data_size * (*size);
568                 
569                 if (!allocate_field(stream, iter, *size + 1))
570                     return false;
571             
572                 
573                 (*size)++;
574                 return func(stream, iter->pos, pItem);
575             }
576             
577         default:
578             PB_RETURN_ERROR(stream, "invalid field type");
579     }
580 #endif
581 }
582
583 static bool checkreturn decode_callback_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iterator_t *iter)
584 {
585     pb_callback_t *pCallback = (pb_callback_t*)iter->pData;
586     
587 #ifdef PB_OLD_CALLBACK_STYLE
588     void *arg = pCallback->arg;
589 #else
590     void **arg = &(pCallback->arg);
591 #endif
592     
593     if (pCallback->funcs.decode == NULL)
594         return pb_skip_field(stream, wire_type);
595     
596     if (wire_type == PB_WT_STRING)
597     {
598         pb_istream_t substream;
599         
600         if (!pb_make_string_substream(stream, &substream))
601             return false;
602         
603         do
604         {
605             if (!pCallback->funcs.decode(&substream, iter->pos, arg))
606                 PB_RETURN_ERROR(stream, "callback failed");
607         } while (substream.bytes_left);
608         
609         pb_close_string_substream(stream, &substream);
610         return true;
611     }
612     else
613     {
614         /* Copy the single scalar value to stack.
615          * This is required so that we can limit the stream length,
616          * which in turn allows to use same callback for packed and
617          * not-packed fields. */
618         pb_istream_t substream;
619         uint8_t buffer[10];
620         size_t size = sizeof(buffer);
621         
622         if (!read_raw_value(stream, wire_type, buffer, &size))
623             return false;
624         substream = pb_istream_from_buffer(buffer, size);
625         
626         return pCallback->funcs.decode(&substream, iter->pos, arg);
627     }
628 }
629
630 static bool checkreturn decode_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iterator_t *iter)
631 {
632     switch (PB_ATYPE(iter->pos->type))
633     {
634         case PB_ATYPE_STATIC:
635             return decode_static_field(stream, wire_type, iter);
636         
637         case PB_ATYPE_POINTER:
638             return decode_pointer_field(stream, wire_type, iter);
639         
640         case PB_ATYPE_CALLBACK:
641             return decode_callback_field(stream, wire_type, iter);
642         
643         default:
644             PB_RETURN_ERROR(stream, "invalid field type");
645     }
646 }
647
648 /* Default handler for extension fields. Expects a pb_field_t structure
649  * in extension->type->arg. */
650 static bool checkreturn default_extension_decoder(pb_istream_t *stream,
651     pb_extension_t *extension, uint32_t tag, pb_wire_type_t wire_type)
652 {
653     const pb_field_t *field = (const pb_field_t*)extension->type->arg;
654     pb_field_iterator_t iter;
655     bool dummy;
656     
657     if (field->tag != tag)
658         return true;
659     
660     iter.start = field;
661     iter.pos = field;
662     iter.field_index = 0;
663     iter.required_field_index = 0;
664     iter.dest_struct = extension->dest;
665     iter.pData = extension->dest;
666     iter.pSize = &dummy;
667     
668     return decode_field(stream, wire_type, &iter);
669 }
670
671 /* Try to decode an unknown field as an extension field. Tries each extension
672  * decoder in turn, until one of them handles the field or loop ends. */
673 static bool checkreturn decode_extension(pb_istream_t *stream,
674     uint32_t tag, pb_wire_type_t wire_type, pb_field_iterator_t *iter)
675 {
676     pb_extension_t *extension = *(pb_extension_t* const *)iter->pData;
677     size_t pos = stream->bytes_left;
678     
679     while (extension && pos == stream->bytes_left)
680     {
681         bool status;
682         if (extension->type->decode)
683             status = extension->type->decode(stream, extension, tag, wire_type);
684         else
685             status = default_extension_decoder(stream, extension, tag, wire_type);
686
687         if (!status)
688             return false;
689         
690         extension = extension->next;
691     }
692     
693     return true;
694 }
695
696 /* Step through the iterator until an extension field is found or until all
697  * entries have been checked. There can be only one extension field per
698  * message. Returns false if no extension field is found. */
699 static bool checkreturn find_extension_field(pb_field_iterator_t *iter)
700 {
701     unsigned start = iter->field_index;
702     
703     do {
704         if (PB_LTYPE(iter->pos->type) == PB_LTYPE_EXTENSION)
705             return true;
706         pb_field_next(iter);
707     } while (iter->field_index != start);
708     
709     return false;
710 }
711
712 /* Initialize message fields to default values, recursively */
713 static void pb_message_set_to_defaults(const pb_field_t fields[], void *dest_struct)
714 {
715     pb_field_iterator_t iter;
716     pb_field_init(&iter, fields, dest_struct);
717     
718     do
719     {
720         pb_type_t type;
721         type = iter.pos->type;
722     
723         /* Avoid crash on empty message types (zero fields) */
724         if (iter.pos->tag == 0)
725             continue;
726         
727         if (PB_ATYPE(type) == PB_ATYPE_STATIC)
728         {
729             if (PB_HTYPE(type) == PB_HTYPE_OPTIONAL)
730             {
731                 /* Set has_field to false. Still initialize the optional field
732                  * itself also. */
733                 *(bool*)iter.pSize = false;
734             }
735             else if (PB_HTYPE(type) == PB_HTYPE_REPEATED)
736             {
737                 /* Set array count to 0, no need to initialize contents. */
738                 *(size_t*)iter.pSize = 0;
739                 continue;
740             }
741             
742             if (PB_LTYPE(iter.pos->type) == PB_LTYPE_SUBMESSAGE)
743             {
744                 /* Initialize submessage to defaults */
745                 pb_message_set_to_defaults((const pb_field_t *) iter.pos->ptr, iter.pData);
746             }
747             else if (iter.pos->ptr != NULL)
748             {
749                 /* Initialize to default value */
750                 memcpy(iter.pData, iter.pos->ptr, iter.pos->data_size);
751             }
752             else
753             {
754                 /* Initialize to zeros */
755                 memset(iter.pData, 0, iter.pos->data_size);
756             }
757         }
758         else if (PB_ATYPE(type) == PB_ATYPE_POINTER)
759         {
760             /* Initialize the pointer to NULL. */
761             *(void**)iter.pData = NULL;
762             
763             /* Initialize array count to 0. */
764             if (PB_HTYPE(type) == PB_HTYPE_REPEATED)
765             {
766                 *(size_t*)iter.pSize = 0;
767             }
768         }
769         else if (PB_ATYPE(type) == PB_ATYPE_CALLBACK)
770         {
771             /* Don't overwrite callback */
772         }
773     } while (pb_field_next(&iter));
774 }
775
776 /*********************
777  * Decode all fields *
778  *********************/
779
780 bool checkreturn pb_decode_noinit(pb_istream_t *stream, const pb_field_t fields[], void *dest_struct)
781 {
782     uint8_t fields_seen[(PB_MAX_REQUIRED_FIELDS + 7) / 8] = {0}; /* Used to check for required fields */
783     uint32_t extension_range_start = 0;
784     pb_field_iterator_t iter;
785     
786     pb_field_init(&iter, fields, dest_struct);
787     
788     while (stream->bytes_left)
789     {
790         uint32_t tag;
791         pb_wire_type_t wire_type;
792         bool eof;
793         
794         if (!pb_decode_tag(stream, &wire_type, &tag, &eof))
795         {
796             if (eof)
797                 break;
798             else
799                 return false;
800         }
801         
802         if (!pb_field_find(&iter, tag))
803         {
804             /* No match found, check if it matches an extension. */
805             if (tag >= extension_range_start)
806             {
807                 if (!find_extension_field(&iter))
808                     extension_range_start = (uint32_t)-1;
809                 else
810                     extension_range_start = iter.pos->tag;
811                 
812                 if (tag >= extension_range_start)
813                 {
814                     size_t pos = stream->bytes_left;
815                 
816                     if (!decode_extension(stream, tag, wire_type, &iter))
817                         return false;
818                     
819                     if (pos != stream->bytes_left)
820                     {
821                         /* The field was handled */
822                         continue;                    
823                     }
824                 }
825             }
826         
827             /* No match found, skip data */
828             if (!pb_skip_field(stream, wire_type))
829                 return false;
830             continue;
831         }
832         
833         if (PB_HTYPE(iter.pos->type) == PB_HTYPE_REQUIRED
834             && iter.required_field_index < PB_MAX_REQUIRED_FIELDS)
835         {
836             fields_seen[iter.required_field_index >> 3] |= (uint8_t)(1 << (iter.required_field_index & 7));
837         }
838             
839         if (!decode_field(stream, wire_type, &iter))
840             return false;
841     }
842     
843     /* Check that all required fields were present. */
844     {
845         /* First figure out the number of required fields by
846          * seeking to the end of the field array. Usually we
847          * are already close to end after decoding.
848          */
849         unsigned req_field_count;
850         pb_type_t last_type;
851         unsigned i;
852         do {
853             req_field_count = iter.required_field_index;
854             last_type = iter.pos->type;
855         } while (pb_field_next(&iter));
856         
857         /* Fixup if last field was also required. */
858         if (PB_HTYPE(last_type) == PB_HTYPE_REQUIRED && iter.pos->tag)
859             req_field_count++;
860         
861         /* Check the whole bytes */
862         for (i = 0; i < (req_field_count >> 3); i++)
863         {
864             if (fields_seen[i] != 0xFF)
865                 PB_RETURN_ERROR(stream, "missing required field");
866         }
867         
868         /* Check the remaining bits */
869         if (fields_seen[req_field_count >> 3] != (0xFF >> (8 - (req_field_count & 7))))
870             PB_RETURN_ERROR(stream, "missing required field");
871     }
872     
873     return true;
874 }
875
876 bool checkreturn pb_decode(pb_istream_t *stream, const pb_field_t fields[], void *dest_struct)
877 {
878     pb_message_set_to_defaults(fields, dest_struct);
879     return pb_decode_noinit(stream, fields, dest_struct);
880 }
881
882 bool pb_decode_delimited(pb_istream_t *stream, const pb_field_t fields[], void *dest_struct)
883 {
884     pb_istream_t substream;
885     bool status;
886     
887     if (!pb_make_string_substream(stream, &substream))
888         return false;
889     
890     status = pb_decode(&substream, fields, dest_struct);
891     pb_close_string_substream(stream, &substream);
892     return status;
893 }
894
895 /* Field decoders */
896
897 bool pb_decode_svarint(pb_istream_t *stream, int64_t *dest)
898 {
899     uint64_t value;
900     if (!pb_decode_varint(stream, &value))
901         return false;
902     
903     if (value & 1)
904         *dest = (int64_t)(~(value >> 1));
905     else
906         *dest = (int64_t)(value >> 1);
907     
908     return true;
909 }
910
911 bool pb_decode_fixed32(pb_istream_t *stream, void *dest)
912 {
913     #ifdef __BIG_ENDIAN__
914     uint8_t *bytes = (uint8_t*)dest;
915     uint8_t lebytes[4];
916     
917     if (!pb_read(stream, lebytes, 4))
918         return false;
919     
920     bytes[0] = lebytes[3];
921     bytes[1] = lebytes[2];
922     bytes[2] = lebytes[1];
923     bytes[3] = lebytes[0];
924     return true;
925     #else
926     return pb_read(stream, (uint8_t*)dest, 4);
927     #endif   
928 }
929
930 bool pb_decode_fixed64(pb_istream_t *stream, void *dest)
931 {
932     #ifdef __BIG_ENDIAN__
933     uint8_t *bytes = (uint8_t*)dest;
934     uint8_t lebytes[8];
935     
936     if (!pb_read(stream, lebytes, 8))
937         return false;
938     
939     bytes[0] = lebytes[7];
940     bytes[1] = lebytes[6];
941     bytes[2] = lebytes[5];
942     bytes[3] = lebytes[4];
943     bytes[4] = lebytes[3];
944     bytes[5] = lebytes[2];
945     bytes[6] = lebytes[1];
946     bytes[7] = lebytes[0];
947     return true;
948     #else
949     return pb_read(stream, (uint8_t*)dest, 8);
950     #endif   
951 }
952
953 bool checkreturn pb_dec_varint(pb_istream_t *stream, const pb_field_t *field, void *dest)
954 {
955     uint64_t value;
956     if (!pb_decode_varint(stream, &value))
957         return false;
958     
959     switch (field->data_size)
960     {
961         case 1: *(int8_t*)dest = (int8_t)value; break;
962         case 2: *(int16_t*)dest = (int16_t)value; break;
963         case 4: *(int32_t*)dest = (int32_t)value; break;
964         case 8: *(int64_t*)dest = (int64_t)value; break;
965         default: PB_RETURN_ERROR(stream, "invalid data_size");
966     }
967     
968     return true;
969 }
970
971 bool checkreturn pb_dec_uvarint(pb_istream_t *stream, const pb_field_t *field, void *dest)
972 {
973     uint64_t value;
974     if (!pb_decode_varint(stream, &value))
975         return false;
976     
977     switch (field->data_size)
978     {
979         case 4: *(uint32_t*)dest = (uint32_t)value; break;
980         case 8: *(uint64_t*)dest = value; break;
981         default: PB_RETURN_ERROR(stream, "invalid data_size");
982     }
983     
984     return true;
985 }
986
987 bool checkreturn pb_dec_svarint(pb_istream_t *stream, const pb_field_t *field, void *dest)
988 {
989     int64_t value;
990     if (!pb_decode_svarint(stream, &value))
991         return false;
992     
993     switch (field->data_size)
994     {
995         case 4: *(int32_t*)dest = (int32_t)value; break;
996         case 8: *(int64_t*)dest = value; break;
997         default: PB_RETURN_ERROR(stream, "invalid data_size");
998     }
999     
1000     return true;
1001 }
1002
1003 bool checkreturn pb_dec_fixed32(pb_istream_t *stream, const pb_field_t *field, void *dest)
1004 {
1005     UNUSED(field);
1006     return pb_decode_fixed32(stream, dest);
1007 }
1008
1009 bool checkreturn pb_dec_fixed64(pb_istream_t *stream, const pb_field_t *field, void *dest)
1010 {
1011     UNUSED(field);
1012     return pb_decode_fixed64(stream, dest);
1013 }
1014
1015 bool checkreturn pb_dec_bytes(pb_istream_t *stream, const pb_field_t *field, void *dest)
1016 {
1017     pb_bytes_array_t *x = (pb_bytes_array_t*)dest;
1018     
1019     uint32_t temp;
1020     if (!pb_decode_varint32(stream, &temp))
1021         return false;
1022     x->size = temp;
1023     
1024     /* Check length, noting the space taken by the size_t header. */
1025     if (x->size > field->data_size - offsetof(pb_bytes_array_t, bytes))
1026         PB_RETURN_ERROR(stream, "bytes overflow");
1027     
1028     return pb_read(stream, x->bytes, x->size);
1029 }
1030
1031 bool checkreturn pb_dec_string(pb_istream_t *stream, const pb_field_t *field, void *dest)
1032 {
1033     uint32_t size;
1034     bool status;
1035     if (!pb_decode_varint32(stream, &size))
1036         return false;
1037     
1038     /* Check length, noting the null terminator */
1039     if (size + 1 > field->data_size)
1040         PB_RETURN_ERROR(stream, "string overflow");
1041     
1042     status = pb_read(stream, (uint8_t*)dest, size);
1043     *((uint8_t*)dest + size) = 0;
1044     return status;
1045 }
1046
1047 bool checkreturn pb_dec_submessage(pb_istream_t *stream, const pb_field_t *field, void *dest)
1048 {
1049     bool status;
1050     pb_istream_t substream;
1051     const pb_field_t* submsg_fields = (const pb_field_t*)field->ptr;
1052     
1053     if (!pb_make_string_substream(stream, &substream))
1054         return false;
1055     
1056     if (field->ptr == NULL)
1057         PB_RETURN_ERROR(stream, "invalid field descriptor");
1058     
1059     /* New array entries need to be initialized, while required and optional
1060      * submessages have already been initialized in the top-level pb_decode. */
1061     if (PB_HTYPE(field->type) == PB_HTYPE_REPEATED)
1062         status = pb_decode(&substream, submsg_fields, dest);
1063     else
1064         status = pb_decode_noinit(&substream, submsg_fields, dest);
1065     
1066     pb_close_string_substream(stream, &substream);
1067     return status;
1068 }