summaryrefslogtreecommitdiff
path: root/upb/def.c
diff options
context:
space:
mode:
authorJosh Haberman <jhaberman@gmail.com>2019-01-24 15:53:36 -0800
committerJosh Haberman <jhaberman@gmail.com>2019-01-24 15:53:36 -0800
commit2719bcff0d1972994e98433b830a921e2ded5fc4 (patch)
treec99588297758815d798cd2e7db5dc5d98796ed12 /upb/def.c
parentca5f951137a121e55ca21ee162afd1be596775ba (diff)
Fixes for Google-internal tests.
Diffstat (limited to 'upb/def.c')
-rw-r--r--upb/def.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/upb/def.c b/upb/def.c
index 38ef9fa..4d4fea9 100644
--- a/upb/def.c
+++ b/upb/def.c
@@ -958,6 +958,28 @@ static bool create_oneofdef(
static bool parse_default(const symtab_addctx *ctx, const char *str, size_t len,
upb_fielddef *f) {
char *end;
+ char nullz[64];
+ errno = 0;
+
+ switch (upb_fielddef_type(f)) {
+ case UPB_TYPE_INT32:
+ case UPB_TYPE_INT64:
+ case UPB_TYPE_UINT32:
+ case UPB_TYPE_UINT64:
+ case UPB_TYPE_DOUBLE:
+ case UPB_TYPE_FLOAT:
+ /* Standard C number parsing functions expect null-terminated strings. */
+ if (len >= sizeof(nullz) - 1) {
+ return false;
+ }
+ memcpy(nullz, str, len);
+ nullz[len] = '\0';
+ str = nullz;
+ break;
+ default:
+ break;
+ }
+
switch (upb_fielddef_type(f)) {
case UPB_TYPE_INT32: {
long val = strtol(str, &end, 0);
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback