|
|
@ -141,6 +141,7 @@ static const int8_t delim_ops[37] = { |
|
|
|
typedef struct { |
|
|
|
typedef struct { |
|
|
|
const char *limit; /* End of delimited region or end of buffer. */ |
|
|
|
const char *limit; /* End of delimited region or end of buffer. */ |
|
|
|
upb_arena arena; |
|
|
|
upb_arena arena; |
|
|
|
|
|
|
|
upb_arena *orig_parent; |
|
|
|
int depth; |
|
|
|
int depth; |
|
|
|
uint32_t end_group; /* Set to field number of END_GROUP tag, if any. */ |
|
|
|
uint32_t end_group; /* Set to field number of END_GROUP tag, if any. */ |
|
|
|
jmp_buf err; |
|
|
|
jmp_buf err; |
|
|
@ -610,9 +611,13 @@ bool upb_decode(const char *buf, size_t size, void *msg, const upb_msglayout *l, |
|
|
|
if (size == 0) return true; |
|
|
|
if (size == 0) return true; |
|
|
|
|
|
|
|
|
|
|
|
state.limit = buf + size; |
|
|
|
state.limit = buf + size; |
|
|
|
state.arena = *arena; |
|
|
|
|
|
|
|
state.depth = 64; |
|
|
|
state.depth = 64; |
|
|
|
state.end_group = 0; |
|
|
|
state.end_group = 0; |
|
|
|
|
|
|
|
state.orig_parent = arena->parent; |
|
|
|
|
|
|
|
state.arena = *arena; |
|
|
|
|
|
|
|
if (arena->parent == arena) { |
|
|
|
|
|
|
|
state.arena.parent = &state.arena; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (setjmp(state.err)) { |
|
|
|
if (setjmp(state.err)) { |
|
|
|
ok = false; |
|
|
|
ok = false; |
|
|
@ -622,6 +627,7 @@ bool upb_decode(const char *buf, size_t size, void *msg, const upb_msglayout *l, |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
*arena = state.arena; |
|
|
|
*arena = state.arena; |
|
|
|
|
|
|
|
arena->parent = state.orig_parent; |
|
|
|
return ok; |
|
|
|
return ok; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|