diff --git a/src/jv.c b/src/jv.c index 84fafef6..074ee310 100644 --- a/src/jv.c +++ b/src/jv.c @@ -570,7 +570,10 @@ static jvp_literal_number* jvp_literal_number_alloc(unsigned literal_length) { } static jv jvp_literal_number_new(const char * literal) { - jvp_literal_number* n = jvp_literal_number_alloc(strlen(literal)); + size_t len = strlen(literal); + if (len > DEC_MAX_DIGITS) + return JV_INVALID; + jvp_literal_number* n = jvp_literal_number_alloc(len); decContext *ctx = DEC_CONTEXT(); decContextClearStatus(ctx, DEC_Conversion_syntax); diff --git a/src/jv_print.c b/src/jv_print.c index 5c86c5d9..bc251070 100644 --- a/src/jv_print.c +++ b/src/jv_print.c @@ -410,6 +410,10 @@ jv jv_dump_string(jv x, int flags) { char *jv_dump_string_trunc(jv x, char *outbuf, size_t bufsize) { assert(bufsize > 0); + if (jv_get_kind(x) == JV_KIND_STRING && + (size_t)jv_string_length_bytes(jv_copy(x)) > bufsize) { + x = jv_string_slice(x, 0, bufsize); + } x = jv_dump_string(x, 0); const char *str = jv_string_value(x); const size_t len = strlen(str);