summaryrefslogtreecommitdiff
path: root/upb/json
diff options
context:
space:
mode:
Diffstat (limited to 'upb/json')
-rw-r--r--upb/json/parser.c18
-rw-r--r--upb/json/parser.rl18
-rw-r--r--upb/json/printer.c7
3 files changed, 30 insertions, 13 deletions
diff --git a/upb/json/parser.c b/upb/json/parser.c
index 8a50b3a..3731478 100644
--- a/upb/json/parser.c
+++ b/upb/json/parser.c
@@ -1609,6 +1609,11 @@ static void add_jsonname_table(upb_json_parsermethod *m, const upb_msgdef* md) {
upb_msg_field_iter i;
upb_strtable *t;
+ /* It would be nice to stack-allocate this, but protobufs do not limit the
+ * length of fields to any reasonable limit. */
+ char *buf = NULL;
+ size_t len = 0;
+
if (upb_inttable_lookupptr(&m->name_tables, md, NULL)) {
return;
}
@@ -1622,17 +1627,20 @@ static void add_jsonname_table(upb_json_parsermethod *m, const upb_msgdef* md) {
!upb_msg_field_done(&i);
upb_msg_field_next(&i)) {
const upb_fielddef *f = upb_msg_iter_field(&i);
- /* It would be nice to stack-allocate this, but protobufs do not limit the
- * length of fields to any reasonable limit. */
- char *buf = malloc(strlen(upb_fielddef_name(f)) + 1);
- upb_fielddef_getjsonname(f, buf);
+ size_t field_len = upb_fielddef_getjsonname(f, buf, len);
+ if (field_len > len) {
+ buf = realloc(buf, field_len);
+ len = field_len;
+ upb_fielddef_getjsonname(f, buf, len);
+ }
upb_strtable_insert(t, buf, upb_value_constptr(f));
- free(buf);
if (upb_fielddef_issubmsg(f)) {
add_jsonname_table(m, upb_fielddef_msgsubdef(f));
}
}
+
+ free(buf);
}
/* Public API *****************************************************************/
diff --git a/upb/json/parser.rl b/upb/json/parser.rl
index b85fd21..4ccca6c 100644
--- a/upb/json/parser.rl
+++ b/upb/json/parser.rl
@@ -1344,6 +1344,11 @@ static void add_jsonname_table(upb_json_parsermethod *m, const upb_msgdef* md) {
upb_msg_field_iter i;
upb_strtable *t;
+ /* It would be nice to stack-allocate this, but protobufs do not limit the
+ * length of fields to any reasonable limit. */
+ char *buf = NULL;
+ size_t len = 0;
+
if (upb_inttable_lookupptr(&m->name_tables, md, NULL)) {
return;
}
@@ -1357,17 +1362,20 @@ static void add_jsonname_table(upb_json_parsermethod *m, const upb_msgdef* md) {
!upb_msg_field_done(&i);
upb_msg_field_next(&i)) {
const upb_fielddef *f = upb_msg_iter_field(&i);
- /* It would be nice to stack-allocate this, but protobufs do not limit the
- * length of fields to any reasonable limit. */
- char *buf = malloc(strlen(upb_fielddef_name(f)) + 1);
- upb_fielddef_getjsonname(f, buf);
+ size_t field_len = upb_fielddef_getjsonname(f, buf, len);
+ if (field_len > len) {
+ buf = realloc(buf, field_len);
+ len = field_len;
+ upb_fielddef_getjsonname(f, buf, len);
+ }
upb_strtable_insert(t, buf, upb_value_constptr(f));
- free(buf);
if (upb_fielddef_issubmsg(f)) {
add_jsonname_table(m, upb_fielddef_msgsubdef(f));
}
}
+
+ free(buf);
}
/* Public API *****************************************************************/
diff --git a/upb/json/printer.c b/upb/json/printer.c
index 5d54abf..c3d9bb4 100644
--- a/upb/json/printer.c
+++ b/upb/json/printer.c
@@ -47,9 +47,10 @@ void freestrpc(void *ptr) {
strpc *newstrpc(upb_handlers *h, const upb_fielddef *f) {
/* TODO(haberman): handle malloc failure. */
strpc *ret = malloc(sizeof(*ret));
- ret->ptr = malloc(strlen(upb_fielddef_name(f)) + 1);
- upb_fielddef_getjsonname(f, ret->ptr);
- ret->len = strlen(ret->ptr);
+ ret->len = upb_fielddef_getjsonname(f, NULL, 0);
+ ret->ptr = malloc(ret->len);
+ upb_fielddef_getjsonname(f, ret->ptr, ret->len);
+ ret->len--; /* NULL */
upb_handlers_addcleanup(h, ret, freestrpc);
return ret;
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback