]>
Commit | Line | Data |
---|---|---|
9e72a0ef JK |
1 | From 15105b66b4df387037b670ac713584194ea10c2f Mon Sep 17 00:00:00 2001 |
2 | From: Maxim Zhukov <mussitantesmortem@gmail.com> | |
3 | Date: Mon, 12 Mar 2018 17:39:04 +0300 | |
4 | Subject: [PATCH 17/22] Fix error handling in json_pack | |
5 | ||
6 | Changes to test/ removed. | |
7 | ||
8 | Fixed a bug where the error message was not filled if an empty object | |
9 | was passed to the json_pack. | |
10 | ||
11 | Fixes #271 | |
12 | --- | |
13 | src/pack_unpack.c | 64 ++++++++++++++++++------------------- | |
14 | test/suites/api/test_pack.c | 8 +++++ | |
15 | 2 files changed, 40 insertions(+), 32 deletions(-) | |
16 | ||
17 | diff --git a/src/pack_unpack.c b/src/pack_unpack.c | |
18 | index 4026fd9..6461c06 100644 | |
19 | --- a/src/pack_unpack.c | |
20 | +++ b/src/pack_unpack.c | |
21 | @@ -348,6 +348,36 @@ static json_t *pack_string(scanner_t *s, va_list *ap) | |
22 | } | |
23 | } | |
24 | ||
25 | +static json_t *pack_object_inter(scanner_t *s, va_list *ap, int need_incref) | |
26 | +{ | |
27 | + json_t *json; | |
28 | + char ntoken; | |
29 | + | |
30 | + next_token(s); | |
31 | + ntoken = token(s); | |
32 | + | |
33 | + if (ntoken != '?') | |
34 | + prev_token(s); | |
35 | + | |
36 | + json = va_arg(*ap, json_t *); | |
37 | + | |
38 | + if (json) | |
39 | + return need_incref ? json_incref(json) : json; | |
40 | + | |
41 | + switch (ntoken) { | |
42 | + case '?': | |
43 | + return json_null(); | |
44 | + case '*': | |
45 | + return NULL; | |
46 | + default: | |
47 | + break; | |
48 | + } | |
49 | + | |
50 | + set_error(s, "<args>", json_error_null_value, "NULL object key"); | |
51 | + s->has_error = 1; | |
52 | + return NULL; | |
53 | +} | |
54 | + | |
55 | static json_t *pack(scanner_t *s, va_list *ap) | |
56 | { | |
57 | switch(token(s)) { | |
58 | @@ -376,40 +406,10 @@ static json_t *pack(scanner_t *s, va_list *ap) | |
59 | return json_real(va_arg(*ap, double)); | |
60 | ||
61 | case 'O': /* a json_t object; increments refcount */ | |
62 | - { | |
63 | - int nullable; | |
64 | - json_t *json; | |
65 | - | |
66 | - next_token(s); | |
67 | - nullable = token(s) == '?'; | |
68 | - if (!nullable) | |
69 | - prev_token(s); | |
70 | - | |
71 | - json = va_arg(*ap, json_t *); | |
72 | - if (!json && nullable) { | |
73 | - return json_null(); | |
74 | - } else { | |
75 | - return json_incref(json); | |
76 | - } | |
77 | - } | |
78 | + return pack_object_inter(s, ap, 1); | |
79 | ||
80 | case 'o': /* a json_t object; doesn't increment refcount */ | |
81 | - { | |
82 | - int nullable; | |
83 | - json_t *json; | |
84 | - | |
85 | - next_token(s); | |
86 | - nullable = token(s) == '?'; | |
87 | - if (!nullable) | |
88 | - prev_token(s); | |
89 | - | |
90 | - json = va_arg(*ap, json_t *); | |
91 | - if (!json && nullable) { | |
92 | - return json_null(); | |
93 | - } else { | |
94 | - return json; | |
95 | - } | |
96 | - } | |
97 | + return pack_object_inter(s, ap, 0); | |
98 | ||
99 | default: | |
100 | set_error(s, "<format>", json_error_invalid_format, "Unexpected format character '%c'", | |
101 | -- | |
102 | 2.17.1 | |
103 |