226c40416387083f06e61312fbd3b50579bef4bc
[asterisk/asterisk.git] / third-party / jansson / patches / 0001-Improve-test-coverage.patch
1 From 73c22de51672cb40fdc29c95331923d4dcebb6fa Mon Sep 17 00:00:00 2001
2 From: Corey Farrell <git@cfware.com>
3 Date: Tue, 13 Feb 2018 04:35:37 -0500
4 Subject: [PATCH 01/22] Improve test coverage.
5
6 Changes to test/ removed for bundled use in Asterisk.
7
8 * Test equality of different length strings.
9 * Add tab to json_pack whitespace test.
10 * Test json_sprintf with empty result and invalid UTF.
11 * Test json_get_alloc_funcs with NULL arguments.
12 * Test invalid arguments.
13 * Add test_chaos to test allocation failure code paths.
14 * Remove redundant json_is_string checks from json_string_equal and
15   json_string_copy.  Both functions are static and can only be called
16   with a json string.
17
18 Fixes to issues found by test_chaos:
19 * Fix crash on OOM in pack_unpack.c:read_string().
20 * Unconditionally free string in string_create upon allocation failure.
21   Update load.c:parse_value() to reflect this.  This resolves a leak on
22   allocation failure for pack_unpack.c:pack_string() and
23   value.c:json_sprintf().
24
25 Although not visible from CodeCoverage these changes significantly
26 increase branch coverage.  Especially in src/value.c where we previously
27 covered 67.4% of branches and now cover 96.3% of branches.
28 ---
29  CMakeLists.txt                      |   1 +
30  src/load.c                          |   6 +-
31  src/pack_unpack.c                   |   5 +-
32  src/value.c                         |   9 +-
33  test/.gitignore                     |   1 +
34  test/suites/api/Makefile.am         |   2 +
35  test/suites/api/test_array.c        |  73 +++++++++++++++++
36  test/suites/api/test_chaos.c        | 115 ++++++++++++++++++++++++++
37  test/suites/api/test_equal.c        |   7 ++
38  test/suites/api/test_memory_funcs.c |   7 ++
39  test/suites/api/test_number.c       |  36 ++++++++
40  test/suites/api/test_object.c       | 122 ++++++++++++++++++++++++++++
41  test/suites/api/test_pack.c         |  10 ++-
42  test/suites/api/test_simple.c       |  52 ++++++++++++
43  test/suites/api/test_sprintf.c      |  12 +++
44  15 files changed, 444 insertions(+), 14 deletions(-)
45  create mode 100644 test/suites/api/test_chaos.c
46
47 diff --git a/CMakeLists.txt b/CMakeLists.txt
48 index 16cf552..2f6cfec 100644
49 --- a/CMakeLists.txt
50 +++ b/CMakeLists.txt
51 @@ -487,6 +487,7 @@ if (NOT JANSSON_WITHOUT_TESTS)
52     set(api_tests
53           test_array
54           test_copy
55 +         test_chaos
56           test_dump
57           test_dump_callback
58           test_equal
59 diff --git a/src/load.c b/src/load.c
60 index deb36f3..25efe2e 100644
61 --- a/src/load.c
62 +++ b/src/load.c
63 @@ -829,10 +829,8 @@ static json_t *parse_value(lex_t *lex, size_t flags, json_error_t *error)
64              }
65  
66              json = jsonp_stringn_nocheck_own(value, len);
67 -            if(json) {
68 -                lex->value.string.val = NULL;
69 -                lex->value.string.len = 0;
70 -            }
71 +            lex->value.string.val = NULL;
72 +            lex->value.string.len = 0;
73              break;
74          }
75  
76 diff --git a/src/pack_unpack.c b/src/pack_unpack.c
77 index 153f64d..19dbf93 100644
78 --- a/src/pack_unpack.c
79 +++ b/src/pack_unpack.c
80 @@ -159,7 +159,10 @@ static char *read_string(scanner_t *s, va_list *ap,
81          return (char *)str;
82      }
83  
84 -    strbuffer_init(&strbuff);
85 +    if(strbuffer_init(&strbuff)) {
86 +        set_error(s, "<internal>", json_error_out_of_memory, "Out of memory");
87 +        s->has_error = 1;
88 +    }
89  
90      while(1) {
91          str = va_arg(*ap, const char *);
92 diff --git a/src/value.c b/src/value.c
93 index b3b3141..29a978c 100644
94 --- a/src/value.c
95 +++ b/src/value.c
96 @@ -652,8 +652,7 @@ static json_t *string_create(const char *value, size_t len, int own)
97  
98      string = jsonp_malloc(sizeof(json_string_t));
99      if(!string) {
100 -        if(!own)
101 -            jsonp_free(v);
102 +        jsonp_free(v);
103          return NULL;
104      }
105      json_init(&string->json, JSON_STRING);
106 @@ -768,9 +767,6 @@ static int json_string_equal(const json_t *string1, const json_t *string2)
107  {
108      json_string_t *s1, *s2;
109  
110 -    if(!json_is_string(string1) || !json_is_string(string2))
111 -        return 0;
112 -
113      s1 = json_to_string(string1);
114      s2 = json_to_string(string2);
115      return s1->length == s2->length && !memcmp(s1->value, s2->value, s1->length);
116 @@ -780,9 +776,6 @@ static json_t *json_string_copy(const json_t *string)
117  {
118      json_string_t *s;
119  
120 -    if(!json_is_string(string))
121 -        return NULL;
122 -
123      s = json_to_string(string);
124      return json_stringn_nocheck(s->value, s->length);
125  }
126 -- 
127 2.17.1
128