summaryrefslogtreecommitdiff
path: root/upb
diff options
context:
space:
mode:
Diffstat (limited to 'upb')
-rw-r--r--upb/decode.c9
-rw-r--r--upb/encode.c8
2 files changed, 11 insertions, 6 deletions
diff --git a/upb/decode.c b/upb/decode.c
index 3a44021..b09da42 100644
--- a/upb/decode.c
+++ b/upb/decode.c
@@ -54,18 +54,18 @@ static bool upb_decode_message(upb_decstate *d, const char *limit,
static bool upb_decode_varint(const char **ptr, const char *limit,
uint64_t *val) {
- uint8_t byte = 0x80;
+ uint8_t byte;
int bitpos = 0;
const char *p = *ptr;
*val = 0;
- while (byte & 0x80) {
+ do {
CHK(bitpos < 70 && p < limit);
byte = *p;
*val |= (uint64_t)(byte & 0x7F) << bitpos;
p++;
bitpos += 7;
- }
+ } while (byte & 0x80);
*ptr = p;
return true;
@@ -385,7 +385,7 @@ static bool upb_decode_fixedpacked(upb_array *arr, upb_stringview data,
int elements = data.size / elem_size;
void *field_mem;
- CHK((data.size % elem_size) == 0);
+ CHK(elements * elem_size == data.size);
field_mem = upb_array_add(arr, elements);
CHK(field_mem);
memcpy(field_mem, data.data, data.size);
@@ -451,6 +451,7 @@ static bool upb_decode_toarray(upb_decstate *d, upb_decframe *frame,
return upb_append_unknown(d, frame, field_start);
}
#undef VARINT_CASE
+ UPB_UNREACHABLE();
}
static bool upb_decode_delimitedfield(upb_decstate *d, upb_decframe *frame,
diff --git a/upb/encode.c b/upb/encode.c
index 4aafb9c..e7585eb 100644
--- a/upb/encode.c
+++ b/upb/encode.c
@@ -32,7 +32,7 @@ static const uint8_t upb_desctype_to_fieldtype[] = {
static size_t upb_encode_varint(uint64_t val, char *buf) {
size_t i;
- if (val == 0) { buf[0] = 0; return 1; }
+ if (val < 128) { buf[0] = val; return 1; }
i = 0;
while (val) {
uint8_t byte = val & 0x7fU;
@@ -373,7 +373,11 @@ char *upb_encode(const void *msg, const upb_msglayout_msginit_v1 *m,
e.limit = NULL;
e.ptr = NULL;
- CHK(upb_encode_message(&e, msg, m, size));
+ if (!upb_encode_message(&e, msg, m, size)) {
+ *size = 0;
+ return NULL;
+ }
+
*size = e.limit - e.ptr;
if (*size == 0) {
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback