@@ -523,6 +523,7 @@ typedef struct {
523
523
upb_Arena* arena; /* TODO: should we have a tmp arena for tmp data? */
524
524
const upb_DefPool* symtab;
525
525
int depth;
526
+ int result;
526
527
upb_Status* status;
527
528
jmp_buf err;
528
529
int line;
@@ -1152,6 +1153,16 @@ static int64_t jsondec_strtoint64(jsondec* d, upb_StringView str) {
1152
1153
return ret;
1153
1154
}
1154
1155
1156
+ static void jsondec_checkempty(jsondec* d, upb_StringView str,
1157
+ const upb_FieldDef* f) {
1158
+ if (str.size != 0) return;
1159
+ d->result = kUpb_JsonDecodeResult_OkWithEmptyStringNumerics;
1160
+ upb_Status_SetErrorFormat(d->status,
1161
+ "Empty string is not a valid number (field: %s). "
1162
+ "This will be an error in a future version.",
1163
+ upb_FieldDef_FullName(f));
1164
+ }
1165
+
1155
1166
/* Primitive value types ******************************************************/
1156
1167
1157
1168
/* Parse INT32 or INT64 value. */
@@ -1173,6 +1184,7 @@ static upb_MessageValue jsondec_int(jsondec* d, const upb_FieldDef* f) {
1173
1184
}
1174
1185
case JD_STRING: {
1175
1186
upb_StringView str = jsondec_string(d);
1187
+ jsondec_checkempty(d, str, f);
1176
1188
val.int64_val = jsondec_strtoint64(d, str);
1177
1189
break;
1178
1190
}
@@ -1210,6 +1222,7 @@ static upb_MessageValue jsondec_uint(jsondec* d, const upb_FieldDef* f) {
1210
1222
}
1211
1223
case JD_STRING: {
1212
1224
upb_StringView str = jsondec_string(d);
1225
+ jsondec_checkempty(d, str, f);
1213
1226
val.uint64_val = jsondec_strtouint64(d, str);
1214
1227
break;
1215
1228
}
@@ -1238,14 +1251,26 @@ static upb_MessageValue jsondec_double(jsondec* d, const upb_FieldDef* f) {
1238
1251
break;
1239
1252
case JD_STRING:
1240
1253
str = jsondec_string(d);
1241
- if (jsondec_streql(str, "NaN")) {
1254
+ if (str.size == 0) {
1255
+ jsondec_checkempty(d, str, f);
1256
+ val.double_val = 0.0;
1257
+ } else if (jsondec_streql(str, "NaN")) {
1242
1258
val.double_val = NAN;
1243
1259
} else if (jsondec_streql(str, "Infinity")) {
1244
1260
val.double_val = INFINITY;
1245
1261
} else if (jsondec_streql(str, "-Infinity")) {
1246
1262
val.double_val = -INFINITY;
1247
1263
} else {
1248
- val.double_val = strtod(str.data, NULL);
1264
+ char* end;
1265
+ val.double_val = strtod(str.data, &end);
1266
+ if (end != str.data + str.size) {
1267
+ d->result = kUpb_JsonDecodeResult_OkWithEmptyStringNumerics;
1268
+ upb_Status_SetErrorFormat(
1269
+ d->status,
1270
+ "Non-number characters in quoted number (field: %s). "
1271
+ "This will be an error in a future version.",
1272
+ upb_FieldDef_FullName(f));
1273
+ }
1249
1274
}
1250
1275
break;
1251
1276
default:
@@ -1987,10 +2012,10 @@ static void jsondec_wellknown(jsondec* d, upb_Message* msg,
1987
2012
}
1988
2013
}
1989
2014
1990
- static bool upb_JsonDecoder_Decode(jsondec* const d, upb_Message* const msg,
1991
- const upb_MessageDef* const m) {
2015
+ static int upb_JsonDecoder_Decode(jsondec* const d, upb_Message* const msg,
2016
+ const upb_MessageDef* const m) {
1992
2017
UPB_ASSERT(!upb_Message_IsFrozen(msg));
1993
- if (UPB_SETJMP(d->err)) return false ;
2018
+ if (UPB_SETJMP(d->err)) return kUpb_JsonDecodeResult_Error ;
1994
2019
1995
2020
jsondec_tomsg(d, msg, m);
1996
2021
@@ -1999,16 +2024,19 @@ static bool upb_JsonDecoder_Decode(jsondec* const d, upb_Message* const msg,
1999
2024
jsondec_consumews(d);
2000
2025
2001
2026
if (d->ptr == d->end) {
2002
- return true ;
2027
+ return d->result ;
2003
2028
} else {
2004
2029
jsondec_seterrmsg(d, "unexpected trailing characters");
2005
- return false ;
2030
+ return kUpb_JsonDecodeResult_Error ;
2006
2031
}
2007
2032
}
2008
2033
2009
- bool upb_JsonDecode(const char* buf, size_t size, upb_Message* msg,
2010
- const upb_MessageDef* m, const upb_DefPool* symtab,
2011
- int options, upb_Arena* arena, upb_Status* status) {
2034
+ int upb_JsonDecodeDetectingNonconformance(const char* buf, size_t size,
2035
+ upb_Message* msg,
2036
+ const upb_MessageDef* m,
2037
+ const upb_DefPool* symtab,
2038
+ int options, upb_Arena* arena,
2039
+ upb_Status* status) {
2012
2040
UPB_ASSERT(!upb_Message_IsFrozen(msg));
2013
2041
jsondec d;
2014
2042
@@ -2021,6 +2049,7 @@ bool upb_JsonDecode(const char* buf, size_t size, upb_Message* msg,
2021
2049
d.status = status;
2022
2050
d.options = options;
2023
2051
d.depth = 64;
2052
+ d.result = kUpb_JsonDecodeResult_Ok;
2024
2053
d.line = 1;
2025
2054
d.line_begin = d.ptr;
2026
2055
d.debug_field = NULL;
0 commit comments