Merge "stasis: Remove stringfields and lock from change message."
[asterisk/asterisk.git] / third-party / jansson / patches / 0030-More-work-on-json_pack-error-reporting.patch
1 From 8d659113d53d7ef60eae6a6e2c5b0ecfc89fc74b Mon Sep 17 00:00:00 2001
2 From: Corey Farrell <git@cfware.com>
3 Date: Tue, 25 Sep 2018 17:34:25 -0400
4 Subject: [PATCH 30/30] More work on json_pack error reporting.
5
6 Test updates have been removed for easier merging for bundled build.
7
8 * Remove errant line-feed from pack_object error message.
9 * Correct error message in pack_object_inter.
10 * Create pack_integer / pack_real to get the correct error messages on
11   failure when packing numeric values.
12 * Add tests for packing NAN and infinity directly, in an array and as
13   an object value.
14 ---
15  src/pack_unpack.c           | 46 +++++++++++++++++++++++++++----
16  test/suites/api/test_pack.c | 54 +++++++++++++++++++++++++++++++++++--
17  2 files changed, 93 insertions(+), 7 deletions(-)
18
19 diff --git a/src/pack_unpack.c b/src/pack_unpack.c
20 index fc98df4..ec04bc3 100644
21 --- a/src/pack_unpack.c
22 +++ b/src/pack_unpack.c
23 @@ -261,7 +261,7 @@ static json_t *pack_object(scanner_t *s, va_list *ap)
24                  jsonp_free(key);
25  
26              if(valueOptional != '*') {
27 -                set_error(s, "<args>", json_error_null_value, "NULL object value\n");
28 +                set_error(s, "<args>", json_error_null_value, "NULL object value");
29                  s->has_error = 1;
30              }
31  
32 @@ -396,11 +396,47 @@ static json_t *pack_object_inter(scanner_t *s, va_list *ap, int need_incref)
33              break;
34      }
35  
36 -    set_error(s, "<args>", json_error_null_value, "NULL object key");
37 +    set_error(s, "<args>", json_error_null_value, "NULL object");
38      s->has_error = 1;
39      return NULL;
40  }
41  
42 +static json_t *pack_integer(scanner_t *s, json_int_t value)
43 +{
44 +    json_t *json = json_integer(value);
45 +
46 +    if (!json) {
47 +        set_error(s, "<internal>", json_error_out_of_memory, "Out of memory");
48 +        s->has_error = 1;
49 +    }
50 +
51 +    return json;
52 +}
53 +
54 +static json_t *pack_real(scanner_t *s, double value)
55 +{
56 +    /* Allocate without setting value so we can identify OOM error. */
57 +    json_t *json = json_real(0.0);
58 +
59 +    if (!json) {
60 +        set_error(s, "<internal>", json_error_out_of_memory, "Out of memory");
61 +        s->has_error = 1;
62 +
63 +        return NULL;
64 +    }
65 +
66 +    if (json_real_set(json, value)) {
67 +        json_decref(json);
68 +
69 +        set_error(s, "<args>", json_error_numeric_overflow, "Invalid floating point value");
70 +        s->has_error = 1;
71 +
72 +        return NULL;
73 +    }
74 +
75 +    return json;
76 +}
77 +
78  static json_t *pack(scanner_t *s, va_list *ap)
79  {
80      switch(token(s)) {
81 @@ -420,13 +456,13 @@ static json_t *pack(scanner_t *s, va_list *ap)
82              return va_arg(*ap, int) ? json_true() : json_false();
83  
84          case 'i': /* integer from int */
85 -            return json_integer(va_arg(*ap, int));
86 +            return pack_integer(s, va_arg(*ap, int));
87  
88          case 'I': /* integer from json_int_t */
89 -            return json_integer(va_arg(*ap, json_int_t));
90 +            return pack_integer(s, va_arg(*ap, json_int_t));
91  
92          case 'f': /* real */
93 -            return json_real(va_arg(*ap, double));
94 +            return pack_real(s, va_arg(*ap, double));
95  
96          case 'O': /* a json_t object; increments refcount */
97              return pack_object_inter(s, ap, 1);
98 -- 
99 2.17.1
100