X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=pb_decode.c;h=601dc7423e0aa77828fdcd700f88e8567ff2eb71;hb=f1d7640fe1be0f150f604c72108ea516222c2505;hp=8f72f776ae6961c85626863397f5c24c82235441;hpb=9383f305dc42eeca8b043c5c6dff3fe2e3e8f4f2;p=apps%2Fagl-service-can-low-level.git diff --git a/pb_decode.c b/pb_decode.c index 8f72f776..601dc742 100644 --- a/pb_decode.c +++ b/pb_decode.c @@ -39,10 +39,10 @@ static const pb_decoder_t PB_DECODERS[PB_LTYPES_COUNT] = { bool checkreturn pb_read(pb_istream_t *stream, uint8_t *buf, size_t count) { if (stream->bytes_left < count) - return false; + PB_RETURN_ERROR(stream, "end-of-stream"); if (!stream->callback(stream, buf, count)) - return false; + PB_RETURN_ERROR(stream, "io error"); stream->bytes_left -= count; return true; @@ -95,7 +95,7 @@ bool checkreturn pb_decode_varint(pb_istream_t *stream, uint64_t *dest) return true; } - return false; + PB_RETURN_ERROR(stream, "varint overflow"); } bool checkreturn pb_skip_varint(pb_istream_t *stream) @@ -152,7 +152,7 @@ bool checkreturn pb_skip_field(pb_istream_t *stream, pb_wire_type_t wire_type) case PB_WT_64BIT: return pb_read(stream, NULL, 8); case PB_WT_STRING: return pb_skip_string(stream); case PB_WT_32BIT: return pb_read(stream, NULL, 4); - default: return false; + default: PB_RETURN_ERROR(stream, "invalid wire_type"); } } @@ -182,7 +182,7 @@ static bool checkreturn read_raw_value(pb_istream_t *stream, pb_wire_type_t wire *size = 4; return pb_read(stream, buf, 4); - default: return false; + default: PB_RETURN_ERROR(stream, "invalid wire_type"); } } @@ -197,7 +197,7 @@ bool checkreturn pb_make_string_substream(pb_istream_t *stream, pb_istream_t *su *substream = *stream; if (substream->bytes_left < size) - return false; + PB_RETURN_ERROR(stream, "parent stream too short"); substream->bytes_left = size; stream->bytes_left -= size; @@ -316,7 +316,7 @@ static bool checkreturn decode_field(pb_istream_t *stream, pb_wire_type_t wire_t size_t *size = (size_t*)iter->pSize; void *pItem = (uint8_t*)iter->pData + iter->current->data_size * (*size); if (*size >= iter->current->array_size) - return false; + PB_RETURN_ERROR(stream, "array overflow"); (*size)++; return func(stream, iter->current, pItem); @@ -339,7 +339,7 @@ static bool checkreturn decode_field(pb_istream_t *stream, pb_wire_type_t wire_t while (substream.bytes_left) { if (!pCallback->funcs.decode(&substream, iter->current, pCallback->arg)) - return false; + PB_RETURN_ERROR(stream, "callback failed"); } pb_close_string_substream(stream, &substream); @@ -364,7 +364,7 @@ static bool checkreturn decode_field(pb_istream_t *stream, pb_wire_type_t wire_t } default: - return false; + PB_RETURN_ERROR(stream, "invalid field type"); } } @@ -415,13 +415,11 @@ static void pb_message_set_to_defaults(const pb_field_t fields[], void *dest_str * Decode all fields * *********************/ -bool checkreturn pb_decode(pb_istream_t *stream, const pb_field_t fields[], void *dest_struct) +bool checkreturn pb_decode_noinit(pb_istream_t *stream, const pb_field_t fields[], void *dest_struct) { uint8_t fields_seen[(PB_MAX_REQUIRED_FIELDS + 7) / 8] = {0}; /* Used to check for required fields */ pb_field_iterator_t iter; - pb_message_set_to_defaults(fields, dest_struct); - pb_field_init(&iter, fields, dest_struct); while (stream->bytes_left) @@ -463,13 +461,19 @@ bool checkreturn pb_decode(pb_istream_t *stream, const pb_field_t fields[], void iter.required_field_index < PB_MAX_REQUIRED_FIELDS && !(fields_seen[iter.required_field_index >> 3] & (1 << (iter.required_field_index & 7)))) { - return false; + PB_RETURN_ERROR(stream, "missing required field"); } } while (pb_field_next(&iter)); return true; } +bool checkreturn pb_decode(pb_istream_t *stream, const pb_field_t fields[], void *dest_struct) +{ + pb_message_set_to_defaults(fields, dest_struct); + return pb_decode_noinit(stream, fields, dest_struct); +} + /* Field decoders */ bool pb_decode_svarint(pb_istream_t *stream, int64_t *dest) @@ -539,7 +543,7 @@ bool checkreturn pb_dec_varint(pb_istream_t *stream, const pb_field_t *field, vo case 2: *(uint16_t*)dest = value; break; case 4: *(uint32_t*)dest = value; break; case 8: *(uint64_t*)dest = value; break; - default: return false; + default: PB_RETURN_ERROR(stream, "invalid data_size"); } return status; @@ -554,7 +558,7 @@ bool checkreturn pb_dec_svarint(pb_istream_t *stream, const pb_field_t *field, v { case 4: *(int32_t*)dest = value; break; case 8: *(int64_t*)dest = value; break; - default: return false; + default: PB_RETURN_ERROR(stream, "invalid data_size"); } return status; @@ -583,7 +587,7 @@ bool checkreturn pb_dec_bytes(pb_istream_t *stream, const pb_field_t *field, voi /* Check length, noting the space taken by the size_t header. */ if (x->size > field->data_size - offsetof(pb_bytes_array_t, bytes)) - return false; + PB_RETURN_ERROR(stream, "bytes overflow"); return pb_read(stream, x->bytes, x->size); } @@ -597,7 +601,7 @@ bool checkreturn pb_dec_string(pb_istream_t *stream, const pb_field_t *field, vo /* Check length, noting the null terminator */ if (size + 1 > field->data_size) - return false; + PB_RETURN_ERROR(stream, "string overflow"); status = pb_read(stream, (uint8_t*)dest, size); *((uint8_t*)dest + size) = 0; @@ -613,9 +617,9 @@ bool checkreturn pb_dec_submessage(pb_istream_t *stream, const pb_field_t *field return false; if (field->ptr == NULL) - return false; + PB_RETURN_ERROR(stream, "invalid field descriptor"); - status = pb_decode(&substream, (pb_field_t*)field->ptr, dest); + status = pb_decode_noinit(&substream, (pb_field_t*)field->ptr, dest); pb_close_string_substream(stream, &substream); return status; }