jansson: Backport fixes to bundled, use json_vsprintf if available.
[asterisk/asterisk.git] / third-party / jansson / patches / 0025-Call-va_end-after-va_copy-in-json_vsprintf.patch
1 From 66e4ee795d21a30118f8503c966e9f9ae87db315 Mon Sep 17 00:00:00 2001
2 From: Xin Long <lucien.xin@gmail.com>
3 Date: Wed, 25 Jul 2018 17:39:33 +0800
4 Subject: [PATCH 25/29] Call va_end after va_copy in json_vsprintf
5
6 As said in man doc:
7   "Each  invocation  of va_copy() must be matched by a corresponding
8    invocation of va_end() in the same function."
9
10 va_copy may alloc memory in some system, it's necessay to free it by
11 va_end.
12
13 Fixes: efe6c7b3f2b3 ("Add json_sprintf and json_vsprintf")
14 Signed-off-by: Xin Long <lucien.xin@gmail.com>
15 ---
16  src/value.c | 17 ++++++++++++-----
17  1 file changed, 12 insertions(+), 5 deletions(-)
18
19 diff --git a/src/value.c b/src/value.c
20 index 29a978c..861dce8 100644
21 --- a/src/value.c
22 +++ b/src/value.c
23 @@ -781,26 +781,33 @@ static json_t *json_string_copy(const json_t *string)
24  }
25  
26  json_t *json_vsprintf(const char *fmt, va_list ap) {
27 +    json_t *json = NULL;
28      int length;
29      char *buf;
30      va_list aq;
31      va_copy(aq, ap);
32  
33      length = vsnprintf(NULL, 0, fmt, ap);
34 -    if (length == 0)
35 -        return json_string("");
36 +    if (length == 0) {
37 +        json = json_string("");
38 +        goto out;
39 +    }
40  
41      buf = jsonp_malloc(length + 1);
42      if (!buf)
43 -        return NULL;
44 +        goto out;
45  
46      vsnprintf(buf, length + 1, fmt, aq);
47      if (!utf8_check_string(buf, length)) {
48          jsonp_free(buf);
49 -        return NULL;
50 +        goto out;
51      }
52  
53 -    return jsonp_stringn_nocheck_own(buf, length);
54 +    json = jsonp_stringn_nocheck_own(buf, length);
55 +
56 +out:
57 +    va_end(aq);
58 +    return json;
59  }
60  
61  json_t *json_sprintf(const char *fmt, ...) {
62 -- 
63 2.17.1
64