From 812d5e3903c5507c9d015cf0078b3a63d391b022 Mon Sep 17 00:00:00 2001
From: Eric Haszlakiewicz <erh+git@nimenees.com>
Date: Tue, 21 Apr 2020 03:19:17 +0000
Subject: [PATCH 01/18] Issue #471: always create directories with mode 0755,
regardless of umask.
---
CMakeLists.txt | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index c51f477c5f..ea536947df 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -392,6 +392,17 @@ target_include_directories(${PROJECT_NAME}
$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}>
)
+# Always create new install dirs with 0755 permissions, regardless of umask
+set(CMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS
+ OWNER_READ
+ OWNER_WRITE
+ OWNER_EXECUTE
+ GROUP_READ
+ GROUP_EXECUTE
+ WORLD_READ
+ WORLD_EXECUTE
+ )
+
install(TARGETS ${PROJECT_NAME}
EXPORT ${PROJECT_NAME}-targets
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
From 3a3ab6c7d8991892a44267919204f852dbd512ed Mon Sep 17 00:00:00 2001
From: Eric Haszlakiewicz <erh+git@nimenees.com>
Date: Sun, 3 May 2020 03:50:16 +0000
Subject: [PATCH 02/18] Fix cmake-configure to accept "--prefix=<foo>" in
addition to "--prefix <foo>" (see also Issue #591)
---
cmake-configure | 3 +++
1 file changed, 3 insertions(+)
diff --git a/cmake-configure b/cmake-configure
index 7a06b660c1..2fcc39e3ca 100755
--- a/cmake-configure
+++ b/cmake-configure
@@ -52,6 +52,9 @@ while [ $# -gt 0 ] ; do
FLAGS+=(-DCMAKE_INSTALL_PREFIX="$2")
shift
;;
+ --prefix=*)
+ FLAGS+=(-DCMAKE_INSTALL_PREFIX="${1##--prefix=}")
+ ;;
--enable-threading)
FLAGS+=(-DENABLE_THREADING=ON)
;;
From 0ca0361a24cd9f76b9bcb92eba2a752ff5269cea Mon Sep 17 00:00:00 2001
From: Tudor Brindus <me@tbrindus.ca>
Date: Fri, 1 May 2020 22:24:20 -0400
Subject: [PATCH 03/18] Fix segmentation fault in CPUID check
---
random_seed.c | 15 ++-------------
1 file changed, 2 insertions(+), 13 deletions(-)
diff --git a/random_seed.c b/random_seed.c
index fc19e26d13..c459f0f92f 100644
--- a/random_seed.c
+++ b/random_seed.c
@@ -26,19 +26,8 @@
static void do_cpuid(int regs[], int h)
{
/* clang-format off */
- __asm__ __volatile__(
-#if defined __x86_64__
- "pushq %%rbx;\n"
-#else
- "pushl %%ebx;\n"
-#endif
- "cpuid;\n"
-#if defined __x86_64__
- "popq %%rbx;\n"
-#else
- "popl %%ebx;\n"
-#endif
- : "=a"(regs[0]), [ebx] "=r"(regs[1]), "=c"(regs[2]), "=d"(regs[3])
+ __asm__ __volatile__("cpuid"
+ : "=a"(regs[0]), "=b"(regs[1]), "=c"(regs[2]), "=d"(regs[3])
: "a"(h));
/* clang-format on */
}
From 23005a7d9d7e9a1c433689b5df29a53bf629b470 Mon Sep 17 00:00:00 2001
From: Tudor Brindus <me@tbrindus.ca>
Date: Fri, 1 May 2020 21:09:22 -0400
Subject: [PATCH 04/18] 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.
---
random_seed.c | 37 +++++++++++++++++++++++++++++++++----
1 file changed, 33 insertions(+), 4 deletions(-)
diff --git a/random_seed.c b/random_seed.c
index c459f0f92f..4ddcb07d16 100644
--- a/random_seed.c
+++ b/random_seed.c
@@ -43,12 +43,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
From 8d28e677e6a0919dcea40ea9a5b5d484df1d7d41 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 05/18] 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.
---
random_seed.c | 64 +++++++++++++++++++++++++++++++--------------------
1 file changed, 39 insertions(+), 25 deletions(-)
diff --git a/random_seed.c b/random_seed.c
index 4ddcb07d16..b5f8a0795e 100644
--- a/random_seed.c
+++ b/random_seed.c
@@ -45,36 +45,46 @@ 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;
@@ -92,7 +102,7 @@ static int get_rdrand_seed(void)
{
DEBUG_SEED("get_rdrand_seed");
int _eax;
- // rdrand eax
+ /* rdrand eax */
/* clang-format off */
__asm__ __volatile__("1: .byte 0x0F\n"
" .byte 0xC7\n"
@@ -132,7 +142,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
@@ -206,6 +216,10 @@ static int get_dev_random_seed(void)
/* clang-format off */
#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>
/* clang-format on */
#ifndef __GNUC__
From a9695f34c3f4bbd4475597cce1e5d48284286634 Mon Sep 17 00:00:00 2001
From: Tobias Stoeckmann <tobias@stoeckmann.org>
Date: Mon, 4 May 2020 19:41:16 +0200
Subject: [PATCH 06/18] Protect array_list_del_idx against size_t overflow.
If the assignment of stop overflows due to idx and count being
larger than SIZE_T_MAX in sum, out of boundary access could happen.
It takes invalid usage of this function for this to happen, but
I decided to add this check so array_list_del_idx is as safe against
bad usage as the other arraylist functions.
---
arraylist.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/arraylist.c b/arraylist.c
index 12ad8af6d3..e5524aca75 100644
--- a/arraylist.c
+++ b/arraylist.c
@@ -136,6 +136,9 @@ int array_list_del_idx(struct array_list *arr, size_t idx, size_t count)
{
size_t i, stop;
+ /* Avoid overflow in calculation with large indices. */
+ if (idx > SIZE_T_MAX - count)
+ return -1;
stop = idx + count;
if (idx >= arr->length || stop > arr->length)
return -1;
From e66f7f7223fc6a2d3b808216ae28c7de65a54fe7 Mon Sep 17 00:00:00 2001
From: Tobias Stoeckmann <tobias@stoeckmann.org>
Date: Mon, 4 May 2020 19:46:45 +0200
Subject: [PATCH 07/18] Prevent division by zero in linkhash.
If a linkhash with a size of zero is created, then modulo operations
are prone to division by zero operations.
Purely protective measure against bad usage.
---
linkhash.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/linkhash.c b/linkhash.c
index 7ea58c0abf..f05cc38030 100644
--- a/linkhash.c
+++ b/linkhash.c
@@ -12,6 +12,7 @@
#include "config.h"
+#include <assert.h>
#include <limits.h>
#include <stdarg.h>
#include <stddef.h>
@@ -499,6 +500,8 @@ struct lh_table *lh_table_new(int size, lh_entry_free_fn *free_fn, lh_hash_fn *h
int i;
struct lh_table *t;
+ /* Allocate space for elements to avoid divisions by zero. */
+ assert(size > 0);
t = (struct lh_table *)calloc(1, sizeof(struct lh_table));
if (!t)
return NULL;
From c4eae053d4d5c6f300984677b4435f0c00f706a9 Mon Sep 17 00:00:00 2001
From: Tobias Stoeckmann <tobias@stoeckmann.org>
Date: Mon, 4 May 2020 19:47:25 +0200
Subject: [PATCH 08/18] Fix integer overflows.
The data structures linkhash and printbuf are limited to 2 GB in size
due to a signed integer being used to track their current size.
If too much data is added, then size variable can overflow, which is
an undefined behaviour in C programming language.
Assuming that a signed int overflow just leads to a negative value,
like it happens on many sytems (Linux i686/amd64 with gcc), then
printbuf is vulnerable to an out of boundary write on 64 bit systems.
---
linkhash.c | 7 +++++--
printbuf.c | 19 ++++++++++++++++---
2 files changed, 21 insertions(+), 5 deletions(-)
diff --git a/linkhash.c b/linkhash.c
index f05cc38030..51e90b13a2 100644
--- a/linkhash.c
+++ b/linkhash.c
@@ -580,9 +580,12 @@ int lh_table_insert_w_hash(struct lh_table *t, const void *k, const void *v, con
{
unsigned long n;
- if (t->count >= t->size * LH_LOAD_FACTOR)
- if (lh_table_resize(t, t->size * 2) != 0)
+ if (t->count >= t->size * LH_LOAD_FACTOR) {
+ /* Avoid signed integer overflow with large tables. */
+ int new_size = INT_MAX / 2 < t->size ? t->size * 2 : INT_MAX;
+ if (t->size == INT_MAX || lh_table_resize(t, new_size) != 0)
return -1;
+ }
n = h % t->size;
diff --git a/printbuf.c b/printbuf.c
index 976c12dde5..00822fac4f 100644
--- a/printbuf.c
+++ b/printbuf.c
@@ -15,6 +15,7 @@
#include "config.h"
+#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -65,10 +66,16 @@ static int printbuf_extend(struct printbuf *p, int min_size)
if (p->size >= min_size)
return 0;
-
- new_size = p->size * 2;
- if (new_size < min_size + 8)
+ /* Prevent signed integer overflows with large buffers. */
+ if (min_size > INT_MAX - 8)
+ return -1;
+ if (p->size > INT_MAX / 2)
new_size = min_size + 8;
+ else {
+ new_size = p->size * 2;
+ if (new_size < min_size + 8)
+ new_size = min_size + 8;
+ }
#ifdef PRINTBUF_DEBUG
MC_DEBUG("printbuf_memappend: realloc "
"bpos=%d min_size=%d old_size=%d new_size=%d\n",
@@ -83,6 +90,9 @@ static int printbuf_extend(struct printbuf *p, int min_size)
int printbuf_memappend(struct printbuf *p, const char *buf, int size)
{
+ /* Prevent signed integer overflows with large buffers. */
+ if (size > INT_MAX - p->bpos - 1)
+ return -1;
if (p->size <= p->bpos + size + 1)
{
if (printbuf_extend(p, p->bpos + size + 1) < 0)
@@ -100,6 +110,9 @@ int printbuf_memset(struct printbuf *pb, int offset, int charvalue, int len)
if (offset == -1)
offset = pb->bpos;
+ /* Prevent signed integer overflows with large buffers. */
+ if (len > INT_MAX - offset)
+ return -1;
size_needed = offset + len;
if (pb->size < size_needed)
{
From 392770c8e5c0783185bdfe0d919737e705190904 Mon Sep 17 00:00:00 2001
From: dota17 <chenguopingdota@163.com>
Date: Wed, 6 May 2020 10:48:53 +0800
Subject: [PATCH 09/18] support to build both static and shared libraries
---
CMakeLists.txt | 20 ++++++++++++++++++++
README.md | 10 +++++++++-
2 files changed, 29 insertions(+), 1 deletion(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index ea536947df..7d7bd7fcc4 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -392,6 +392,26 @@ target_include_directories(${PROJECT_NAME}
$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}>
)
+# Allow to build static and shared libraries at the same time
+if (BUILD_STATIC_LIBS)
+ set(ORIGINAL_STATIC_LIB_NAME ${PROJECT_NAME}-static)
+ add_library(${ORIGINAL_STATIC_LIB_NAME} STATIC
+ ${JSON_C_SOURCES}
+ ${JSON_C_HEADERS}
+ )
+
+ # rename the static library
+ set_target_properties(${ORIGINAL_STATIC_LIB_NAME} PROPERTIES
+ OUTPUT_NAME ${PROJECT_NAME}
+ )
+
+ target_include_directories(${PROJECT_NAME}
+ PUBLIC
+ $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}>
+ $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}>
+ )
+endif ()
+
# Always create new install dirs with 0755 permissions, regardless of umask
set(CMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS
OWNER_READ
diff --git a/README.md b/README.md
index 39ea0d6814..909fd116bf 100644
--- a/README.md
+++ b/README.md
@@ -98,6 +98,7 @@ Variable | Type | Description
CMAKE_INSTALL_PREFIX | String | The install location.
CMAKE_BUILD_TYPE | String | Defaults to "debug"
BUILD_SHARED_LIBS | Bool | The default build generates a dynamic (dll/so) library. Set this to OFF to create a static library instead.
+BUILD_STATIC_LIBS | Bool | This build generates a static (lib/a) library.
ENABLE_RDRAND | Bool | Enable RDRAND Hardware RNG Hash Seed
ENABLE_THREADING | Bool | Enable partial threading support
DISABLE_WERROR | Bool | Disable use of -Werror
@@ -106,7 +107,14 @@ DISABLE_BSYMBOLIC | Bool | Disable use of -Bsymbolic-functions
Pass these options as `-D` on CMake's command-line.
```sh
-cmake -DBUILD_SHARED_LIBS=OFF ...
+# build a static library
+cmake -DBUILD_SHARED_LIBS=OFF ..
+```
+
+Allow to build both static and shared libraries.
+
+```sh
+cmake -DBUILD_STATIC_LIBS=ON ..
```
### Building with partial threading support
From af7a3e05af5e7410c1d8e00ec10b728db737843a Mon Sep 17 00:00:00 2001
From: dota17 <chenguopingdota@163.com>
Date: Thu, 7 May 2020 14:50:43 +0800
Subject: [PATCH 10/18] update
---
CMakeLists.txt | 7 +------
README.md | 12 +++---------
2 files changed, 4 insertions(+), 15 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7d7bd7fcc4..f82103879a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -65,6 +65,7 @@ include(GNUInstallDirs)
include(CMakePackageConfigHelpers)
option(BUILD_SHARED_LIBS "Default to building shared libraries" ON)
+option(BUILD_STATIC_LIBS "Default to building static libraries" ON)
# Generate a release merge and test it to verify the correctness of republishing the package.
ADD_CUSTOM_TARGET(distcheck
@@ -404,12 +405,6 @@ if (BUILD_STATIC_LIBS)
set_target_properties(${ORIGINAL_STATIC_LIB_NAME} PROPERTIES
OUTPUT_NAME ${PROJECT_NAME}
)
-
- target_include_directories(${PROJECT_NAME}
- PUBLIC
- $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}>
- $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}>
- )
endif ()
# Always create new install dirs with 0755 permissions, regardless of umask
diff --git a/README.md b/README.md
index 909fd116bf..f5a7ee39b4 100644
--- a/README.md
+++ b/README.md
@@ -97,8 +97,8 @@ Variable | Type | Description
---------------------|--------|--------------
CMAKE_INSTALL_PREFIX | String | The install location.
CMAKE_BUILD_TYPE | String | Defaults to "debug"
-BUILD_SHARED_LIBS | Bool | The default build generates a dynamic (dll/so) library. Set this to OFF to create a static library instead.
-BUILD_STATIC_LIBS | Bool | This build generates a static (lib/a) library.
+BUILD_SHARED_LIBS | Bool | The default build generates a dynamic (dll/so) library. Set this to OFF to create a static library only.
+BUILD_STATIC_LIBS | Bool | The default build generates a static (lib/a) library. Set this to OFF to create a shared library only.
ENABLE_RDRAND | Bool | Enable RDRAND Hardware RNG Hash Seed
ENABLE_THREADING | Bool | Enable partial threading support
DISABLE_WERROR | Bool | Disable use of -Werror
@@ -107,16 +107,10 @@ DISABLE_BSYMBOLIC | Bool | Disable use of -Bsymbolic-functions
Pass these options as `-D` on CMake's command-line.
```sh
-# build a static library
+# build a static library only
cmake -DBUILD_SHARED_LIBS=OFF ..
```
-Allow to build both static and shared libraries.
-
-```sh
-cmake -DBUILD_STATIC_LIBS=ON ..
-```
-
### Building with partial threading support
Although json-c does not support fully multi-threaded access to
From 077eceead18152fae8c6bd8e2288d53d5eba7cf6 Mon Sep 17 00:00:00 2001
From: hofnarr <hofnarr@hofnarr.fi>
Date: Fri, 8 May 2020 02:16:52 +0300
Subject: [PATCH 11/18] cmake: add list for build targets
---
CMakeLists.txt | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index f82103879a..00613a8d67 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -384,7 +384,7 @@ add_library(${PROJECT_NAME}
set_target_properties(${PROJECT_NAME} PROPERTIES
VERSION 5.0.0
SOVERSION 5)
-
+list(APPEND CMAKE_TARGETS ${PROJECT_NAME})
# If json-c is used as subroject it set to target correct interface -I flags and allow
# to build external target without extra include_directories(...)
target_include_directories(${PROJECT_NAME}
@@ -405,6 +405,7 @@ if (BUILD_STATIC_LIBS)
set_target_properties(${ORIGINAL_STATIC_LIB_NAME} PROPERTIES
OUTPUT_NAME ${PROJECT_NAME}
)
+ list(APPEND CMAKE_TARGETS ${STATIC_LIB})
endif ()
# Always create new install dirs with 0755 permissions, regardless of umask
@@ -418,7 +419,7 @@ set(CMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS
WORLD_EXECUTE
)
-install(TARGETS ${PROJECT_NAME}
+install(TARGETS ${CMAKE_TARGETS}
EXPORT ${PROJECT_NAME}-targets
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
From 20895f941ee4e1ffe8248c30c01322970479d7cd Mon Sep 17 00:00:00 2001
From: hofnarr <hofnarr@hofnarr.fi>
Date: Fri, 8 May 2020 02:19:38 +0300
Subject: [PATCH 12/18] cmake: change variable name
---
CMakeLists.txt | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 00613a8d67..7302d4edf0 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -395,14 +395,14 @@ target_include_directories(${PROJECT_NAME}
# Allow to build static and shared libraries at the same time
if (BUILD_STATIC_LIBS)
- set(ORIGINAL_STATIC_LIB_NAME ${PROJECT_NAME}-static)
- add_library(${ORIGINAL_STATIC_LIB_NAME} STATIC
+ set(STATIC_LIB ${PROJECT_NAME}-static)
+ add_library(${STATIC_LIB} STATIC
${JSON_C_SOURCES}
${JSON_C_HEADERS}
)
# rename the static library
- set_target_properties(${ORIGINAL_STATIC_LIB_NAME} PROPERTIES
+ set_target_properties(${STATIC_LIB} PROPERTIES
OUTPUT_NAME ${PROJECT_NAME}
)
list(APPEND CMAKE_TARGETS ${STATIC_LIB})
From 2db5633de4980a33c911e9a52984ac62f2a5edf7 Mon Sep 17 00:00:00 2001
From: hofnarr <hofnarr@hofnarr.fi>
Date: Fri, 8 May 2020 02:27:06 +0300
Subject: [PATCH 13/18] cmake-configure: fix enable-static option
---
cmake-configure | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/cmake-configure b/cmake-configure
index 2fcc39e3ca..c8e44aeed4 100755
--- a/cmake-configure
+++ b/cmake-configure
@@ -65,7 +65,7 @@ while [ $# -gt 0 ] ; do
FLAGS+=(-DBUILD_SHARED_LIBS=ON)
;;
--enable-static)
- FLAGS+=(-DBUILD_SHARED_LIBS=OFF)
+ FLAGS+=(-DBUILD_STATIC_LIBS=ON)
;;
--disable-Bsymbolic)
FLAGS+=(-DDISABLE_BSYMBOLIC=ON)
From 7a4807fe0cdb1d9e20273c79762cbf54833aaae4 Mon Sep 17 00:00:00 2001
From: Eric Haszlakiewicz <erh+git@nimenees.com>
Date: Sun, 10 May 2020 03:32:19 +0000
Subject: [PATCH 14/18] Issue #599: Fix the backwards check in
lh_table_insert_w_hash() that was preventing adding more than 11 objects. Add
a test to check for this too.
---
linkhash.c | 2 +-
tests/test4.c | 29 +++++++++++++++++++++++++++++
tests/test4.expected | 1 +
3 files changed, 31 insertions(+), 1 deletion(-)
diff --git a/linkhash.c b/linkhash.c
index 51e90b13a2..f930efd387 100644
--- a/linkhash.c
+++ b/linkhash.c
@@ -582,7 +582,7 @@ int lh_table_insert_w_hash(struct lh_table *t, const void *k, const void *v, con
if (t->count >= t->size * LH_LOAD_FACTOR) {
/* Avoid signed integer overflow with large tables. */
- int new_size = INT_MAX / 2 < t->size ? t->size * 2 : INT_MAX;
+ int new_size = (t->size > INT_MAX / 2) ? INT_MAX : (t->size * 2);
if (t->size == INT_MAX || lh_table_resize(t, new_size) != 0)
return -1;
}
diff --git a/tests/test4.c b/tests/test4.c
index bd964ec789..fd2f3be8ec 100644
--- a/tests/test4.c
+++ b/tests/test4.c
@@ -3,8 +3,10 @@
*/
#include "config.h"
+#include <assert.h>
#include <stdio.h>
#include <string.h>
+#include <stdlib.h>
#include "json_inttypes.h"
#include "json_object.h"
@@ -24,6 +26,30 @@ void print_hex(const char *s)
putchar('\n');
}
+static void test_lot_of_adds(void);
+static void test_lot_of_adds()
+{
+ int ii;
+ char key[50];
+ json_object *jobj = json_object_new_object();
+ assert(jobj != NULL);
+ for (ii = 0; ii < 500; ii++)
+ {
+ snprintf(key, sizeof(key), "k%d", ii);
+ json_object *iobj = json_object_new_int(ii);
+ assert(iobj != NULL);
+ if (json_object_object_add(jobj, key, iobj))
+ {
+ fprintf(stderr, "FAILED to add object #%d\n", ii);
+ abort();
+ }
+ }
+ printf("%s\n", json_object_to_json_string(jobj));
+ assert(json_object_object_length(jobj) == 500);
+ json_object_put(jobj);
+}
+
+
int main(void)
{
const char *input = "\"\\ud840\\udd26,\\ud840\\udd27,\\ud800\\udd26,\\ud800\\udd27\"";
@@ -52,5 +78,8 @@ int main(void)
retval = 1;
}
json_object_put(parse_result);
+
+ test_lot_of_adds();
+
return retval;
}
diff --git a/tests/test4.expected b/tests/test4.expected
index 68d4336d90..cb2744012b 100644
--- a/tests/test4.expected
+++ b/tests/test4.expected
@@ -1,3 +1,4 @@
input: "\ud840\udd26,\ud840\udd27,\ud800\udd26,\ud800\udd27"
JSON parse result is correct: 𠄦,𠄧,𐄦,𐄧
PASS
+{ "k0": 0, "k1": 1, "k2": 2, "k3": 3, "k4": 4, "k5": 5, "k6": 6, "k7": 7, "k8": 8, "k9": 9, "k10": 10, "k11": 11, "k12": 12, "k13": 13, "k14": 14, "k15": 15, "k16": 16, "k17": 17, "k18": 18, "k19": 19, "k20": 20, "k21": 21, "k22": 22, "k23": 23, "k24": 24, "k25": 25, "k26": 26, "k27": 27, "k28": 28, "k29": 29, "k30": 30, "k31": 31, "k32": 32, "k33": 33, "k34": 34, "k35": 35, "k36": 36, "k37": 37, "k38": 38, "k39": 39, "k40": 40, "k41": 41, "k42": 42, "k43": 43, "k44": 44, "k45": 45, "k46": 46, "k47": 47, "k48": 48, "k49": 49, "k50": 50, "k51": 51, "k52": 52, "k53": 53, "k54": 54, "k55": 55, "k56": 56, "k57": 57, "k58": 58, "k59": 59, "k60": 60, "k61": 61, "k62": 62, "k63": 63, "k64": 64, "k65": 65, "k66": 66, "k67": 67, "k68": 68, "k69": 69, "k70": 70, "k71": 71, "k72": 72, "k73": 73, "k74": 74, "k75": 75, "k76": 76, "k77": 77, "k78": 78, "k79": 79, "k80": 80, "k81": 81, "k82": 82, "k83": 83, "k84": 84, "k85": 85, "k86": 86, "k87": 87, "k88": 88, "k89": 89, "k90": 90, "k91": 91, "k92": 92, "k93": 93, "k94": 94, "k95": 95, "k96": 96, "k97": 97, "k98": 98, "k99": 99, "k100": 100, "k101": 101, "k102": 102, "k103": 103, "k104": 104, "k105": 105, "k106": 106, "k107": 107, "k108": 108, "k109": 109, "k110": 110, "k111": 111, "k112": 112, "k113": 113, "k114": 114, "k115": 115, "k116": 116, "k117": 117, "k118": 118, "k119": 119, "k120": 120, "k121": 121, "k122": 122, "k123": 123, "k124": 124, "k125": 125, "k126": 126, "k127": 127, "k128": 128, "k129": 129, "k130": 130, "k131": 131, "k132": 132, "k133": 133, "k134": 134, "k135": 135, "k136": 136, "k137": 137, "k138": 138, "k139": 139, "k140": 140, "k141": 141, "k142": 142, "k143": 143, "k144": 144, "k145": 145, "k146": 146, "k147": 147, "k148": 148, "k149": 149, "k150": 150, "k151": 151, "k152": 152, "k153": 153, "k154": 154, "k155": 155, "k156": 156, "k157": 157, "k158": 158, "k159": 159, "k160": 160, "k161": 161, "k162": 162, "k163": 163, "k164": 164, "k165": 165, "k166": 166, "k167": 167, "k168": 168, "k169": 169, "k170": 170, "k171": 171, "k172": 172, "k173": 173, "k174": 174, "k175": 175, "k176": 176, "k177": 177, "k178": 178, "k179": 179, "k180": 180, "k181": 181, "k182": 182, "k183": 183, "k184": 184, "k185": 185, "k186": 186, "k187": 187, "k188": 188, "k189": 189, "k190": 190, "k191": 191, "k192": 192, "k193": 193, "k194": 194, "k195": 195, "k196": 196, "k197": 197, "k198": 198, "k199": 199, "k200": 200, "k201": 201, "k202": 202, "k203": 203, "k204": 204, "k205": 205, "k206": 206, "k207": 207, "k208": 208, "k209": 209, "k210": 210, "k211": 211, "k212": 212, "k213": 213, "k214": 214, "k215": 215, "k216": 216, "k217": 217, "k218": 218, "k219": 219, "k220": 220, "k221": 221, "k222": 222, "k223": 223, "k224": 224, "k225": 225, "k226": 226, "k227": 227, "k228": 228, "k229": 229, "k230": 230, "k231": 231, "k232": 232, "k233": 233, "k234": 234, "k235": 235, "k236": 236, "k237": 237, "k238": 238, "k239": 239, "k240": 240, "k241": 241, "k242": 242, "k243": 243, "k244": 244, "k245": 245, "k246": 246, "k247": 247, "k248": 248, "k249": 249, "k250": 250, "k251": 251, "k252": 252, "k253": 253, "k254": 254, "k255": 255, "k256": 256, "k257": 257, "k258": 258, "k259": 259, "k260": 260, "k261": 261, "k262": 262, "k263": 263, "k264": 264, "k265": 265, "k266": 266, "k267": 267, "k268": 268, "k269": 269, "k270": 270, "k271": 271, "k272": 272, "k273": 273, "k274": 274, "k275": 275, "k276": 276, "k277": 277, "k278": 278, "k279": 279, "k280": 280, "k281": 281, "k282": 282, "k283": 283, "k284": 284, "k285": 285, "k286": 286, "k287": 287, "k288": 288, "k289": 289, "k290": 290, "k291": 291, "k292": 292, "k293": 293, "k294": 294, "k295": 295, "k296": 296, "k297": 297, "k298": 298, "k299": 299, "k300": 300, "k301": 301, "k302": 302, "k303": 303, "k304": 304, "k305": 305, "k306": 306, "k307": 307, "k308": 308, "k309": 309, "k310": 310, "k311": 311, "k312": 312, "k313": 313, "k314": 314, "k315": 315, "k316": 316, "k317": 317, "k318": 318, "k319": 319, "k320": 320, "k321": 321, "k322": 322, "k323": 323, "k324": 324, "k325": 325, "k326": 326, "k327": 327, "k328": 328, "k329": 329, "k330": 330, "k331": 331, "k332": 332, "k333": 333, "k334": 334, "k335": 335, "k336": 336, "k337": 337, "k338": 338, "k339": 339, "k340": 340, "k341": 341, "k342": 342, "k343": 343, "k344": 344, "k345": 345, "k346": 346, "k347": 347, "k348": 348, "k349": 349, "k350": 350, "k351": 351, "k352": 352, "k353": 353, "k354": 354, "k355": 355, "k356": 356, "k357": 357, "k358": 358, "k359": 359, "k360": 360, "k361": 361, "k362": 362, "k363": 363, "k364": 364, "k365": 365, "k366": 366, "k367": 367, "k368": 368, "k369": 369, "k370": 370, "k371": 371, "k372": 372, "k373": 373, "k374": 374, "k375": 375, "k376": 376, "k377": 377, "k378": 378, "k379": 379, "k380": 380, "k381": 381, "k382": 382, "k383": 383, "k384": 384, "k385": 385, "k386": 386, "k387": 387, "k388": 388, "k389": 389, "k390": 390, "k391": 391, "k392": 392, "k393": 393, "k394": 394, "k395": 395, "k396": 396, "k397": 397, "k398": 398, "k399": 399, "k400": 400, "k401": 401, "k402": 402, "k403": 403, "k404": 404, "k405": 405, "k406": 406, "k407": 407, "k408": 408, "k409": 409, "k410": 410, "k411": 411, "k412": 412, "k413": 413, "k414": 414, "k415": 415, "k416": 416, "k417": 417, "k418": 418, "k419": 419, "k420": 420, "k421": 421, "k422": 422, "k423": 423, "k424": 424, "k425": 425, "k426": 426, "k427": 427, "k428": 428, "k429": 429, "k430": 430, "k431": 431, "k432": 432, "k433": 433, "k434": 434, "k435": 435, "k436": 436, "k437": 437, "k438": 438, "k439": 439, "k440": 440, "k441": 441, "k442": 442, "k443": 443, "k444": 444, "k445": 445, "k446": 446, "k447": 447, "k448": 448, "k449": 449, "k450": 450, "k451": 451, "k452": 452, "k453": 453, "k454": 454, "k455": 455, "k456": 456, "k457": 457, "k458": 458, "k459": 459, "k460": 460, "k461": 461, "k462": 462, "k463": 463, "k464": 464, "k465": 465, "k466": 466, "k467": 467, "k468": 468, "k469": 469, "k470": 470, "k471": 471, "k472": 472, "k473": 473, "k474": 474, "k475": 475, "k476": 476, "k477": 477, "k478": 478, "k479": 479, "k480": 480, "k481": 481, "k482": 482, "k483": 483, "k484": 484, "k485": 485, "k486": 486, "k487": 487, "k488": 488, "k489": 489, "k490": 490, "k491": 491, "k492": 492, "k493": 493, "k494": 494, "k495": 495, "k496": 496, "k497": 497, "k498": 498, "k499": 499 }
From b4c0c8d0270155a37f192033786b7602245eb923 Mon Sep 17 00:00:00 2001
From: Eric Haszlakiewicz <erh+git@nimenees.com>
Date: Sun, 10 May 2020 03:48:45 +0000
Subject: [PATCH 15/18] Issue #598: avoid building static libraries twice.
---
CMakeLists.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7302d4edf0..67c2ae6e7c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -394,7 +394,7 @@ target_include_directories(${PROJECT_NAME}
)
# Allow to build static and shared libraries at the same time
-if (BUILD_STATIC_LIBS)
+if (BUILD_STATIC_LIBS AND BUILD_SHARED_LIBS)
set(STATIC_LIB ${PROJECT_NAME}-static)
add_library(${STATIC_LIB} STATIC
${JSON_C_SOURCES}
From 5d3466d0cb709da0f84b1010c4658a87805db47f Mon Sep 17 00:00:00 2001
From: Eric Haszlakiewicz <erh+git@nimenees.com>
Date: Sun, 10 May 2020 03:58:27 +0000
Subject: [PATCH 16/18] Re-format after recent change to fix linkhash.
---
linkhash.c | 3 ++-
tests/test4.c | 3 +--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/linkhash.c b/linkhash.c
index f930efd387..b021ef10b0 100644
--- a/linkhash.c
+++ b/linkhash.c
@@ -580,7 +580,8 @@ int lh_table_insert_w_hash(struct lh_table *t, const void *k, const void *v, con
{
unsigned long n;
- if (t->count >= t->size * LH_LOAD_FACTOR) {
+ if (t->count >= t->size * LH_LOAD_FACTOR)
+ {
/* Avoid signed integer overflow with large tables. */
int new_size = (t->size > INT_MAX / 2) ? INT_MAX : (t->size * 2);
if (t->size == INT_MAX || lh_table_resize(t, new_size) != 0)
diff --git a/tests/test4.c b/tests/test4.c
index fd2f3be8ec..7d3d0be168 100644
--- a/tests/test4.c
+++ b/tests/test4.c
@@ -5,8 +5,8 @@
#include "config.h"
#include <assert.h>
#include <stdio.h>
-#include <string.h>
#include <stdlib.h>
+#include <string.h>
#include "json_inttypes.h"
#include "json_object.h"
@@ -49,7 +49,6 @@ static void test_lot_of_adds()
json_object_put(jobj);
}
-
int main(void)
{
const char *input = "\"\\ud840\\udd26,\\ud840\\udd27,\\ud800\\udd26,\\ud800\\udd27\"";
From f0bbaec2d4e1c64bcc2b4e9880d15ccb46233fc0 Mon Sep 17 00:00:00 2001
From: Eric Haszlakiewicz <erh+git@nimenees.com>
Date: Sun, 10 May 2020 03:58:51 +0000
Subject: [PATCH 17/18] Issue #600: don't rename the static library on Windows,
it _needs_ to have a different name because the dll build also creates a
"json-c.lib" file.
---
CMakeLists.txt | 2 ++
1 file changed, 2 insertions(+)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 67c2ae6e7c..b980a5a2f8 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -402,9 +402,11 @@ if (BUILD_STATIC_LIBS AND BUILD_SHARED_LIBS)
)
# rename the static library
+ if (NOT MSVC)
set_target_properties(${STATIC_LIB} PROPERTIES
OUTPUT_NAME ${PROJECT_NAME}
)
+ endif()
list(APPEND CMAKE_TARGETS ${STATIC_LIB})
endif ()
From c7c7d1cbe93a978898c0f270948369bb8ec9cc05 Mon Sep 17 00:00:00 2001
From: Eric Haszlakiewicz <erh+git@nimenees.com>
Date: Sun, 10 May 2020 04:04:28 +0000
Subject: [PATCH 18/18] Fix snprintf on windows problem for test4.
---
tests/test4.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/tests/test4.c b/tests/test4.c
index 7d3d0be168..288cec1792 100644
--- a/tests/test4.c
+++ b/tests/test4.c
@@ -11,6 +11,7 @@
#include "json_inttypes.h"
#include "json_object.h"
#include "json_tokener.h"
+#include "snprintf_compat.h"
void print_hex(const char *s)
{