mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-19 11:42:27 +00:00
104 lines
2.6 KiB
Diff
104 lines
2.6 KiB
Diff
From 15105b66b4df387037b670ac713584194ea10c2f Mon Sep 17 00:00:00 2001
|
|
From: Maxim Zhukov <mussitantesmortem@gmail.com>
|
|
Date: Mon, 12 Mar 2018 17:39:04 +0300
|
|
Subject: [PATCH 17/22] Fix error handling in json_pack
|
|
|
|
Changes to test/ removed.
|
|
|
|
Fixed a bug where the error message was not filled if an empty object
|
|
was passed to the json_pack.
|
|
|
|
Fixes #271
|
|
---
|
|
src/pack_unpack.c | 64 ++++++++++++++++++-------------------
|
|
test/suites/api/test_pack.c | 8 +++++
|
|
2 files changed, 40 insertions(+), 32 deletions(-)
|
|
|
|
diff --git a/src/pack_unpack.c b/src/pack_unpack.c
|
|
index 4026fd9..6461c06 100644
|
|
--- a/src/pack_unpack.c
|
|
+++ b/src/pack_unpack.c
|
|
@@ -348,6 +348,36 @@ static json_t *pack_string(scanner_t *s, va_list *ap)
|
|
}
|
|
}
|
|
|
|
+static json_t *pack_object_inter(scanner_t *s, va_list *ap, int need_incref)
|
|
+{
|
|
+ json_t *json;
|
|
+ char ntoken;
|
|
+
|
|
+ next_token(s);
|
|
+ ntoken = token(s);
|
|
+
|
|
+ if (ntoken != '?')
|
|
+ prev_token(s);
|
|
+
|
|
+ json = va_arg(*ap, json_t *);
|
|
+
|
|
+ if (json)
|
|
+ return need_incref ? json_incref(json) : json;
|
|
+
|
|
+ switch (ntoken) {
|
|
+ case '?':
|
|
+ return json_null();
|
|
+ case '*':
|
|
+ return NULL;
|
|
+ default:
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ set_error(s, "<args>", json_error_null_value, "NULL object key");
|
|
+ s->has_error = 1;
|
|
+ return NULL;
|
|
+}
|
|
+
|
|
static json_t *pack(scanner_t *s, va_list *ap)
|
|
{
|
|
switch(token(s)) {
|
|
@@ -376,40 +406,10 @@ static json_t *pack(scanner_t *s, va_list *ap)
|
|
return json_real(va_arg(*ap, double));
|
|
|
|
case 'O': /* a json_t object; increments refcount */
|
|
- {
|
|
- int nullable;
|
|
- json_t *json;
|
|
-
|
|
- next_token(s);
|
|
- nullable = token(s) == '?';
|
|
- if (!nullable)
|
|
- prev_token(s);
|
|
-
|
|
- json = va_arg(*ap, json_t *);
|
|
- if (!json && nullable) {
|
|
- return json_null();
|
|
- } else {
|
|
- return json_incref(json);
|
|
- }
|
|
- }
|
|
+ return pack_object_inter(s, ap, 1);
|
|
|
|
case 'o': /* a json_t object; doesn't increment refcount */
|
|
- {
|
|
- int nullable;
|
|
- json_t *json;
|
|
-
|
|
- next_token(s);
|
|
- nullable = token(s) == '?';
|
|
- if (!nullable)
|
|
- prev_token(s);
|
|
-
|
|
- json = va_arg(*ap, json_t *);
|
|
- if (!json && nullable) {
|
|
- return json_null();
|
|
- } else {
|
|
- return json;
|
|
- }
|
|
- }
|
|
+ return pack_object_inter(s, ap, 0);
|
|
|
|
default:
|
|
set_error(s, "<format>", json_error_invalid_format, "Unexpected format character '%c'",
|
|
--
|
|
2.17.1
|
|
|