update to json-c-0.15

This commit is contained in:
shirely16 2021-09-14 11:34:28 +08:00
parent b3bfacad79
commit 7bba4a6b7e
16 changed files with 40 additions and 1141 deletions

View File

@ -1,68 +0,0 @@
From 485f2a02c79da8a7b31e972f0c652f06094bcfb9 Mon Sep 17 00:00:00 2001
From: Eric Haszlakiewicz <erh+git@nimenees.com>
Date: Tue, 28 May 2019 02:44:22 +0000
Subject: [PATCH 2/5] Issue #486: append a missing ".0" to negative double
values too.
---
json_object.c | 11 ++++++++---
tests/test_double_serializer.c | 4 ++++
tests/test_double_serializer.expected | 1 +
3 files changed, 13 insertions(+), 3 deletions(-)
diff --git a/json_object.c b/json_object.c
index 344af51..026dab3 100644
--- a/json_object.c
+++ b/json_object.c
@@ -810,6 +810,7 @@ static int json_object_double_to_json_string_format(struct json_object* jso,
{
const char *std_format = "%.17g";
int format_drops_decimals = 0;
+ int looks_numeric = 0;
if (!format)
{
@@ -837,11 +838,15 @@ static int json_object_double_to_json_string_format(struct json_object* jso,
if (format == std_format || strstr(format, ".0f") == NULL)
format_drops_decimals = 1;
+ looks_numeric = /* Looks like *some* kind of number */
+ isdigit((unsigned char)buf[0]) ||
+ (size > 1 && buf[0] == '-' && isdigit((unsigned char)buf[1]));
+
if (size < (int)sizeof(buf) - 2 &&
- isdigit((unsigned char)buf[0]) && /* Looks like *some* kind of number */
- !p && /* Has no decimal point */
+ looks_numeric &&
+ !p && /* Has no decimal point */
strchr(buf, 'e') == NULL && /* Not scientific notation */
- format_drops_decimals)
+ format_drops_decimals)
{
// Ensure it looks like a float, even if snprintf didn't,
// unless a custom format is set to omit the decimal.
diff --git a/tests/test_double_serializer.c b/tests/test_double_serializer.c
index 0f7a60e..21612c8 100644
--- a/tests/test_double_serializer.c
+++ b/tests/test_double_serializer.c
@@ -74,4 +74,8 @@ int main()
printf("ERROR: json_c_set_serialization_double_format() failed");
json_object_put(obj);
+
+ obj = json_object_new_double(-12.0);
+ printf("obj(-12.0).to_string(default format)=%s\n", json_object_to_json_string(obj));
+
}
diff --git a/tests/test_double_serializer.expected b/tests/test_double_serializer.expected
index 98eea1e..d3aef72 100644
--- a/tests/test_double_serializer.expected
+++ b/tests/test_double_serializer.expected
@@ -16,3 +16,4 @@ obj(12.0).to_string(default format)=12.0
obj(12.0).to_string(%.0f)=12
obj(12.0).to_string(%.0g)=1e+01
obj(12.0).to_string(%.1g)=12.0
+obj(-12.0).to_string(default format)=-12.0
--
1.8.3.1

View File

@ -1,41 +0,0 @@
From c233f5c05e92909a764973524a03471bfad78f09 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82@fedoraproject.org>
Date: Sat, 16 Dec 2017 17:09:39 +0100
Subject: [PATCH 12/56] json_object_private: Use unsigned 32-bit integer type
for refcount
---
json_object.c | 3 +++
json_object_private.h | 2 +-
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/json_object.c b/json_object.c
index 7c7438d..da96f4c 100644
--- a/json_object.c
+++ b/json_object.c
@@ -169,6 +169,9 @@ extern struct json_object* json_object_get(struct json_object *jso)
{
if (!jso) return jso;
+ // Don't overflow the refcounter.
+ assert(jso->_ref_count < UINT_FAST32_MAX);
+
#if defined(HAVE_ATOMIC_BUILTINS) && defined(ENABLE_THREADING)
__sync_add_and_fetch(&jso->_ref_count, 1);
#else
diff --git a/json_object_private.h b/json_object_private.h
index 53be70d..51134b6 100644
--- a/json_object_private.h
+++ b/json_object_private.h
@@ -29,7 +29,7 @@ struct json_object
enum json_type o_type;
json_object_private_delete_fn *_delete;
json_object_to_json_string_fn *_to_json_string;
- int _ref_count;
+ uint_fast32_t _ref_count;
struct printbuf *_pb;
union data {
json_bool c_boolean;
--
1.8.3.1

View File

@ -1,36 +0,0 @@
From e8cec5c9e47676ebc51f1ab0af904fc4417b2166 Mon Sep 17 00:00:00 2001
From: Darjan Krijan <darjan_krijan@gmx.de>
Date: Tue, 20 Nov 2018 22:21:27 +0100
Subject: [PATCH 40/56] Fixed misalignment in JSON string due to space after \n
being printed when choosing JSON_C_TO_STRING_SPACED together with
JSON_C_TO_STRING_PRETTY in json_object_array_to_json_string
---
json_object.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/json_object.c b/json_object.c
index 8a86bc6..19f9c83 100644
--- a/json_object.c
+++ b/json_object.c
@@ -395,7 +395,7 @@ static int json_object_object_to_json_string(struct json_object* jso,
printbuf_strappend(pb, "\n");
}
had_children = 1;
- if (flags & JSON_C_TO_STRING_SPACED)
+ if (flags & JSON_C_TO_STRING_SPACED && !(flags & JSON_C_TO_STRING_PRETTY))
printbuf_strappend(pb, " ");
indent(pb, level+1, flags);
printbuf_strappend(pb, "\"");
@@ -416,7 +416,7 @@ static int json_object_object_to_json_string(struct json_object* jso,
printbuf_strappend(pb, "\n");
indent(pb,level,flags);
}
- if (flags & JSON_C_TO_STRING_SPACED)
+ if (flags & JSON_C_TO_STRING_SPACED && !(flags & JSON_C_TO_STRING_PRETTY))
return printbuf_strappend(pb, /*{*/ " }");
else
return printbuf_strappend(pb, /*{*/ "}");
--
1.8.3.1

View File

@ -1,63 +0,0 @@
From 506a32d4ab2acbdf2315719c2ae74c40c616670b Mon Sep 17 00:00:00 2001
From: andy5995 <andy400-dev@yahoo.com>
Date: Mon, 26 Nov 2018 21:12:06 -0600
Subject: [PATCH 48/56] json_object.c:set errno in json_object_get_double()
closes #422
---
json_object.c | 11 +++++++++--
json_tokener.h | 2 +-
2 files changed, 10 insertions(+), 3 deletions(-)
diff --git a/json_object.c b/json_object.c
index 8a86bc6..4b2b014 100644
--- a/json_object.c
+++ b/json_object.c
@@ -951,7 +951,10 @@ double json_object_get_double(const struct json_object *jso)
/* if conversion stopped at the first character, return 0.0 */
if (errPtr == get_string_component(jso))
- return 0.0;
+ {
+ errno = EINVAL;
+ return 0.0;
+ }
/*
* Check that the conversion terminated on something sensible
@@ -959,7 +962,10 @@ double json_object_get_double(const struct json_object *jso)
* For example, { "pay" : 123AB } would parse as 123.
*/
if (*errPtr != '\0')
- return 0.0;
+ {
+ errno = EINVAL;
+ return 0.0;
+ }
/*
* If strtod encounters a string which would exceed the
@@ -977,6 +983,7 @@ double json_object_get_double(const struct json_object *jso)
cdouble = 0.0;
return cdouble;
default:
+ errno = EINVAL;
return 0.0;
}
}
diff --git a/json_tokener.h b/json_tokener.h
index 8bcc6b6..4801c65 100644
--- a/json_tokener.h
+++ b/json_tokener.h
@@ -122,7 +122,7 @@ const char *json_tokener_error_desc(enum json_tokener_error jerr);
* When parsing a JSON string in pieces, if the tokener is in the middle
* of parsing this will return json_tokener_continue.
*
- * See also json_tokener_error_desc().
+ * @see json_tokener_error_desc().
*/
JSON_EXPORT enum json_tokener_error json_tokener_get_error(struct json_tokener *tok);
--
1.8.3.1

View File

@ -1,138 +0,0 @@
From 3003161effc3286b749010ada9182b79dbfe8c57 Mon Sep 17 00:00:00 2001
From: Rubasri Kalidas <rubasri.kalidas@intel.com>
Date: Tue, 18 Dec 2018 11:30:57 -0600
Subject: [PATCH 53/56] Fix compiler warnings
---
linkhash.c | 4 ++++
random_seed.c | 24 ++++++++++++------------
random_seed.h | 2 +-
3 files changed, 17 insertions(+), 13 deletions(-)
diff --git a/linkhash.c b/linkhash.c
index b1223c4..f324a10 100644
--- a/linkhash.c
+++ b/linkhash.c
@@ -36,6 +36,10 @@ static unsigned long lh_char_hash(const void *k);
static unsigned long lh_perllike_str_hash(const void *k);
static lh_hash_fn *char_hash_fn = lh_char_hash;
+/* comparison functions */
+int lh_char_equal(const void *k1, const void *k2);
+int lh_ptr_equal(const void *k1, const void *k2);
+
int
json_global_set_string_hash(const int h)
{
diff --git a/random_seed.c b/random_seed.c
index 3232777..97d9547 100644
--- a/random_seed.c
+++ b/random_seed.c
@@ -53,7 +53,7 @@ static void do_cpuid(int regs[], int h)
#if HAS_X86_CPUID
-static int has_rdrand()
+static int has_rdrand(void)
{
// CPUID.01H:ECX.RDRAND[bit 30] == 1
int regs[4];
@@ -69,7 +69,7 @@ static int has_rdrand()
#define HAVE_RDRAND 1
-static int get_rdrand_seed()
+static int get_rdrand_seed(void)
{
DEBUG_SEED("get_rdrand_seed");
int _eax;
@@ -91,7 +91,7 @@ static int get_rdrand_seed()
/* get_rdrand_seed - Visual Studio 2012 and above */
-static int get_rdrand_seed()
+static int get_rdrand_seed(void)
{
DEBUG_SEED("get_rdrand_seed");
int r;
@@ -104,7 +104,7 @@ static int get_rdrand_seed()
/* get_rdrand_seed - Visual Studio 2010 and below - x86 only */
-static int get_rdrand_seed()
+static int get_rdrand_seed(void)
{
DEBUG_SEED("get_rdrand_seed");
int _eax;
@@ -136,7 +136,7 @@ retry:
static const char *dev_random_file = "/dev/urandom";
-static int has_dev_urandom()
+static int has_dev_urandom(void)
{
struct stat buf;
if (stat(dev_random_file, &buf)) {
@@ -148,7 +148,7 @@ static int has_dev_urandom()
/* get_dev_random_seed */
-static int get_dev_random_seed()
+static int get_dev_random_seed(void)
{
DEBUG_SEED("get_dev_random_seed");
@@ -184,7 +184,7 @@ static int get_dev_random_seed()
#pragma comment(lib, "advapi32.lib")
#endif
-static int get_cryptgenrandom_seed()
+static int get_cryptgenrandom_seed(void)
{
HCRYPTPROV hProvider = 0;
int r;
@@ -213,7 +213,7 @@ static int get_cryptgenrandom_seed()
#include <time.h>
-static int get_time_seed()
+static int get_time_seed(void)
{
DEBUG_SEED("get_time_seed");
@@ -223,15 +223,15 @@ static int get_time_seed()
/* json_c_get_random_seed */
-int json_c_get_random_seed()
+int json_c_get_random_seed(void)
{
-#if HAVE_RDRAND
+#if defined HAVE_RDRAND && HAVE_RDRAND
if (has_rdrand()) return get_rdrand_seed();
#endif
-#if HAVE_DEV_RANDOM
+#if defined HAVE_DEV_RANDOM && HAVE_DEV_RANDOM
if (has_dev_urandom()) return get_dev_random_seed();
#endif
-#if HAVE_CRYPTGENRANDOM
+#if defined HAVE_CRYPTGENRANDOM && HAVE_CRYPTGENRANDOM
return get_cryptgenrandom_seed();
#endif
return get_time_seed();
diff --git a/random_seed.h b/random_seed.h
index 2f43dad..72ee5f6 100644
--- a/random_seed.h
+++ b/random_seed.h
@@ -20,7 +20,7 @@
extern "C" {
#endif
-extern int json_c_get_random_seed();
+extern int json_c_get_random_seed(void);
#ifdef __cplusplus
}
--
1.8.3.1

File diff suppressed because one or more lines are too long

View File

@ -1,70 +0,0 @@
From 4d36b0287d3ab0912ba8a4790340ca099960b2b0 Mon Sep 17 00:00:00 2001
From: Tudor Brindus <me@tbrindus.ca>
Date: Fri, 1 May 2020 21:09:22 -0400
Subject: [PATCH] Detect broken RDRAND during initialization
Some CPUs advertise RDRAND in CPUID, but return 0xFFFFFFFF
unconditionally. To avoid locking up later, test RDRAND during
initialization, and if it returns 0xFFFFFFFF, mark it as nonexistent.
Fixes #588.
Conflict:NA
Reference:https://github.com/json-c/json-c/commit/4d36b0287d3ab0912ba8a4790340ca099960b2b0
---
random_seed.c | 37 +++++++++++++++++++++++++++++++++----
1 file changed, 33 insertions(+), 4 deletions(-)
diff --git a/random_seed.c b/random_seed.c
index 97d9547..b97dbd1 100644
--- a/random_seed.c
+++ b/random_seed.c
@@ -53,12 +53,41 @@ static void do_cpuid(int regs[], int h)
#if HAS_X86_CPUID
+static int get_rdrand_seed(void);
+
+// Valid values are -1 (haven't tested), 0 (no), and 1 (yes).
+static int _has_rdrand = -1;
+
static int has_rdrand(void)
{
- // CPUID.01H:ECX.RDRAND[bit 30] == 1
- int regs[4];
- do_cpuid(regs, 1);
- return (regs[2] & (1 << 30)) != 0;
+ if (_has_rdrand == -1)
+ {
+ // CPUID.01H:ECX.RDRAND[bit 30] == 1
+ int regs[4];
+ do_cpuid(regs, 1);
+ if (!(regs[2] & (1 << 30)))
+ {
+ _has_rdrand = 0;
+ } else
+ {
+ // Some CPUs advertise RDRAND in CPUID, but return 0xFFFFFFFF
+ // unconditionally. To avoid locking up later, test RDRAND here. If over
+ // 10 trials RDRAND has returned the same value, declare it broken.
+ _has_rdrand = 0;
+ int prev = get_rdrand_seed();
+ for (int i = 0; i < 10; i++) {
+ int temp = get_rdrand_seed();
+ if (temp != prev) {
+ _has_rdrand = 1;
+ break;
+ }
+
+ prev = temp;
+ }
+ }
+ }
+
+ return _has_rdrand;
}
#endif
--
2.27.0

View File

@ -1,118 +0,0 @@
From 80863140263be5f2dc630938ed8f0066f8a1ab43 Mon Sep 17 00:00:00 2001
From: Eric Haszlakiewicz <erh+git@nimenees.com>
Date: Mon, 4 May 2020 01:29:02 +0000
Subject: [PATCH] Issue #589: drop the rdrand test loops to just 3, tweak
comments and add some links to bug reports, and decrease the nesting level of
the has_rdrand() function.
Conflict:NA
Reference:https://github.com/json-c/json-c/commit/80863140263be5f2dc630938ed8f0066f8a1ab43
---
random_seed.c | 63 +++++++++++++++++++++++++++++++--------------------
1 file changed, 38 insertions(+), 25 deletions(-)
diff --git a/random_seed.c b/random_seed.c
index b97dbd1..8bbc467 100644
--- a/random_seed.c
+++ b/random_seed.c
@@ -55,36 +55,45 @@ static void do_cpuid(int regs[], int h)
static int get_rdrand_seed(void);
-// Valid values are -1 (haven't tested), 0 (no), and 1 (yes).
+/* Valid values are -1 (haven't tested), 0 (no), and 1 (yes). */
static int _has_rdrand = -1;
static int has_rdrand(void)
{
- if (_has_rdrand == -1)
+ if (_has_rdrand != -1)
{
- // CPUID.01H:ECX.RDRAND[bit 30] == 1
- int regs[4];
- do_cpuid(regs, 1);
- if (!(regs[2] & (1 << 30)))
- {
- _has_rdrand = 0;
- } else
+ return _has_rdrand;
+ }
+
+ /* CPUID.01H:ECX.RDRAND[bit 30] == 1 */
+ int regs[4];
+ do_cpuid(regs, 1);
+ if (!(regs[2] & (1 << 30)))
+ {
+ _has_rdrand = 0;
+ return 0;
+ }
+
+ /*
+ * Some CPUs advertise RDRAND in CPUID, but return 0xFFFFFFFF
+ * unconditionally. To avoid locking up later, test RDRAND here. If over
+ * 3 trials RDRAND has returned the same value, declare it broken.
+ * Example CPUs are AMD Ryzen 3000 series
+ * and much older AMD APUs, such as the E1-1500
+ * https://github.com/systemd/systemd/issues/11810
+ * https://linuxreviews.org/RDRAND_stops_returning_random_values_on_older_AMD_CPUs_after_suspend
+ */
+ _has_rdrand = 0;
+ int prev = get_rdrand_seed();
+ for (int i = 0; i < 3; i++)
+ {
+ int temp = get_rdrand_seed();
+ if (temp != prev)
{
- // Some CPUs advertise RDRAND in CPUID, but return 0xFFFFFFFF
- // unconditionally. To avoid locking up later, test RDRAND here. If over
- // 10 trials RDRAND has returned the same value, declare it broken.
- _has_rdrand = 0;
- int prev = get_rdrand_seed();
- for (int i = 0; i < 10; i++) {
- int temp = get_rdrand_seed();
- if (temp != prev) {
- _has_rdrand = 1;
- break;
- }
-
- prev = temp;
- }
+ _has_rdrand = 1;
+ break;
}
+ prev = temp;
}
return _has_rdrand;
@@ -102,7 +111,7 @@ static int get_rdrand_seed(void)
{
DEBUG_SEED("get_rdrand_seed");
int _eax;
- // rdrand eax
+ /* rdrand eax */
__asm__ __volatile__("1: .byte 0x0F\n"
" .byte 0xC7\n"
" .byte 0xF0\n"
@@ -138,7 +147,7 @@ static int get_rdrand_seed(void)
DEBUG_SEED("get_rdrand_seed");
int _eax;
retry:
- // rdrand eax
+ /* rdrand eax */
__asm _emit 0x0F __asm _emit 0xC7 __asm _emit 0xF0
__asm jnc retry
__asm mov _eax, eax
@@ -208,6 +217,10 @@ static int get_dev_random_seed(void)
#define HAVE_CRYPTGENRANDOM 1
#include <windows.h>
+
+/* Caution: these blank lines must remain so clang-format doesn't reorder
+ includes to put windows.h after wincrypt.h */
+
#include <wincrypt.h>
#ifndef __GNUC__
#pragma comment(lib, "advapi32.lib")
--
2.27.0

View File

@ -1,11 +0,0 @@
diff -Nur json-c-json-c-0.11-20130402_orig/config.sub json-c-json-c-0.11-20130402//config.sub
--- json-c-json-c-0.11-20130402_orig/config.sub 2017-10-25 18:54:05.000000000 +0800
+++ json-c-json-c-0.11-20130402//config.sub 2017-10-25 19:25:49.000000000 +0800
@@ -250,6 +250,7 @@
| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
| avr | avr32 \
| be32 | be64 \
+ | aarch64_[bl]e-linux | aarch64_[bl]e-euler \
| bfin \
| c4x | c8051 | clipper \
| d10v | d30v | dlx | dsp16xx \

Binary file not shown.

View File

@ -1,61 +0,0 @@
From f8c632f579c71012f9aca81543b880a579f634fc Mon Sep 17 00:00:00 2001
From: Eric Haszlakiewicz <erh+git@nimenees.com>
Date: Sun, 25 Mar 2018 18:25:58 -0400
Subject: [PATCH] Issue #407: fix incorrect casts in calls to ctype functions
(isdigit and isspace) so we don't crash when asserts are enabled on certain
platforms and characters > 128 are parsed.
---
json_object.c | 2 +-
json_pointer.c | 4 ++--
json_tokener.c | 2 +-
3 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/json_object.c b/json_object.c
index 8287163a1c..8a86bc6ea0 100644
--- a/json_object.c
+++ b/json_object.c
@@ -838,7 +838,7 @@ static int json_object_double_to_json_string_format(struct json_object* jso,
format_drops_decimals = 1;
if (size < (int)sizeof(buf) - 2 &&
- isdigit((int)buf[0]) && /* Looks like *some* kind of number */
+ isdigit((unsigned char)buf[0]) && /* Looks like *some* kind of number */
!p && /* Has no decimal point */
strchr(buf, 'e') == NULL && /* Not scientific notation */
format_drops_decimals)
diff --git a/json_pointer.c b/json_pointer.c
index 2b2a9ef507..c7e34f76f3 100644
--- a/json_pointer.c
+++ b/json_pointer.c
@@ -44,7 +44,7 @@ static int is_valid_index(struct json_object *jo, const char *path, int32_t *idx
/* this code-path optimizes a bit, for when we reference the 0-9 index range in a JSON array
and because leading zeros not allowed */
if (len == 1) {
- if (isdigit((int)path[0])) {
+ if (isdigit((unsigned char)path[0])) {
*idx = (path[0] - '0');
goto check_oob;
}
@@ -58,7 +58,7 @@ static int is_valid_index(struct json_object *jo, const char *path, int32_t *idx
}
/* RFC states base-10 decimals */
for (i = 0; i < len; i++) {
- if (!isdigit((int)path[i])) {
+ if (!isdigit((unsigned char)path[i])) {
errno = EINVAL;
return 0;
}
diff --git a/json_tokener.c b/json_tokener.c
index 449a82da6f..561f7303b2 100644
--- a/json_tokener.c
+++ b/json_tokener.c
@@ -295,7 +295,7 @@ struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
case json_tokener_state_eatws:
/* Advance until we change state */
- while (isspace((int)c)) {
+ while (isspace((unsigned char)c)) {
if ((!ADVANCE_CHAR(str, tok)) || (!PEEK_CHAR(c, tok)))
goto out;
}

View File

@ -1,163 +0,0 @@
From 8bd62177e796386fb6382db101c90b57b6138afe Mon Sep 17 00:00:00 2001
From: janczer <menshikov.ivn@gmail.com>
Date: Tue, 24 Apr 2018 16:00:38 +0200
Subject: [PATCH] Fixed typos
---
STYLE.txt | 2 +-
json_object.h | 18 +++++++++---------
json_pointer.c | 2 +-
tests/test_compare.c | 12 ++++++------
tests/test_compare.expected | 6 +++---
5 files changed, 20 insertions(+), 20 deletions(-)
diff --git a/STYLE.txt b/STYLE.txt
index e5acd14820..195883c760 100755
--- a/STYLE.txt
+++ b/STYLE.txt
@@ -7,7 +7,7 @@ Official json-c style:
Aim for readability, not strict conformance to fixed style rules.
These rules are not comprehensive. Look to existing code for guidelines.
Indentation is tab based, with continuations of long lines starting with tabs then spaces for alignment.
-Try to line up components of continuation lines with corresponding part of the line above (i.e. "indent -lp" effect), but avoid excessive identation tha causes extra line wraps.
+Try to line up components of continuation lines with corresponding part of the line above (i.e. "indent -lp" effect), but avoid excessive indentation tha causes extra line wraps.
e.g. (T=tab, S=space):
TTTTsome_long_func_call(arg1, arg2,
TTTTSSSSSSSSSSSSSSSSSSSarg3, arg4);
diff --git a/json_object.h b/json_object.h
index a3a86c0912..30341bcdb7 100644
--- a/json_object.h
+++ b/json_object.h
@@ -91,7 +91,7 @@ extern "C" {
/**
* A flag for the json_object_object_add_ex function which
* causes the value to be added without a check if it already exists.
- * Note: it is the responsibilty of the caller to ensure that no
+ * Note: it is the responsibility of the caller to ensure that no
* key is added multiple times. If this is done, results are
* unpredictable. While this option is somewhat dangerous, it
* permits potentially large performance savings in code that
@@ -442,7 +442,7 @@ JSON_EXPORT int json_object_object_add_ex(struct json_object* obj,
*
* This returns NULL if the field is found but its value is null, or if
* the field is not found, or if obj is not a json_type_object. If you
- * need to distinguis between these cases, use json_object_object_get_ex().
+ * need to distinguish between these cases, use json_object_object_get_ex().
*
* *No* reference counts will be changed. There is no need to manually adjust
* reference counts through the json_object_put/json_object_get methods unless
@@ -624,7 +624,7 @@ JSON_EXPORT int json_object_array_add(struct json_object *obj,
JSON_EXPORT int json_object_array_put_idx(struct json_object *obj, size_t idx,
struct json_object *val);
-/** Get the element at specificed index of the array (a json_object of type json_type_array)
+/** Get the element at specified index of the array (a json_object of type json_type_array)
* @param obj the json_object instance
* @param idx the index to get the element at
* @returns the json_object at the specified index (or NULL)
@@ -671,7 +671,7 @@ JSON_EXPORT json_bool json_object_get_boolean(const struct json_object *obj);
*
* The type of obj is checked to be a json_type_boolean and 0 is returned
* if it is not without any further actions. If type of obj is json_type_boolean
- * the obect value is chaned to new_value
+ * the object value is changed to new_value
*
* @param obj the json_object instance
* @param new_value the value to be set
@@ -718,7 +718,7 @@ JSON_EXPORT int32_t json_object_get_int(const struct json_object *obj);
*
* The type of obj is checked to be a json_type_int and 0 is returned
* if it is not without any further actions. If type of obj is json_type_int
- * the obect value is changed to new_value
+ * the object value is changed to new_value
*
* @param obj the json_object instance
* @param new_value the value to be set
@@ -763,7 +763,7 @@ JSON_EXPORT int64_t json_object_get_int64(const struct json_object *obj);
*
* The type of obj is checked to be a json_type_int and 0 is returned
* if it is not without any further actions. If type of obj is json_type_int
- * the obect value is chaned to new_value
+ * the object value is changed to new_value
*
* @param obj the json_object instance
* @param new_value the value to be set
@@ -880,7 +880,7 @@ JSON_EXPORT double json_object_get_double(const struct json_object *obj);
*
* The type of obj is checked to be a json_type_double and 0 is returned
* if it is not without any further actions. If type of obj is json_type_double
- * the obect value is chaned to new_value
+ * the object value is changed to new_value
*
* @param obj the json_object instance
* @param new_value the value to be set
@@ -942,10 +942,10 @@ JSON_EXPORT int json_object_set_string(json_object* obj, const char* new_value);
*
* The type of obj is checked to be a json_type_string and 0 is returned
* if it is not without any further actions. If type of obj is json_type_string
- * the obect value is chaned to new_value
+ * the object value is changed to new_value
*
* @param obj the json_object instance
- * @param new_value the value to be set; Since string legth is given in len this need not be zero terminated
+ * @param new_value the value to be set; Since string length is given in len this need not be zero terminated
* @param len the length of new_value
* @returns 1 if value is set correctly, 0 otherwise
*/
diff --git a/json_pointer.c b/json_pointer.c
index c7e34f76f3..9531c036c8 100644
--- a/json_pointer.c
+++ b/json_pointer.c
@@ -28,7 +28,7 @@
static void string_replace_all_occurrences_with_char(char *s, const char *occur, char repl_char)
{
int slen = strlen(s);
- int skip = strlen(occur) - 1; /* length of the occurence, minus the char we're replacing */
+ int skip = strlen(occur) - 1; /* length of the occurrence, minus the char we're replacing */
char *p = s;
while ((p = strstr(p, occur))) {
*p = repl_char;
diff --git a/tests/test_compare.c b/tests/test_compare.c
index c7e44f6ea6..cba328cf4b 100644
--- a/tests/test_compare.c
+++ b/tests/test_compare.c
@@ -18,19 +18,19 @@ int main()
struct json_object *int3 = json_object_new_int(1);
if (!json_object_equal(int1, int2))
- printf("JSON integer comparision is correct\n");
+ printf("JSON integer comparison is correct\n");
else
- printf("JSON integer comparision failed\n");
+ printf("JSON integer comparison failed\n");
if (json_object_equal(int1, int1))
- printf("JSON same object comparision is correct\n");
+ printf("JSON same object comparison is correct\n");
else
- printf("JSON same object comparision failed\n");
+ printf("JSON same object comparison failed\n");
if (json_object_equal(int2, int3))
- printf("JSON same integer comparision is correct\n");
+ printf("JSON same integer comparison is correct\n");
else
- printf("JSON same integer comparision failed\n");
+ printf("JSON same integer comparison failed\n");
json_object_put(int1);
json_object_put(int2);
diff --git a/tests/test_compare.expected b/tests/test_compare.expected
index 46f03c4101..5468f83d2e 100644
--- a/tests/test_compare.expected
+++ b/tests/test_compare.expected
@@ -1,6 +1,6 @@
-JSON integer comparision is correct
-JSON same object comparision is correct
-JSON same integer comparision is correct
+JSON integer comparison is correct
+JSON same object comparison is correct
+JSON same integer comparison is correct
Comparing equal strings is correct
Comparing different strings is correct
Comparing equal doubles is correct

View File

@ -1,75 +0,0 @@
From da4b34355da023c439e96bc6ca31886cd69d6bdb Mon Sep 17 00:00:00 2001
From: Eric Haszlakiewicz <erh+git@nimenees.com>
Date: Sun, 25 Mar 2018 18:23:42 -0400
Subject: [PATCH] Add an parse test for content starting with a UTF8 BOM, which
is _not_ a valid start to a JSON message.
---
tests/test_parse.c | 16 +++++++++++++++-
tests/test_parse.expected | 5 ++++-
2 files changed, 19 insertions(+), 2 deletions(-)
diff --git a/tests/test_parse.c b/tests/test_parse.c
index ee1f8387b3..f46651b0a1 100644
--- a/tests/test_parse.c
+++ b/tests/test_parse.c
@@ -9,6 +9,7 @@
#include "json_visit.h"
static void test_basic_parse(void);
+static void test_utf8_parse(void);
static void test_verbose_parse(void);
static void test_incremental_parse(void);
@@ -19,6 +20,8 @@ int main(void)
static const char separator[] = "==================================";
test_basic_parse();
puts(separator);
+ test_utf8_parse();
+ puts(separator);
test_verbose_parse();
puts(separator);
test_incremental_parse();
@@ -107,6 +110,17 @@ static void test_basic_parse()
single_basic_parse("[18446744073709551616]", 1);
}
+static void test_utf8_parse()
+{
+ // json_tokener_parse doesn't support checking for byte order marks.
+ // It's the responsibility of the caller to detect and skip a BOM.
+ // Both of these checks return null.
+ char utf8_bom[] = { 0xEF, 0xBB, 0xBF, 0x00 };
+ char utf8_bom_and_chars[] = { 0xEF, 0xBB, 0xBF, '{', '}', 0x00 };
+ single_basic_parse(utf8_bom, 0);
+ single_basic_parse(utf8_bom_and_chars, 0);
+}
+
// Clear the re-serialization information that the tokener
// saves to ensure that the output reflects the actual
// values we parsed, rather than just the original input.
@@ -145,7 +159,7 @@ static void test_verbose_parse()
/* b/c the string starts with 'f' parsing return a boolean error */
assert (error == json_tokener_error_parse_boolean);
- puts("json_tokener_parse_versbose() OK");
+ puts("json_tokener_parse_verbose() OK");
}
struct incremental_step {
diff --git a/tests/test_parse.expected b/tests/test_parse.expected
index ada61411fe..5d3976a745 100644
--- a/tests/test_parse.expected
+++ b/tests/test_parse.expected
@@ -51,7 +51,10 @@ new_obj.to_string([0e+])=[ 0.0 ]
new_obj.to_string([0e+-1])=null
new_obj.to_string([18446744073709551616])=[ 9223372036854775807 ]
==================================
-json_tokener_parse_versbose() OK
+new_obj.to_string()=null
+new_obj.to_string({})=null
+==================================
+json_tokener_parse_verbose() OK
==================================
Starting incremental tests.
Note: quotes and backslashes seen in the output here are literal values passed

BIN
json-c-0.15-20200726.tar.gz Normal file

Binary file not shown.

View File

@ -1,29 +0,0 @@
From d0b87ee87b282e9b91a1af924050e217b0b2ae8b Mon Sep 17 00:00:00 2001
From: Eric Haszlakiewicz <erh+git@nimenees.com>
Date: Mon, 12 Aug 2019 00:30:45 +0000
Subject: [PATCH] Add an explicit cast to double to squash a
-Wimplicit-int-float-conversion warning. Though we will no longer be
comparing exactly against INT64_MAX, this is ok because any value of that
magnitude stored in a double will *also* have been rounded up, so the
comparison will work appropriately.
---
json_object.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/json_object.c b/json_object.c
index 026dab313b..192919f460 100644
--- a/json_object.c
+++ b/json_object.c
@@ -701,7 +701,9 @@ int64_t json_object_get_int64(const struct json_object *jso)
case json_type_int:
return jso->o.c_int64;
case json_type_double:
- if (jso->o.c_double >= INT64_MAX)
+ // INT64_MAX can't be exactly represented as a double
+ // so cast to tell the compiler it's ok to round up.
+ if (jso->o.c_double >= (double)INT64_MAX)
return INT64_MAX;
if (jso->o.c_double <= INT64_MIN)
return INT64_MIN;

View File

@ -1,35 +1,19 @@
%{!?_pkgdocdir:%global _pkgdocdir %{_docdir}/%{name}-%{version}}
%global so_ver 4
%global reldate 20180305
%global so_ver 5
%global reldate 20200726
Name: json-c
Version: 0.13.1
Release: 9
Version: 0.15
Release: 1
Summary: JSON implementation in C
License: MIT
URL: https://github.com/%{name}/%{name}
Source0: %{url}/archive/%{name}-%{version}-%{reldate}.tar.gz
# Cherry-picked from upstream.
Patch0: json-c-0.13.1-parse_test_UTF8_BOM.patch
Patch1: json-c-0.13.1-fix_incorrect_casts_in_calls_to_ctype_functions.patch
Patch2: json-c-0.13.1-fix_typos.patch
Patch6000: 0012-json_object_private-Use-unsigned-32-bit-integer-type.patch
Patch6001: 0040-Fixed-misalignment-in-JSON-string-due-to-space-after.patch
Patch6002: 0048-json_object.c-set-errno-in-json_object_get_double.patch
Patch6003: 0053-Fix-compiler-warnings.patch
Patch6004: 0002-Issue-486-append-a-missing-.0-to-negative-double-val.patch
Patch9000: bugfix-json-c-support_aarch64.patch
Patch6005: json-c-bugfix-against-INT64_MAX.patch
Patch6006: CVE-2020-12762.patch
Patch6007: backport-Detect-broken-RDRAND-during-initialization.patch
Patch6008: backport-drop-the-rdrand-test-loops.patch
BuildRequires: libtool
BuildRequires: cmake gcc ninja-build json-c
%description
JSON-C implements a reference counting object model that allows you
@ -60,51 +44,51 @@ Obsoletes: %{name}-doc = %{version}-%{release}
This package contains the reference manual for %{name}.
%prep
%autosetup -Tb 0 -n %{name}-%{name}-%{version}-%{reldate} -p 1
for doc in ChangeLog; do
%{_bindir}/iconv -f iso-8859-1 -t utf8 ${doc} > ${doc}.new
/bin/touch -r ${doc} ${doc}.new
%{__mv} -f ${doc}.new ${doc}
done
%{__sed} -i -e 's!#ACLOCAL_AMFLAGS!ACLOCAL_AMFLAGS!g' Makefile.am
%{_bindir}/autoreconf -fiv
%autosetup -n %{name}-%{name}-%{version}-%{reldate} -p 1
# Remove pre-built html documentation.
rm -fr doc/html
# Update Doxyfile.
doxygen -s -u doc/Doxyfile.in
%build
%configure --disable-silent-rules --disable-static --enable-rdrand \
--enable-shared --enable-threading
%make_build
%{_bindir}/doxygen Doxyfile
%cmake \
-DBUILD_STATIC_LIBS:BOOL=OFF \
-DCMAKE_BUILD_TYPE:STRING=RELEASE \
-DCMAKE_C_FLAGS_RELEASE:STRING="" \
-DDISABLE_BSYMBOLIC:BOOL=OFF \
-DDISABLE_WERROR:BOOL=ON \
-DENABLE_RDRAND:BOOL=ON \
-DENABLE_THREADING:BOOL=ON \
-G Ninja\
%{!?__cmake_in_source_build:-S "%{_vpath_srcdir}"} \
%{!?__cmake_in_source_build:-B "%{_vpath_builddir}"} \
%__cmake --build "%{_vpath_builddir}" %{?_smp_mflags} --verbose --target all doc
#%cmake_build
%install
%make_install
#%cmake_install
DESTDIR="%{buildroot}" %__cmake --install "%{_vpath_builddir}"
%delete_la_and_a
cp -a %{_libdir}/libjson-c.so.4 $RPM_BUILD_ROOT%{_libdir}
cp -a %{_libdir}/libjson-c.so.4.0.0 $RPM_BUILD_ROOT%{_libdir}
%{__mkdir} -p %{buildroot}%{_pkgdocdir}
%{__cp} -pr doc/html ChangeLog README README.* %{buildroot}%{_pkgdocdir}
hardlink -cvf %{buildroot}%{_pkgdocdir}
%pretrans devel -p <lua>
path = "%{_includedir}/%{name}"
st = posix.stat(path)
if st and st.type == "link" then
os.remove(path)
end
mkdir -p %{buildroot}%{_pkgdocdir}
hardlink -cfv %{buildroot}%{_pkgdocdir}
%ldconfig_scriptlets
%files
%license AUTHORS COPYING
%{_libdir}/lib%{name}.so.%{so_ver}*
%{_libdir}/libjson-c.so.4*
%files devel
%{_includedir}/%{name}/
%{_libdir}/cmake/%{name}
%{_libdir}/lib%{name}.so
%{_libdir}/pkgconfig/%{name}.pc
@ -112,13 +96,16 @@ end
%doc %{_pkgdocdir}
%changelog
* Tue Sep 14 2021 hanhui <hanhui15@huawei.com> - 0.15-1
- update to 0.15
* Thu Sep 9 2021 liuyumeng <liuyumeng5@huawei.com> - 0.13.1-9
- fix broken RDRAND causes infinite looping
* Tue Jul 21 2020 wangye <wangye70@huawei.com> - 0.13.1-8
- fix hardlink path
* Fri May 22 2020 ruanweidong <ruanweidong1@huawei.com> - 0.13.1-7
* Fri May 22 2020 ruanweidong <ruanweidong1@huawei.com> -0.13.1-7
- fix CVE-2020-12762
* Sat Mar 21 2020 songnannan <songnannan2@huawei.com> - 0.13.1-6