<p>Corey Farrell has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.asterisk.org/10319">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">jansson-bundled: Add patches to improve json_pack error reporting.<br><br>Change-Id: I045e420d5e73e60639079246e810da6ae21ae22b<br>---<br>A third-party/jansson/patches/0029-json_pack-Improve-handling-of-formats-with-and.patch<br>A third-party/jansson/patches/0030-More-work-on-json_pack-error-reporting.patch<br>2 files changed, 503 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/19/10319/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/third-party/jansson/patches/0029-json_pack-Improve-handling-of-formats-with-and.patch b/third-party/jansson/patches/0029-json_pack-Improve-handling-of-formats-with-and.patch</span><br><span>new file mode 100644</span><br><span>index 0000000..c5900fe</span><br><span>--- /dev/null</span><br><span>+++ b/third-party/jansson/patches/0029-json_pack-Improve-handling-of-formats-with-and.patch</span><br><span>@@ -0,0 +1,323 @@</span><br><span style="color: hsl(120, 100%, 40%);">+From 5df5fc5b13cac5212482d36e7f3a78951782cfb5 Mon Sep 17 00:00:00 2001</span><br><span style="color: hsl(120, 100%, 40%);">+From: Corey Farrell <git@cfware.com></span><br><span style="color: hsl(120, 100%, 40%);">+Date: Tue, 25 Sep 2018 14:31:56 -0400</span><br><span style="color: hsl(120, 100%, 40%);">+Subject: [PATCH 29/30] json_pack: Improve handling of formats with '?' and</span><br><span style="color: hsl(120, 100%, 40%);">+ '*'.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+When NULL is received for an optional argument we should not set an</span><br><span style="color: hsl(120, 100%, 40%);">+error message as this would block later error messages. If NULL is</span><br><span style="color: hsl(120, 100%, 40%);">+received for a non-optional string we should set has_error. Set</span><br><span style="color: hsl(120, 100%, 40%);">+has_error for UTF-8 errors to ensure optional strings with UTF-8</span><br><span style="color: hsl(120, 100%, 40%);">+errors are not replaced with json_null(). Use 'purpose' argument in</span><br><span style="color: hsl(120, 100%, 40%);">+NULL error messages of read_string.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Add error handling and tests for invalid formats where '+', '#', or '%'</span><br><span style="color: hsl(120, 100%, 40%);">+is used on an optional string 's?' or 's*'.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Fix NULL string error messages to use 'purpose'.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Refactor skipping of '*' token, this is now handled by read_string and</span><br><span style="color: hsl(120, 100%, 40%);">+pack_object_inter. This allows invalid format strings such as 's*#' and</span><br><span style="color: hsl(120, 100%, 40%);">+'s*+' to produce error messages.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Fixes #437</span><br><span style="color: hsl(120, 100%, 40%);">+---</span><br><span style="color: hsl(120, 100%, 40%);">+ src/pack_unpack.c           | 74 +++++++++++++++++++++++--------------</span><br><span style="color: hsl(120, 100%, 40%);">+ test/suites/api/test_pack.c | 49 ++++++++++++++++++++++--</span><br><span style="color: hsl(120, 100%, 40%);">+ 2 files changed, 93 insertions(+), 30 deletions(-)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+diff --git a/src/pack_unpack.c b/src/pack_unpack.c</span><br><span style="color: hsl(120, 100%, 40%);">+index b842772..fc98df4 100644</span><br><span style="color: hsl(120, 100%, 40%);">+--- a/src/pack_unpack.c</span><br><span>++++ b/src/pack_unpack.c</span><br><span style="color: hsl(120, 100%, 40%);">+@@ -130,7 +130,7 @@ static json_t *pack(scanner_t *s, va_list *ap);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* ours will be set to 1 if jsonp_free() must be called for the result</span><br><span style="color: hsl(120, 100%, 40%);">+    afterwards */</span><br><span style="color: hsl(120, 100%, 40%);">+ static char *read_string(scanner_t *s, va_list *ap,</span><br><span style="color: hsl(120, 100%, 40%);">+-                         const char *purpose, size_t *out_len, int *ours)</span><br><span style="color: hsl(120, 100%, 40%);">++                         const char *purpose, size_t *out_len, int *ours, int optional)</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+     char t;</span><br><span style="color: hsl(120, 100%, 40%);">+     strbuffer_t strbuff;</span><br><span style="color: hsl(120, 100%, 40%);">+@@ -147,7 +147,10 @@ static char *read_string(scanner_t *s, va_list *ap,</span><br><span style="color: hsl(120, 100%, 40%);">+         str = va_arg(*ap, const char *);</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+         if(!str) {</span><br><span style="color: hsl(120, 100%, 40%);">+-            set_error(s, "<args>", json_error_null_value, "NULL string argument");</span><br><span style="color: hsl(120, 100%, 40%);">++            if (!optional) {</span><br><span style="color: hsl(120, 100%, 40%);">++                set_error(s, "<args>", json_error_null_value, "NULL %s", purpose);</span><br><span style="color: hsl(120, 100%, 40%);">++                s->has_error = 1;</span><br><span style="color: hsl(120, 100%, 40%);">++            }</span><br><span style="color: hsl(120, 100%, 40%);">+             return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+@@ -155,11 +158,17 @@ static char *read_string(scanner_t *s, va_list *ap,</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+         if(!utf8_check_string(str, length)) {</span><br><span style="color: hsl(120, 100%, 40%);">+             set_error(s, "<args>", json_error_invalid_utf8, "Invalid UTF-8 %s", purpose);</span><br><span style="color: hsl(120, 100%, 40%);">++            s->has_error = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+             return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+         *out_len = length;</span><br><span style="color: hsl(120, 100%, 40%);">+         return (char *)str;</span><br><span style="color: hsl(120, 100%, 40%);">++    } else if (optional) {</span><br><span style="color: hsl(120, 100%, 40%);">++        set_error(s, "<format>", json_error_invalid_format, "Cannot use '%c' on optional strings", t);</span><br><span style="color: hsl(120, 100%, 40%);">++        s->has_error = 1;</span><br><span style="color: hsl(120, 100%, 40%);">++</span><br><span style="color: hsl(120, 100%, 40%);">++        return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+     if(strbuffer_init(&strbuff)) {</span><br><span style="color: hsl(120, 100%, 40%);">+@@ -170,7 +179,7 @@ static char *read_string(scanner_t *s, va_list *ap,</span><br><span style="color: hsl(120, 100%, 40%);">+     while(1) {</span><br><span style="color: hsl(120, 100%, 40%);">+         str = va_arg(*ap, const char *);</span><br><span style="color: hsl(120, 100%, 40%);">+         if(!str) {</span><br><span style="color: hsl(120, 100%, 40%);">+-            set_error(s, "<args>", json_error_null_value, "NULL string argument");</span><br><span style="color: hsl(120, 100%, 40%);">++            set_error(s, "<args>", json_error_null_value, "NULL %s", purpose);</span><br><span style="color: hsl(120, 100%, 40%);">+             s->has_error = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+@@ -226,6 +235,7 @@ static json_t *pack_object(scanner_t *s, va_list *ap)</span><br><span style="color: hsl(120, 100%, 40%);">+         size_t len;</span><br><span style="color: hsl(120, 100%, 40%);">+         int ours;</span><br><span style="color: hsl(120, 100%, 40%);">+         json_t *value;</span><br><span style="color: hsl(120, 100%, 40%);">++        char valueOptional;</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+         if(!token(s)) {</span><br><span style="color: hsl(120, 100%, 40%);">+             set_error(s, "<format>", json_error_invalid_format, "Unexpected end of format string");</span><br><span style="color: hsl(120, 100%, 40%);">+@@ -237,20 +247,21 @@ static json_t *pack_object(scanner_t *s, va_list *ap)</span><br><span style="color: hsl(120, 100%, 40%);">+             goto error;</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+-        key = read_string(s, ap, "object key", &len, &ours);</span><br><span style="color: hsl(120, 100%, 40%);">+-        if (!key)</span><br><span style="color: hsl(120, 100%, 40%);">+-            s->has_error = 1;</span><br><span style="color: hsl(120, 100%, 40%);">++        key = read_string(s, ap, "object key", &len, &ours, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+         next_token(s);</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">++        next_token(s);</span><br><span style="color: hsl(120, 100%, 40%);">++        valueOptional = token(s);</span><br><span style="color: hsl(120, 100%, 40%);">++        prev_token(s);</span><br><span style="color: hsl(120, 100%, 40%);">++</span><br><span style="color: hsl(120, 100%, 40%);">+         value = pack(s, ap);</span><br><span style="color: hsl(120, 100%, 40%);">+         if(!value) {</span><br><span style="color: hsl(120, 100%, 40%);">+             if(ours)</span><br><span style="color: hsl(120, 100%, 40%);">+                 jsonp_free(key);</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+-            if(strchr("soO", token(s)) && s->next_token.token == '*') {</span><br><span style="color: hsl(120, 100%, 40%);">+-                next_token(s);</span><br><span style="color: hsl(120, 100%, 40%);">+-            } else {</span><br><span style="color: hsl(120, 100%, 40%);">++            if(valueOptional != '*') {</span><br><span style="color: hsl(120, 100%, 40%);">++                set_error(s, "<args>", json_error_null_value, "NULL object value\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                 s->has_error = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+@@ -269,8 +280,6 @@ static json_t *pack_object(scanner_t *s, va_list *ap)</span><br><span style="color: hsl(120, 100%, 40%);">+         if(ours)</span><br><span style="color: hsl(120, 100%, 40%);">+             jsonp_free(key);</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+-        if(strchr("soO", token(s)) && s->next_token.token == '*')</span><br><span style="color: hsl(120, 100%, 40%);">+-            next_token(s);</span><br><span style="color: hsl(120, 100%, 40%);">+         next_token(s);</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+@@ -289,6 +298,7 @@ static json_t *pack_array(scanner_t *s, va_list *ap)</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+     while(token(s) != ']') {</span><br><span style="color: hsl(120, 100%, 40%);">+         json_t *value;</span><br><span style="color: hsl(120, 100%, 40%);">++        char valueOptional;</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+         if(!token(s)) {</span><br><span style="color: hsl(120, 100%, 40%);">+             set_error(s, "<format>", json_error_invalid_format, "Unexpected end of format string");</span><br><span style="color: hsl(120, 100%, 40%);">+@@ -296,11 +306,13 @@ static json_t *pack_array(scanner_t *s, va_list *ap)</span><br><span style="color: hsl(120, 100%, 40%);">+             goto error;</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">++        next_token(s);</span><br><span style="color: hsl(120, 100%, 40%);">++        valueOptional = token(s);</span><br><span style="color: hsl(120, 100%, 40%);">++        prev_token(s);</span><br><span style="color: hsl(120, 100%, 40%);">++</span><br><span style="color: hsl(120, 100%, 40%);">+         value = pack(s, ap);</span><br><span style="color: hsl(120, 100%, 40%);">+         if(!value) {</span><br><span style="color: hsl(120, 100%, 40%);">+-            if(strchr("soO", token(s)) && s->next_token.token == '*') {</span><br><span style="color: hsl(120, 100%, 40%);">+-                next_token(s);</span><br><span style="color: hsl(120, 100%, 40%);">+-            } else {</span><br><span style="color: hsl(120, 100%, 40%);">++            if(valueOptional != '*') {</span><br><span style="color: hsl(120, 100%, 40%);">+                 s->has_error = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+@@ -316,8 +328,6 @@ static json_t *pack_array(scanner_t *s, va_list *ap)</span><br><span style="color: hsl(120, 100%, 40%);">+             s->has_error = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+-        if(strchr("soO", token(s)) && s->next_token.token == '*')</span><br><span style="color: hsl(120, 100%, 40%);">+-            next_token(s);</span><br><span style="color: hsl(120, 100%, 40%);">+         next_token(s);</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+@@ -332,23 +342,33 @@ error:</span><br><span style="color: hsl(120, 100%, 40%);">+ static json_t *pack_string(scanner_t *s, va_list *ap)</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+     char *str;</span><br><span style="color: hsl(120, 100%, 40%);">++    char t;</span><br><span style="color: hsl(120, 100%, 40%);">+     size_t len;</span><br><span style="color: hsl(120, 100%, 40%);">+     int ours;</span><br><span style="color: hsl(120, 100%, 40%);">+-    int nullable;</span><br><span style="color: hsl(120, 100%, 40%);">++    int optional;</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+     next_token(s);</span><br><span style="color: hsl(120, 100%, 40%);">+-    nullable = token(s) == '?';</span><br><span style="color: hsl(120, 100%, 40%);">+-    if (!nullable)</span><br><span style="color: hsl(120, 100%, 40%);">++    t = token(s);</span><br><span style="color: hsl(120, 100%, 40%);">++    optional = t == '?' || t == '*';</span><br><span style="color: hsl(120, 100%, 40%);">++    if (!optional)</span><br><span style="color: hsl(120, 100%, 40%);">+         prev_token(s);</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+-    str = read_string(s, ap, "string", &len, &ours);</span><br><span style="color: hsl(120, 100%, 40%);">+-    if (!str) {</span><br><span style="color: hsl(120, 100%, 40%);">+-        return nullable ? json_null() : NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+-    } else if (ours) {</span><br><span style="color: hsl(120, 100%, 40%);">+-        return jsonp_stringn_nocheck_own(str, len);</span><br><span style="color: hsl(120, 100%, 40%);">+-    } else {</span><br><span style="color: hsl(120, 100%, 40%);">+-        return json_stringn_nocheck(str, len);</span><br><span style="color: hsl(120, 100%, 40%);">++    str = read_string(s, ap, "string", &len, &ours, optional);</span><br><span style="color: hsl(120, 100%, 40%);">++</span><br><span style="color: hsl(120, 100%, 40%);">++    if (!str)</span><br><span style="color: hsl(120, 100%, 40%);">++        return t == '?' && !s->has_error ? json_null() : NULL;</span><br><span style="color: hsl(120, 100%, 40%);">++</span><br><span style="color: hsl(120, 100%, 40%);">++    if (s->has_error) {</span><br><span style="color: hsl(120, 100%, 40%);">++        if (!ours)</span><br><span style="color: hsl(120, 100%, 40%);">++            jsonp_free(str);</span><br><span style="color: hsl(120, 100%, 40%);">++</span><br><span style="color: hsl(120, 100%, 40%);">++        return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">++</span><br><span style="color: hsl(120, 100%, 40%);">++    if (ours)</span><br><span style="color: hsl(120, 100%, 40%);">++        return jsonp_stringn_nocheck_own(str, len);</span><br><span style="color: hsl(120, 100%, 40%);">++</span><br><span style="color: hsl(120, 100%, 40%);">++    return json_stringn_nocheck(str, len);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+ static json_t *pack_object_inter(scanner_t *s, va_list *ap, int need_incref)</span><br><span style="color: hsl(120, 100%, 40%);">+@@ -359,7 +379,7 @@ static json_t *pack_object_inter(scanner_t *s, va_list *ap, int need_incref)</span><br><span style="color: hsl(120, 100%, 40%);">+     next_token(s);</span><br><span style="color: hsl(120, 100%, 40%);">+     ntoken = token(s);</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+-    if (ntoken != '?')</span><br><span style="color: hsl(120, 100%, 40%);">++    if (ntoken != '?' && ntoken != '*')</span><br><span style="color: hsl(120, 100%, 40%);">+         prev_token(s);</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+     json = va_arg(*ap, json_t *);</span><br><span style="color: hsl(120, 100%, 40%);">+diff --git a/test/suites/api/test_pack.c b/test/suites/api/test_pack.c</span><br><span style="color: hsl(120, 100%, 40%);">+index a1e8e01..7e1c0b5 100644</span><br><span style="color: hsl(120, 100%, 40%);">+--- a/test/suites/api/test_pack.c</span><br><span>++++ b/test/suites/api/test_pack.c</span><br><span style="color: hsl(120, 100%, 40%);">+@@ -99,6 +99,16 @@ static void run_tests()</span><br><span style="color: hsl(120, 100%, 40%);">+         fail("json_pack nullable string (NULL case) refcount failed");</span><br><span style="color: hsl(120, 100%, 40%);">+     json_decref(value);</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">++    /* nullable string concatenation */</span><br><span style="color: hsl(120, 100%, 40%);">++    if(json_pack_ex(&error, 0, "s?+", "test", "ing"))</span><br><span style="color: hsl(120, 100%, 40%);">++        fail("json_pack failed to catch invalid format 's?+'");</span><br><span style="color: hsl(120, 100%, 40%);">++    check_error(json_error_invalid_format, "Cannot use '+' on optional strings", "<format>", 1, 2, 2);</span><br><span style="color: hsl(120, 100%, 40%);">++</span><br><span style="color: hsl(120, 100%, 40%);">++    /* nullable string with integer length */</span><br><span style="color: hsl(120, 100%, 40%);">++    if(json_pack_ex(&error, 0, "s?#", "test", 4))</span><br><span style="color: hsl(120, 100%, 40%);">++        fail("json_pack failed to catch invalid format 's?#'");</span><br><span style="color: hsl(120, 100%, 40%);">++    check_error(json_error_invalid_format, "Cannot use '#' on optional strings", "<format>", 1, 2, 2);</span><br><span style="color: hsl(120, 100%, 40%);">++</span><br><span style="color: hsl(120, 100%, 40%);">+     /* string and length (int) */</span><br><span style="color: hsl(120, 100%, 40%);">+     value = json_pack("s#", "test asdf", 4);</span><br><span style="color: hsl(120, 100%, 40%);">+     if(!json_is_string(value) || strcmp("test", json_string_value(value)))</span><br><span style="color: hsl(120, 100%, 40%);">+@@ -247,14 +257,32 @@ static void run_tests()</span><br><span style="color: hsl(120, 100%, 40%);">+     value = json_pack("{s:s,s:o,s:O}", "a", NULL, "b", NULL, "c", NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+     if(value)</span><br><span style="color: hsl(120, 100%, 40%);">+         fail("json_pack object optional incorrectly succeeded");</span><br><span style="color: hsl(120, 100%, 40%);">++</span><br><span style="color: hsl(120, 100%, 40%);">+     value = json_pack("{s:**}", "a", NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+     if(value)</span><br><span style="color: hsl(120, 100%, 40%);">+         fail("json_pack object optional invalid incorrectly succeeded");</span><br><span style="color: hsl(120, 100%, 40%);">++</span><br><span style="color: hsl(120, 100%, 40%);">++    if (json_pack_ex(&error, 0, "{s:i*}", "a", 1))</span><br><span style="color: hsl(120, 100%, 40%);">++        fail("json_pack object optional invalid incorrectly succeeded");</span><br><span style="color: hsl(120, 100%, 40%);">++    check_error(json_error_invalid_format, "Expected format 's', got '*'", "<format>", 1, 5, 5);</span><br><span style="color: hsl(120, 100%, 40%);">++</span><br><span style="color: hsl(120, 100%, 40%);">+     value = json_pack("{s:s*,s:o*,s:O*}", "a", NULL, "b", NULL, "c", NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+     if(!json_is_object(value) || json_object_size(value) != 0)</span><br><span style="color: hsl(120, 100%, 40%);">+         fail("json_pack object optional failed");</span><br><span style="color: hsl(120, 100%, 40%);">+     json_decref(value);</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">++    value = json_pack("{s:s*}", "key", "\xff\xff");</span><br><span style="color: hsl(120, 100%, 40%);">++    if(value)</span><br><span style="color: hsl(120, 100%, 40%);">++        fail("json_pack object optional with invalid UTF-8 incorrectly succeeded");</span><br><span style="color: hsl(120, 100%, 40%);">++</span><br><span style="color: hsl(120, 100%, 40%);">++    if(json_pack_ex(&error, 0, "{s: s*#}", "key", "test", 1))</span><br><span style="color: hsl(120, 100%, 40%);">++        fail("json_pack failed to catch invalid format 's*#'");</span><br><span style="color: hsl(120, 100%, 40%);">++    check_error(json_error_invalid_format, "Cannot use '#' on optional strings", "<format>", 1, 6, 6);</span><br><span style="color: hsl(120, 100%, 40%);">++</span><br><span style="color: hsl(120, 100%, 40%);">++    if(json_pack_ex(&error, 0, "{s: s*+}", "key", "test", "ing"))</span><br><span style="color: hsl(120, 100%, 40%);">++        fail("json_pack failed to catch invalid format 's*+'");</span><br><span style="color: hsl(120, 100%, 40%);">++    check_error(json_error_invalid_format, "Cannot use '+' on optional strings", "<format>", 1, 6, 6);</span><br><span style="color: hsl(120, 100%, 40%);">++</span><br><span style="color: hsl(120, 100%, 40%);">+     /* simple array */</span><br><span style="color: hsl(120, 100%, 40%);">+     value = json_pack("[i,i,i]", 0, 1, 2);</span><br><span style="color: hsl(120, 100%, 40%);">+     if(!json_is_array(value) || json_array_size(value) != 3)</span><br><span style="color: hsl(120, 100%, 40%);">+@@ -272,6 +300,11 @@ static void run_tests()</span><br><span style="color: hsl(120, 100%, 40%);">+     value = json_pack("[s,o,O]", NULL, NULL, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+     if(value)</span><br><span style="color: hsl(120, 100%, 40%);">+         fail("json_pack array optional incorrectly succeeded");</span><br><span style="color: hsl(120, 100%, 40%);">++</span><br><span style="color: hsl(120, 100%, 40%);">++    if (json_pack_ex(&error, 0, "[i*]", 1))</span><br><span style="color: hsl(120, 100%, 40%);">++        fail("json_pack array optional invalid incorrectly succeeded");</span><br><span style="color: hsl(120, 100%, 40%);">++    check_error(json_error_invalid_format, "Unexpected format character '*'", "<format>", 1, 3, 3);</span><br><span style="color: hsl(120, 100%, 40%);">++</span><br><span style="color: hsl(120, 100%, 40%);">+     value = json_pack("[**]", NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+     if(value)</span><br><span style="color: hsl(120, 100%, 40%);">+         fail("json_pack array optional invalid incorrectly succeeded");</span><br><span style="color: hsl(120, 100%, 40%);">+@@ -338,7 +371,7 @@ static void run_tests()</span><br><span style="color: hsl(120, 100%, 40%);">+     /* NULL string */</span><br><span style="color: hsl(120, 100%, 40%);">+     if(json_pack_ex(&error, 0, "s", NULL))</span><br><span style="color: hsl(120, 100%, 40%);">+         fail("json_pack failed to catch null argument string");</span><br><span style="color: hsl(120, 100%, 40%);">+-    check_error(json_error_null_value, "NULL string argument", "<args>", 1, 1, 1);</span><br><span style="color: hsl(120, 100%, 40%);">++    check_error(json_error_null_value, "NULL string", "<args>", 1, 1, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+     /* + on its own */</span><br><span style="color: hsl(120, 100%, 40%);">+     if(json_pack_ex(&error, 0, "+", NULL))</span><br><span style="color: hsl(120, 100%, 40%);">+@@ -353,13 +386,13 @@ static void run_tests()</span><br><span style="color: hsl(120, 100%, 40%);">+     /* NULL key */</span><br><span style="color: hsl(120, 100%, 40%);">+     if(json_pack_ex(&error, 0, "{s:i}", NULL, 1))</span><br><span style="color: hsl(120, 100%, 40%);">+         fail("json_pack failed to catch NULL key");</span><br><span style="color: hsl(120, 100%, 40%);">+-    check_error(json_error_null_value, "NULL string argument", "<args>", 1, 2, 2);</span><br><span style="color: hsl(120, 100%, 40%);">++    check_error(json_error_null_value, "NULL object key", "<args>", 1, 2, 2);</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+     /* NULL value followed by object still steals the object's ref */</span><br><span style="color: hsl(120, 100%, 40%);">+     value = json_incref(json_object());</span><br><span style="color: hsl(120, 100%, 40%);">+     if(json_pack_ex(&error, 0, "{s:s,s:o}", "badnull", NULL, "dontleak", value))</span><br><span style="color: hsl(120, 100%, 40%);">+         fail("json_pack failed to catch NULL value");</span><br><span style="color: hsl(120, 100%, 40%);">+-    check_error(json_error_null_value, "NULL string argument", "<args>", 1, 4, 4);</span><br><span style="color: hsl(120, 100%, 40%);">++    check_error(json_error_null_value, "NULL string", "<args>", 1, 4, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+     if(value->refcount != (size_t)1)</span><br><span style="color: hsl(120, 100%, 40%);">+         fail("json_pack failed to steal reference after error.");</span><br><span style="color: hsl(120, 100%, 40%);">+     json_decref(value);</span><br><span style="color: hsl(120, 100%, 40%);">+@@ -389,6 +422,16 @@ static void run_tests()</span><br><span style="color: hsl(120, 100%, 40%);">+         fail("json_pack failed to catch invalid UTF-8 in a string");</span><br><span style="color: hsl(120, 100%, 40%);">+     check_error(json_error_invalid_utf8, "Invalid UTF-8 string", "<args>", 1, 4, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">++    /* Invalid UTF-8 in an optional '?' string */</span><br><span style="color: hsl(120, 100%, 40%);">++    if(json_pack_ex(&error, 0, "{s:s?}", "foo", "\xff\xff"))</span><br><span style="color: hsl(120, 100%, 40%);">++        fail("json_pack failed to catch invalid UTF-8 in an optional '?' string");</span><br><span style="color: hsl(120, 100%, 40%);">++    check_error(json_error_invalid_utf8, "Invalid UTF-8 string", "<args>", 1, 5, 5);</span><br><span style="color: hsl(120, 100%, 40%);">++</span><br><span style="color: hsl(120, 100%, 40%);">++    /* Invalid UTF-8 in an optional '*' string */</span><br><span style="color: hsl(120, 100%, 40%);">++    if(json_pack_ex(&error, 0, "{s:s*}", "foo", "\xff\xff"))</span><br><span style="color: hsl(120, 100%, 40%);">++        fail("json_pack failed to catch invalid UTF-8 in an optional '*' string");</span><br><span style="color: hsl(120, 100%, 40%);">++    check_error(json_error_invalid_utf8, "Invalid UTF-8 string", "<args>", 1, 5, 5);</span><br><span style="color: hsl(120, 100%, 40%);">++</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Invalid UTF-8 in a concatenated key */</span><br><span style="color: hsl(120, 100%, 40%);">+     if(json_pack_ex(&error, 0, "{s+:i}", "\xff\xff", "concat", 42))</span><br><span style="color: hsl(120, 100%, 40%);">+         fail("json_pack failed to catch invalid UTF-8 in an object key");</span><br><span style="color: hsl(120, 100%, 40%);">+-- </span><br><span style="color: hsl(120, 100%, 40%);">+2.17.1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/third-party/jansson/patches/0030-More-work-on-json_pack-error-reporting.patch b/third-party/jansson/patches/0030-More-work-on-json_pack-error-reporting.patch</span><br><span>new file mode 100644</span><br><span>index 0000000..0624f0b</span><br><span>--- /dev/null</span><br><span>+++ b/third-party/jansson/patches/0030-More-work-on-json_pack-error-reporting.patch</span><br><span>@@ -0,0 +1,180 @@</span><br><span style="color: hsl(120, 100%, 40%);">+From 8d659113d53d7ef60eae6a6e2c5b0ecfc89fc74b Mon Sep 17 00:00:00 2001</span><br><span style="color: hsl(120, 100%, 40%);">+From: Corey Farrell <git@cfware.com></span><br><span style="color: hsl(120, 100%, 40%);">+Date: Tue, 25 Sep 2018 17:34:25 -0400</span><br><span style="color: hsl(120, 100%, 40%);">+Subject: [PATCH 30/30] More work on json_pack error reporting.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+* Remove errant line-feed from pack_object error message.</span><br><span style="color: hsl(120, 100%, 40%);">+* Correct error message in pack_object_inter.</span><br><span style="color: hsl(120, 100%, 40%);">+* Create pack_integer / pack_real to get the correct error messages on</span><br><span style="color: hsl(120, 100%, 40%);">+  failure when packing numeric values.</span><br><span style="color: hsl(120, 100%, 40%);">+* Add tests for packing NAN and infinity directly, in an array and as</span><br><span style="color: hsl(120, 100%, 40%);">+  an object value.</span><br><span style="color: hsl(120, 100%, 40%);">+---</span><br><span style="color: hsl(120, 100%, 40%);">+ src/pack_unpack.c           | 46 +++++++++++++++++++++++++++----</span><br><span style="color: hsl(120, 100%, 40%);">+ test/suites/api/test_pack.c | 54 +++++++++++++++++++++++++++++++++++--</span><br><span style="color: hsl(120, 100%, 40%);">+ 2 files changed, 93 insertions(+), 7 deletions(-)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+diff --git a/src/pack_unpack.c b/src/pack_unpack.c</span><br><span style="color: hsl(120, 100%, 40%);">+index fc98df4..ec04bc3 100644</span><br><span style="color: hsl(120, 100%, 40%);">+--- a/src/pack_unpack.c</span><br><span>++++ b/src/pack_unpack.c</span><br><span style="color: hsl(120, 100%, 40%);">+@@ -261,7 +261,7 @@ static json_t *pack_object(scanner_t *s, va_list *ap)</span><br><span style="color: hsl(120, 100%, 40%);">+                 jsonp_free(key);</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+             if(valueOptional != '*') {</span><br><span style="color: hsl(120, 100%, 40%);">+-                set_error(s, "<args>", json_error_null_value, "NULL object value\n");</span><br><span style="color: hsl(120, 100%, 40%);">++                set_error(s, "<args>", json_error_null_value, "NULL object value");</span><br><span style="color: hsl(120, 100%, 40%);">+                 s->has_error = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+@@ -396,11 +396,47 @@ static json_t *pack_object_inter(scanner_t *s, va_list *ap, int need_incref)</span><br><span style="color: hsl(120, 100%, 40%);">+             break;</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+-    set_error(s, "<args>", json_error_null_value, "NULL object key");</span><br><span style="color: hsl(120, 100%, 40%);">++    set_error(s, "<args>", json_error_null_value, "NULL object");</span><br><span style="color: hsl(120, 100%, 40%);">+     s->has_error = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+     return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">++static json_t *pack_integer(scanner_t *s, json_int_t value)</span><br><span style="color: hsl(120, 100%, 40%);">++{</span><br><span style="color: hsl(120, 100%, 40%);">++    json_t *json = json_integer(value);</span><br><span style="color: hsl(120, 100%, 40%);">++</span><br><span style="color: hsl(120, 100%, 40%);">++    if (!json) {</span><br><span style="color: hsl(120, 100%, 40%);">++        set_error(s, "<internal>", json_error_out_of_memory, "Out of memory");</span><br><span style="color: hsl(120, 100%, 40%);">++        s->has_error = 1;</span><br><span style="color: hsl(120, 100%, 40%);">++    }</span><br><span style="color: hsl(120, 100%, 40%);">++</span><br><span style="color: hsl(120, 100%, 40%);">++    return json;</span><br><span style="color: hsl(120, 100%, 40%);">++}</span><br><span style="color: hsl(120, 100%, 40%);">++</span><br><span style="color: hsl(120, 100%, 40%);">++static json_t *pack_real(scanner_t *s, double value)</span><br><span style="color: hsl(120, 100%, 40%);">++{</span><br><span style="color: hsl(120, 100%, 40%);">++    /* Allocate without setting value so we can identify OOM error. */</span><br><span style="color: hsl(120, 100%, 40%);">++    json_t *json = json_real(0.0);</span><br><span style="color: hsl(120, 100%, 40%);">++</span><br><span style="color: hsl(120, 100%, 40%);">++    if (!json) {</span><br><span style="color: hsl(120, 100%, 40%);">++        set_error(s, "<internal>", json_error_out_of_memory, "Out of memory");</span><br><span style="color: hsl(120, 100%, 40%);">++        s->has_error = 1;</span><br><span style="color: hsl(120, 100%, 40%);">++</span><br><span style="color: hsl(120, 100%, 40%);">++        return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">++    }</span><br><span style="color: hsl(120, 100%, 40%);">++</span><br><span style="color: hsl(120, 100%, 40%);">++    if (json_real_set(json, value)) {</span><br><span style="color: hsl(120, 100%, 40%);">++        json_decref(json);</span><br><span style="color: hsl(120, 100%, 40%);">++</span><br><span style="color: hsl(120, 100%, 40%);">++        set_error(s, "<args>", json_error_numeric_overflow, "Invalid floating point value");</span><br><span style="color: hsl(120, 100%, 40%);">++        s->has_error = 1;</span><br><span style="color: hsl(120, 100%, 40%);">++</span><br><span style="color: hsl(120, 100%, 40%);">++        return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">++    }</span><br><span style="color: hsl(120, 100%, 40%);">++</span><br><span style="color: hsl(120, 100%, 40%);">++    return json;</span><br><span style="color: hsl(120, 100%, 40%);">++}</span><br><span style="color: hsl(120, 100%, 40%);">++</span><br><span style="color: hsl(120, 100%, 40%);">+ static json_t *pack(scanner_t *s, va_list *ap)</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+     switch(token(s)) {</span><br><span style="color: hsl(120, 100%, 40%);">+@@ -420,13 +456,13 @@ static json_t *pack(scanner_t *s, va_list *ap)</span><br><span style="color: hsl(120, 100%, 40%);">+             return va_arg(*ap, int) ? json_true() : json_false();</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+         case 'i': /* integer from int */</span><br><span style="color: hsl(120, 100%, 40%);">+-            return json_integer(va_arg(*ap, int));</span><br><span style="color: hsl(120, 100%, 40%);">++            return pack_integer(s, va_arg(*ap, int));</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+         case 'I': /* integer from json_int_t */</span><br><span style="color: hsl(120, 100%, 40%);">+-            return json_integer(va_arg(*ap, json_int_t));</span><br><span style="color: hsl(120, 100%, 40%);">++            return pack_integer(s, va_arg(*ap, json_int_t));</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+         case 'f': /* real */</span><br><span style="color: hsl(120, 100%, 40%);">+-            return json_real(va_arg(*ap, double));</span><br><span style="color: hsl(120, 100%, 40%);">++            return pack_real(s, va_arg(*ap, double));</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+         case 'O': /* a json_t object; increments refcount */</span><br><span style="color: hsl(120, 100%, 40%);">+             return pack_object_inter(s, ap, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+diff --git a/test/suites/api/test_pack.c b/test/suites/api/test_pack.c</span><br><span style="color: hsl(120, 100%, 40%);">+index 7e1c0b5..ab3aa91 100644</span><br><span style="color: hsl(120, 100%, 40%);">+--- a/test/suites/api/test_pack.c</span><br><span>++++ b/test/suites/api/test_pack.c</span><br><span style="color: hsl(120, 100%, 40%);">+@@ -15,8 +15,39 @@</span><br><span style="color: hsl(120, 100%, 40%);">+ #include <string.h></span><br><span style="color: hsl(120, 100%, 40%);">+ #include <jansson.h></span><br><span style="color: hsl(120, 100%, 40%);">+ #include <stdio.h></span><br><span style="color: hsl(120, 100%, 40%);">++#include <math.h></span><br><span style="color: hsl(120, 100%, 40%);">+ #include "util.h"</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">++#ifdef INFINITY</span><br><span style="color: hsl(120, 100%, 40%);">++// This test triggers "warning C4756: overflow in constant arithmetic"</span><br><span style="color: hsl(120, 100%, 40%);">++// in Visual Studio. This warning is triggered here by design, so disable it.</span><br><span style="color: hsl(120, 100%, 40%);">++// (This can only be done on function level so we keep these tests separate)</span><br><span style="color: hsl(120, 100%, 40%);">++#ifdef _MSC_VER</span><br><span style="color: hsl(120, 100%, 40%);">++#pragma warning(push)</span><br><span style="color: hsl(120, 100%, 40%);">++#pragma warning (disable: 4756)</span><br><span style="color: hsl(120, 100%, 40%);">++#endif</span><br><span style="color: hsl(120, 100%, 40%);">++static void test_inifity()</span><br><span style="color: hsl(120, 100%, 40%);">++{</span><br><span style="color: hsl(120, 100%, 40%);">++    json_error_t error;</span><br><span style="color: hsl(120, 100%, 40%);">++</span><br><span style="color: hsl(120, 100%, 40%);">++    if (json_pack_ex(&error, 0, "f", INFINITY))</span><br><span style="color: hsl(120, 100%, 40%);">++       fail("json_pack infinity incorrectly succeeded");</span><br><span style="color: hsl(120, 100%, 40%);">++    check_error(json_error_numeric_overflow, "Invalid floating point value", "<args>", 1, 1, 1);</span><br><span style="color: hsl(120, 100%, 40%);">++</span><br><span style="color: hsl(120, 100%, 40%);">++    if (json_pack_ex(&error, 0, "[f]", INFINITY))</span><br><span style="color: hsl(120, 100%, 40%);">++       fail("json_pack infinity array element incorrectly succeeded");</span><br><span style="color: hsl(120, 100%, 40%);">++    check_error(json_error_numeric_overflow, "Invalid floating point value", "<args>", 1, 2, 2);</span><br><span style="color: hsl(120, 100%, 40%);">++</span><br><span style="color: hsl(120, 100%, 40%);">++    if (json_pack_ex(&error, 0, "{s:f}", "key", INFINITY))</span><br><span style="color: hsl(120, 100%, 40%);">++       fail("json_pack infinity object value incorrectly succeeded");</span><br><span style="color: hsl(120, 100%, 40%);">++    check_error(json_error_numeric_overflow, "Invalid floating point value", "<args>", 1, 4, 4);</span><br><span style="color: hsl(120, 100%, 40%);">++</span><br><span style="color: hsl(120, 100%, 40%);">++#ifdef _MSC_VER</span><br><span style="color: hsl(120, 100%, 40%);">++#pragma warning(pop)</span><br><span style="color: hsl(120, 100%, 40%);">++#endif</span><br><span style="color: hsl(120, 100%, 40%);">++}</span><br><span style="color: hsl(120, 100%, 40%);">++#endif // INFINITY</span><br><span style="color: hsl(120, 100%, 40%);">++</span><br><span style="color: hsl(120, 100%, 40%);">+ static void run_tests()</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+     json_t *value;</span><br><span style="color: hsl(120, 100%, 40%);">+@@ -313,6 +344,25 @@ static void run_tests()</span><br><span style="color: hsl(120, 100%, 40%);">+         fail("json_pack array optional failed");</span><br><span style="color: hsl(120, 100%, 40%);">+     json_decref(value);</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">++#ifdef NAN</span><br><span style="color: hsl(120, 100%, 40%);">++    /* Invalid float values */</span><br><span style="color: hsl(120, 100%, 40%);">++    if (json_pack_ex(&error, 0, "f", NAN))</span><br><span style="color: hsl(120, 100%, 40%);">++        fail("json_pack NAN incorrectly succeeded");</span><br><span style="color: hsl(120, 100%, 40%);">++    check_error(json_error_numeric_overflow, "Invalid floating point value", "<args>", 1, 1, 1);</span><br><span style="color: hsl(120, 100%, 40%);">++</span><br><span style="color: hsl(120, 100%, 40%);">++    if (json_pack_ex(&error, 0, "[f]", NAN))</span><br><span style="color: hsl(120, 100%, 40%);">++       fail("json_pack NAN array element incorrectly succeeded");</span><br><span style="color: hsl(120, 100%, 40%);">++    check_error(json_error_numeric_overflow, "Invalid floating point value", "<args>", 1, 2, 2);</span><br><span style="color: hsl(120, 100%, 40%);">++</span><br><span style="color: hsl(120, 100%, 40%);">++    if (json_pack_ex(&error, 0, "{s:f}", "key", NAN))</span><br><span style="color: hsl(120, 100%, 40%);">++       fail("json_pack NAN object value incorrectly succeeded");</span><br><span style="color: hsl(120, 100%, 40%);">++    check_error(json_error_numeric_overflow, "Invalid floating point value", "<args>", 1, 4, 4);</span><br><span style="color: hsl(120, 100%, 40%);">++#endif</span><br><span style="color: hsl(120, 100%, 40%);">++</span><br><span style="color: hsl(120, 100%, 40%);">++#ifdef INFINITY</span><br><span style="color: hsl(120, 100%, 40%);">++    test_inifity();</span><br><span style="color: hsl(120, 100%, 40%);">++#endif</span><br><span style="color: hsl(120, 100%, 40%);">++</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Whitespace; regular string */</span><br><span style="color: hsl(120, 100%, 40%);">+     value = json_pack(" s\t ", "test");</span><br><span style="color: hsl(120, 100%, 40%);">+     if(!json_is_string(value) || strcmp("test", json_string_value(value)))</span><br><span style="color: hsl(120, 100%, 40%);">+@@ -439,9 +489,9 @@ static void run_tests()</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+     if(json_pack_ex(&error, 0, "{s:o}", "foo", NULL))</span><br><span style="color: hsl(120, 100%, 40%);">+         fail("json_pack failed to catch nullable object");</span><br><span style="color: hsl(120, 100%, 40%);">+-    check_error(json_error_null_value, "NULL object key", "<args>", 1, 4, 4);</span><br><span style="color: hsl(120, 100%, 40%);">++    check_error(json_error_null_value, "NULL object", "<args>", 1, 4, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+ </span><br><span style="color: hsl(120, 100%, 40%);">+     if(json_pack_ex(&error, 0, "{s:O}", "foo", NULL))</span><br><span style="color: hsl(120, 100%, 40%);">+         fail("json_pack failed to catch nullable incref object");</span><br><span style="color: hsl(120, 100%, 40%);">+-    check_error(json_error_null_value, "NULL object key", "<args>", 1, 4, 4);</span><br><span style="color: hsl(120, 100%, 40%);">++    check_error(json_error_null_value, "NULL object", "<args>", 1, 4, 4);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+-- </span><br><span style="color: hsl(120, 100%, 40%);">+2.17.1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.asterisk.org/10319">change 10319</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.asterisk.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.asterisk.org/10319"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: asterisk </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I045e420d5e73e60639079246e810da6ae21ae22b </div>
<div style="display:none"> Gerrit-Change-Number: 10319 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Corey Farrell <git@cfware.com> </div>