Blame SOURCES/json-c-0.14-backport_fixes_from_master.patch

a0bbcb
From 812d5e3903c5507c9d015cf0078b3a63d391b022 Mon Sep 17 00:00:00 2001
a0bbcb
From: Eric Haszlakiewicz <erh+git@nimenees.com>
a0bbcb
Date: Tue, 21 Apr 2020 03:19:17 +0000
a0bbcb
Subject: [PATCH 01/18] Issue #471: always create directories with mode 0755,
a0bbcb
 regardless of umask.
a0bbcb
a0bbcb
---
a0bbcb
 CMakeLists.txt | 11 +++++++++++
a0bbcb
 1 file changed, 11 insertions(+)
a0bbcb
a0bbcb
diff --git a/CMakeLists.txt b/CMakeLists.txt
a0bbcb
index c51f477c5f..ea536947df 100644
a0bbcb
--- a/CMakeLists.txt
a0bbcb
+++ b/CMakeLists.txt
a0bbcb
@@ -392,6 +392,17 @@ target_include_directories(${PROJECT_NAME}
a0bbcb
         $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}>
a0bbcb
 )
a0bbcb
 
a0bbcb
+# Always create new install dirs with 0755 permissions, regardless of umask
a0bbcb
+set(CMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS
a0bbcb
+	OWNER_READ
a0bbcb
+	OWNER_WRITE
a0bbcb
+	OWNER_EXECUTE
a0bbcb
+	GROUP_READ
a0bbcb
+	GROUP_EXECUTE
a0bbcb
+	WORLD_READ
a0bbcb
+	WORLD_EXECUTE
a0bbcb
+   )
a0bbcb
+
a0bbcb
 install(TARGETS ${PROJECT_NAME}
a0bbcb
     EXPORT ${PROJECT_NAME}-targets
a0bbcb
     RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
a0bbcb
a0bbcb
From 3a3ab6c7d8991892a44267919204f852dbd512ed Mon Sep 17 00:00:00 2001
a0bbcb
From: Eric Haszlakiewicz <erh+git@nimenees.com>
a0bbcb
Date: Sun, 3 May 2020 03:50:16 +0000
a0bbcb
Subject: [PATCH 02/18] Fix cmake-configure to accept "--prefix=<foo>" in
a0bbcb
 addition to "--prefix <foo>" (see also Issue #591)
a0bbcb
a0bbcb
---
a0bbcb
 cmake-configure | 3 +++
a0bbcb
 1 file changed, 3 insertions(+)
a0bbcb
a0bbcb
diff --git a/cmake-configure b/cmake-configure
a0bbcb
index 7a06b660c1..2fcc39e3ca 100755
a0bbcb
--- a/cmake-configure
a0bbcb
+++ b/cmake-configure
a0bbcb
@@ -52,6 +52,9 @@ while [ $# -gt 0 ] ; do
a0bbcb
 		FLAGS+=(-DCMAKE_INSTALL_PREFIX="$2")
a0bbcb
 		shift
a0bbcb
 		;;
a0bbcb
+	--prefix=*)
a0bbcb
+		FLAGS+=(-DCMAKE_INSTALL_PREFIX="${1##--prefix=}")
a0bbcb
+		;;
a0bbcb
 	--enable-threading)
a0bbcb
 		FLAGS+=(-DENABLE_THREADING=ON)
a0bbcb
 		;;
a0bbcb
a0bbcb
From 0ca0361a24cd9f76b9bcb92eba2a752ff5269cea Mon Sep 17 00:00:00 2001
a0bbcb
From: Tudor Brindus <me@tbrindus.ca>
a0bbcb
Date: Fri, 1 May 2020 22:24:20 -0400
a0bbcb
Subject: [PATCH 03/18] Fix segmentation fault in CPUID check
a0bbcb
a0bbcb
---
a0bbcb
 random_seed.c | 15 ++-------------
a0bbcb
 1 file changed, 2 insertions(+), 13 deletions(-)
a0bbcb
a0bbcb
diff --git a/random_seed.c b/random_seed.c
a0bbcb
index fc19e26d13..c459f0f92f 100644
a0bbcb
--- a/random_seed.c
a0bbcb
+++ b/random_seed.c
a0bbcb
@@ -26,19 +26,8 @@
a0bbcb
 static void do_cpuid(int regs[], int h)
a0bbcb
 {
a0bbcb
 	/* clang-format off */
a0bbcb
-    __asm__ __volatile__(
a0bbcb
-#if defined __x86_64__
a0bbcb
-                         "pushq %%rbx;\n"
a0bbcb
-#else
a0bbcb
-                         "pushl %%ebx;\n"
a0bbcb
-#endif
a0bbcb
-                         "cpuid;\n"
a0bbcb
-#if defined __x86_64__
a0bbcb
-                         "popq %%rbx;\n"
a0bbcb
-#else
a0bbcb
-                         "popl %%ebx;\n"
a0bbcb
-#endif
a0bbcb
-                         : "=a"(regs[0]), [ebx] "=r"(regs[1]), "=c"(regs[2]), "=d"(regs[3])
a0bbcb
+    __asm__ __volatile__("cpuid"
a0bbcb
+                         : "=a"(regs[0]), "=b"(regs[1]), "=c"(regs[2]), "=d"(regs[3])
a0bbcb
                          : "a"(h));
a0bbcb
 	/* clang-format on */
a0bbcb
 }
a0bbcb
a0bbcb
From 23005a7d9d7e9a1c433689b5df29a53bf629b470 Mon Sep 17 00:00:00 2001
a0bbcb
From: Tudor Brindus <me@tbrindus.ca>
a0bbcb
Date: Fri, 1 May 2020 21:09:22 -0400
a0bbcb
Subject: [PATCH 04/18] Detect broken RDRAND during initialization
a0bbcb
a0bbcb
Some CPUs advertise RDRAND in CPUID, but return 0xFFFFFFFF
a0bbcb
unconditionally. To avoid locking up later, test RDRAND during
a0bbcb
initialization, and if it returns 0xFFFFFFFF, mark it as nonexistent.
a0bbcb
a0bbcb
Fixes #588.
a0bbcb
---
a0bbcb
 random_seed.c | 37 +++++++++++++++++++++++++++++++++----
a0bbcb
 1 file changed, 33 insertions(+), 4 deletions(-)
a0bbcb
a0bbcb
diff --git a/random_seed.c b/random_seed.c
a0bbcb
index c459f0f92f..4ddcb07d16 100644
a0bbcb
--- a/random_seed.c
a0bbcb
+++ b/random_seed.c
a0bbcb
@@ -43,12 +43,41 @@ static void do_cpuid(int regs[], int h)
a0bbcb
 
a0bbcb
 #if HAS_X86_CPUID
a0bbcb
 
a0bbcb
+static int get_rdrand_seed(void);
a0bbcb
+
a0bbcb
+// Valid values are -1 (haven't tested), 0 (no), and 1 (yes).
a0bbcb
+static int _has_rdrand = -1;
a0bbcb
+
a0bbcb
 static int has_rdrand(void)
a0bbcb
 {
a0bbcb
-	// CPUID.01H:ECX.RDRAND[bit 30] == 1
a0bbcb
-	int regs[4];
a0bbcb
-	do_cpuid(regs, 1);
a0bbcb
-	return (regs[2] & (1 << 30)) != 0;
a0bbcb
+	if (_has_rdrand == -1)
a0bbcb
+	{
a0bbcb
+		// CPUID.01H:ECX.RDRAND[bit 30] == 1
a0bbcb
+		int regs[4];
a0bbcb
+		do_cpuid(regs, 1);
a0bbcb
+		if (!(regs[2] & (1 << 30)))
a0bbcb
+		{
a0bbcb
+			_has_rdrand = 0;
a0bbcb
+		} else
a0bbcb
+		{
a0bbcb
+			// Some CPUs advertise RDRAND in CPUID, but return 0xFFFFFFFF
a0bbcb
+			// unconditionally. To avoid locking up later, test RDRAND here. If over
a0bbcb
+			// 10 trials RDRAND has returned the same value, declare it broken.
a0bbcb
+			_has_rdrand = 0;
a0bbcb
+			int prev = get_rdrand_seed();
a0bbcb
+			for (int i = 0; i < 10; i++) {
a0bbcb
+				int temp = get_rdrand_seed();
a0bbcb
+				if (temp != prev) {
a0bbcb
+					_has_rdrand = 1;
a0bbcb
+					break;
a0bbcb
+				}
a0bbcb
+
a0bbcb
+				prev = temp;
a0bbcb
+			}
a0bbcb
+		}
a0bbcb
+	}
a0bbcb
+
a0bbcb
+	return _has_rdrand;
a0bbcb
 }
a0bbcb
 
a0bbcb
 #endif
a0bbcb
a0bbcb
From 8d28e677e6a0919dcea40ea9a5b5d484df1d7d41 Mon Sep 17 00:00:00 2001
a0bbcb
From: Eric Haszlakiewicz <erh+git@nimenees.com>
a0bbcb
Date: Mon, 4 May 2020 01:29:02 +0000
a0bbcb
Subject: [PATCH 05/18] Issue #589: drop the rdrand test loops to just 3, tweak
a0bbcb
 comments and add some links to bug reports, and decrease the nesting level of
a0bbcb
 the has_rdrand() function.
a0bbcb
a0bbcb
---
a0bbcb
 random_seed.c | 64 +++++++++++++++++++++++++++++++--------------------
a0bbcb
 1 file changed, 39 insertions(+), 25 deletions(-)
a0bbcb
a0bbcb
diff --git a/random_seed.c b/random_seed.c
a0bbcb
index 4ddcb07d16..b5f8a0795e 100644
a0bbcb
--- a/random_seed.c
a0bbcb
+++ b/random_seed.c
a0bbcb
@@ -45,36 +45,46 @@ static void do_cpuid(int regs[], int h)
a0bbcb
 
a0bbcb
 static int get_rdrand_seed(void);
a0bbcb
 
a0bbcb
-// Valid values are -1 (haven't tested), 0 (no), and 1 (yes).
a0bbcb
+/* Valid values are -1 (haven't tested), 0 (no), and 1 (yes). */
a0bbcb
 static int _has_rdrand = -1;
a0bbcb
 
a0bbcb
 static int has_rdrand(void)
a0bbcb
 {
a0bbcb
-	if (_has_rdrand == -1)
a0bbcb
+	if (_has_rdrand != -1)
a0bbcb
 	{
a0bbcb
-		// CPUID.01H:ECX.RDRAND[bit 30] == 1
a0bbcb
-		int regs[4];
a0bbcb
-		do_cpuid(regs, 1);
a0bbcb
-		if (!(regs[2] & (1 << 30)))
a0bbcb
-		{
a0bbcb
-			_has_rdrand = 0;
a0bbcb
-		} else
a0bbcb
+		return _has_rdrand;
a0bbcb
+	}
a0bbcb
+
a0bbcb
+	/* CPUID.01H:ECX.RDRAND[bit 30] == 1 */
a0bbcb
+	int regs[4];
a0bbcb
+	do_cpuid(regs, 1);
a0bbcb
+	if (!(regs[2] & (1 << 30)))
a0bbcb
+	{
a0bbcb
+		_has_rdrand = 0;
a0bbcb
+		return 0;
a0bbcb
+	}
a0bbcb
+
a0bbcb
+	/*
a0bbcb
+	 * Some CPUs advertise RDRAND in CPUID, but return 0xFFFFFFFF
a0bbcb
+	 * unconditionally. To avoid locking up later, test RDRAND here. If over
a0bbcb
+	 * 3 trials RDRAND has returned the same value, declare it broken.
a0bbcb
+	 * Example CPUs are AMD Ryzen 3000 series
a0bbcb
+	 * and much older AMD APUs, such as the E1-1500
a0bbcb
+	 * https://github.com/systemd/systemd/issues/11810
a0bbcb
+	 * https://linuxreviews.org/RDRAND_stops_returning_random_values_on_older_AMD_CPUs_after_suspend
a0bbcb
+	 */
a0bbcb
+	_has_rdrand = 0;
a0bbcb
+	int prev = get_rdrand_seed();
a0bbcb
+	for (int i = 0; i < 3; i++)
a0bbcb
+	{
a0bbcb
+		int temp = get_rdrand_seed();
a0bbcb
+		if (temp != prev)
a0bbcb
 		{
a0bbcb
-			// Some CPUs advertise RDRAND in CPUID, but return 0xFFFFFFFF
a0bbcb
-			// unconditionally. To avoid locking up later, test RDRAND here. If over
a0bbcb
-			// 10 trials RDRAND has returned the same value, declare it broken.
a0bbcb
-			_has_rdrand = 0;
a0bbcb
-			int prev = get_rdrand_seed();
a0bbcb
-			for (int i = 0; i < 10; i++) {
a0bbcb
-				int temp = get_rdrand_seed();
a0bbcb
-				if (temp != prev) {
a0bbcb
-					_has_rdrand = 1;
a0bbcb
-					break;
a0bbcb
-				}
a0bbcb
-
a0bbcb
-				prev = temp;
a0bbcb
-			}
a0bbcb
+			_has_rdrand = 1;
a0bbcb
+			break;
a0bbcb
 		}
a0bbcb
+
a0bbcb
+		prev = temp;
a0bbcb
 	}
a0bbcb
 
a0bbcb
 	return _has_rdrand;
a0bbcb
@@ -92,7 +102,7 @@ static int get_rdrand_seed(void)
a0bbcb
 {
a0bbcb
 	DEBUG_SEED("get_rdrand_seed");
a0bbcb
 	int _eax;
a0bbcb
-	// rdrand eax
a0bbcb
+	/* rdrand eax */
a0bbcb
 	/* clang-format off */
a0bbcb
 	__asm__ __volatile__("1: .byte 0x0F\n"
a0bbcb
 	                     "   .byte 0xC7\n"
a0bbcb
@@ -132,7 +142,7 @@ static int get_rdrand_seed(void)
a0bbcb
 	DEBUG_SEED("get_rdrand_seed");
a0bbcb
 	int _eax;
a0bbcb
 retry:
a0bbcb
-	// rdrand eax
a0bbcb
+	/* rdrand eax */
a0bbcb
 	__asm _emit 0x0F __asm _emit 0xC7 __asm _emit 0xF0
a0bbcb
 	__asm jnc retry
a0bbcb
 	__asm mov _eax, eax
a0bbcb
@@ -206,6 +216,10 @@ static int get_dev_random_seed(void)
a0bbcb
 
a0bbcb
 /* clang-format off */
a0bbcb
 #include <windows.h>
a0bbcb
+
a0bbcb
+/* Caution: these blank lines must remain so clang-format doesn't reorder
a0bbcb
+   includes to put windows.h after wincrypt.h */
a0bbcb
+
a0bbcb
 #include <wincrypt.h>
a0bbcb
 /* clang-format on */
a0bbcb
 #ifndef __GNUC__
a0bbcb
a0bbcb
From a9695f34c3f4bbd4475597cce1e5d48284286634 Mon Sep 17 00:00:00 2001
a0bbcb
From: Tobias Stoeckmann <tobias@stoeckmann.org>
a0bbcb
Date: Mon, 4 May 2020 19:41:16 +0200
a0bbcb
Subject: [PATCH 06/18] Protect array_list_del_idx against size_t overflow.
a0bbcb
a0bbcb
If the assignment of stop overflows due to idx and count being
a0bbcb
larger than SIZE_T_MAX in sum, out of boundary access could happen.
a0bbcb
a0bbcb
It takes invalid usage of this function for this to happen, but
a0bbcb
I decided to add this check so array_list_del_idx is as safe against
a0bbcb
bad usage as the other arraylist functions.
a0bbcb
---
a0bbcb
 arraylist.c | 3 +++
a0bbcb
 1 file changed, 3 insertions(+)
a0bbcb
a0bbcb
diff --git a/arraylist.c b/arraylist.c
a0bbcb
index 12ad8af6d3..e5524aca75 100644
a0bbcb
--- a/arraylist.c
a0bbcb
+++ b/arraylist.c
a0bbcb
@@ -136,6 +136,9 @@ int array_list_del_idx(struct array_list *arr, size_t idx, size_t count)
a0bbcb
 {
a0bbcb
 	size_t i, stop;
a0bbcb
 
a0bbcb
+	/* Avoid overflow in calculation with large indices. */
a0bbcb
+	if (idx > SIZE_T_MAX - count)
a0bbcb
+		return -1;
a0bbcb
 	stop = idx + count;
a0bbcb
 	if (idx >= arr->length || stop > arr->length)
a0bbcb
 		return -1;
a0bbcb
a0bbcb
From e66f7f7223fc6a2d3b808216ae28c7de65a54fe7 Mon Sep 17 00:00:00 2001
a0bbcb
From: Tobias Stoeckmann <tobias@stoeckmann.org>
a0bbcb
Date: Mon, 4 May 2020 19:46:45 +0200
a0bbcb
Subject: [PATCH 07/18] Prevent division by zero in linkhash.
a0bbcb
a0bbcb
If a linkhash with a size of zero is created, then modulo operations
a0bbcb
are prone to division by zero operations.
a0bbcb
a0bbcb
Purely protective measure against bad usage.
a0bbcb
---
a0bbcb
 linkhash.c | 3 +++
a0bbcb
 1 file changed, 3 insertions(+)
a0bbcb
a0bbcb
diff --git a/linkhash.c b/linkhash.c
a0bbcb
index 7ea58c0abf..f05cc38030 100644
a0bbcb
--- a/linkhash.c
a0bbcb
+++ b/linkhash.c
a0bbcb
@@ -12,6 +12,7 @@
a0bbcb
 
a0bbcb
 #include "config.h"
a0bbcb
 
a0bbcb
+#include <assert.h>
a0bbcb
 #include <limits.h>
a0bbcb
 #include <stdarg.h>
a0bbcb
 #include <stddef.h>
a0bbcb
@@ -499,6 +500,8 @@ struct lh_table *lh_table_new(int size, lh_entry_free_fn *free_fn, lh_hash_fn *h
a0bbcb
 	int i;
a0bbcb
 	struct lh_table *t;
a0bbcb
 
a0bbcb
+	/* Allocate space for elements to avoid divisions by zero. */
a0bbcb
+	assert(size > 0);
a0bbcb
 	t = (struct lh_table *)calloc(1, sizeof(struct lh_table));
a0bbcb
 	if (!t)
a0bbcb
 		return NULL;
a0bbcb
a0bbcb
From c4eae053d4d5c6f300984677b4435f0c00f706a9 Mon Sep 17 00:00:00 2001
a0bbcb
From: Tobias Stoeckmann <tobias@stoeckmann.org>
a0bbcb
Date: Mon, 4 May 2020 19:47:25 +0200
a0bbcb
Subject: [PATCH 08/18] Fix integer overflows.
a0bbcb
a0bbcb
The data structures linkhash and printbuf are limited to 2 GB in size
a0bbcb
due to a signed integer being used to track their current size.
a0bbcb
a0bbcb
If too much data is added, then size variable can overflow, which is
a0bbcb
an undefined behaviour in C programming language.
a0bbcb
a0bbcb
Assuming that a signed int overflow just leads to a negative value,
a0bbcb
like it happens on many sytems (Linux i686/amd64 with gcc), then
a0bbcb
printbuf is vulnerable to an out of boundary write on 64 bit systems.
a0bbcb
---
a0bbcb
 linkhash.c |  7 +++++--
a0bbcb
 printbuf.c | 19 ++++++++++++++++---
a0bbcb
 2 files changed, 21 insertions(+), 5 deletions(-)
a0bbcb
a0bbcb
diff --git a/linkhash.c b/linkhash.c
a0bbcb
index f05cc38030..51e90b13a2 100644
a0bbcb
--- a/linkhash.c
a0bbcb
+++ b/linkhash.c
a0bbcb
@@ -580,9 +580,12 @@ int lh_table_insert_w_hash(struct lh_table *t, const void *k, const void *v, con
a0bbcb
 {
a0bbcb
 	unsigned long n;
a0bbcb
 
a0bbcb
-	if (t->count >= t->size * LH_LOAD_FACTOR)
a0bbcb
-		if (lh_table_resize(t, t->size * 2) != 0)
a0bbcb
+	if (t->count >= t->size * LH_LOAD_FACTOR) {
a0bbcb
+		/* Avoid signed integer overflow with large tables. */
a0bbcb
+		int new_size = INT_MAX / 2 < t->size ? t->size * 2 : INT_MAX;
a0bbcb
+		if (t->size == INT_MAX || lh_table_resize(t, new_size) != 0)
a0bbcb
 			return -1;
a0bbcb
+	}
a0bbcb
 
a0bbcb
 	n = h % t->size;
a0bbcb
 
a0bbcb
diff --git a/printbuf.c b/printbuf.c
a0bbcb
index 976c12dde5..00822fac4f 100644
a0bbcb
--- a/printbuf.c
a0bbcb
+++ b/printbuf.c
a0bbcb
@@ -15,6 +15,7 @@
a0bbcb
 
a0bbcb
 #include "config.h"
a0bbcb
 
a0bbcb
+#include <limits.h>
a0bbcb
 #include <stdio.h>
a0bbcb
 #include <stdlib.h>
a0bbcb
 #include <string.h>
a0bbcb
@@ -65,10 +66,16 @@ static int printbuf_extend(struct printbuf *p, int min_size)
a0bbcb
 
a0bbcb
 	if (p->size >= min_size)
a0bbcb
 		return 0;
a0bbcb
-
a0bbcb
-	new_size = p->size * 2;
a0bbcb
-	if (new_size < min_size + 8)
a0bbcb
+	/* Prevent signed integer overflows with large buffers. */
a0bbcb
+	if (min_size > INT_MAX - 8)
a0bbcb
+		return -1;
a0bbcb
+	if (p->size > INT_MAX / 2)
a0bbcb
 		new_size = min_size + 8;
a0bbcb
+	else {
a0bbcb
+		new_size = p->size * 2;
a0bbcb
+		if (new_size < min_size + 8)
a0bbcb
+			new_size = min_size + 8;
a0bbcb
+	}
a0bbcb
 #ifdef PRINTBUF_DEBUG
a0bbcb
 	MC_DEBUG("printbuf_memappend: realloc "
a0bbcb
 	         "bpos=%d min_size=%d old_size=%d new_size=%d\n",
a0bbcb
@@ -83,6 +90,9 @@ static int printbuf_extend(struct printbuf *p, int min_size)
a0bbcb
 
a0bbcb
 int printbuf_memappend(struct printbuf *p, const char *buf, int size)
a0bbcb
 {
a0bbcb
+	/* Prevent signed integer overflows with large buffers. */
a0bbcb
+	if (size > INT_MAX - p->bpos - 1)
a0bbcb
+		return -1;
a0bbcb
 	if (p->size <= p->bpos + size + 1)
a0bbcb
 	{
a0bbcb
 		if (printbuf_extend(p, p->bpos + size + 1) < 0)
a0bbcb
@@ -100,6 +110,9 @@ int printbuf_memset(struct printbuf *pb, int offset, int charvalue, int len)
a0bbcb
 
a0bbcb
 	if (offset == -1)
a0bbcb
 		offset = pb->bpos;
a0bbcb
+	/* Prevent signed integer overflows with large buffers. */
a0bbcb
+	if (len > INT_MAX - offset)
a0bbcb
+		return -1;
a0bbcb
 	size_needed = offset + len;
a0bbcb
 	if (pb->size < size_needed)
a0bbcb
 	{
a0bbcb
a0bbcb
From 392770c8e5c0783185bdfe0d919737e705190904 Mon Sep 17 00:00:00 2001
a0bbcb
From: dota17 <chenguopingdota@163.com>
a0bbcb
Date: Wed, 6 May 2020 10:48:53 +0800
a0bbcb
Subject: [PATCH 09/18] support to build both static and shared libraries
a0bbcb
a0bbcb
---
a0bbcb
 CMakeLists.txt | 20 ++++++++++++++++++++
a0bbcb
 README.md      | 10 +++++++++-
a0bbcb
 2 files changed, 29 insertions(+), 1 deletion(-)
a0bbcb
a0bbcb
diff --git a/CMakeLists.txt b/CMakeLists.txt
a0bbcb
index ea536947df..7d7bd7fcc4 100644
a0bbcb
--- a/CMakeLists.txt
a0bbcb
+++ b/CMakeLists.txt
a0bbcb
@@ -392,6 +392,26 @@ target_include_directories(${PROJECT_NAME}
a0bbcb
         $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}>
a0bbcb
 )
a0bbcb
 
a0bbcb
+# Allow to build static and shared libraries at the same time
a0bbcb
+if (BUILD_STATIC_LIBS)
a0bbcb
+    set(ORIGINAL_STATIC_LIB_NAME ${PROJECT_NAME}-static)
a0bbcb
+    add_library(${ORIGINAL_STATIC_LIB_NAME} STATIC
a0bbcb
+        ${JSON_C_SOURCES}
a0bbcb
+        ${JSON_C_HEADERS}
a0bbcb
+    )
a0bbcb
+
a0bbcb
+    # rename the static library
a0bbcb
+    set_target_properties(${ORIGINAL_STATIC_LIB_NAME} PROPERTIES
a0bbcb
+        OUTPUT_NAME ${PROJECT_NAME}
a0bbcb
+    )
a0bbcb
+
a0bbcb
+    target_include_directories(${PROJECT_NAME}
a0bbcb
+        PUBLIC
a0bbcb
+            $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}>
a0bbcb
+            $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}>
a0bbcb
+    )
a0bbcb
+endif ()
a0bbcb
+
a0bbcb
 # Always create new install dirs with 0755 permissions, regardless of umask
a0bbcb
 set(CMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS
a0bbcb
 	OWNER_READ
a0bbcb
diff --git a/README.md b/README.md
a0bbcb
index 39ea0d6814..909fd116bf 100644
a0bbcb
--- a/README.md
a0bbcb
+++ b/README.md
a0bbcb
@@ -98,6 +98,7 @@ Variable             | Type   | Description
a0bbcb
 CMAKE_INSTALL_PREFIX | String | The install location.
a0bbcb
 CMAKE_BUILD_TYPE     | String | Defaults to "debug"
a0bbcb
 BUILD_SHARED_LIBS    | Bool   | The default build generates a dynamic (dll/so) library.  Set this to OFF to create a static library instead.
a0bbcb
+BUILD_STATIC_LIBS    | Bool   | This build generates a static (lib/a) library.
a0bbcb
 ENABLE_RDRAND        | Bool   | Enable RDRAND Hardware RNG Hash Seed
a0bbcb
 ENABLE_THREADING     | Bool   | Enable partial threading support
a0bbcb
 DISABLE_WERROR       | Bool   | Disable use of -Werror
a0bbcb
@@ -106,7 +107,14 @@ DISABLE_BSYMBOLIC    | Bool   | Disable use of -Bsymbolic-functions
a0bbcb
 Pass these options as `-D` on CMake's command-line.
a0bbcb
 
a0bbcb
 ```sh
a0bbcb
-cmake -DBUILD_SHARED_LIBS=OFF ...
a0bbcb
+# build a static library
a0bbcb
+cmake -DBUILD_SHARED_LIBS=OFF ..
a0bbcb
+```
a0bbcb
+
a0bbcb
+Allow to build both static and shared libraries.
a0bbcb
+
a0bbcb
+```sh
a0bbcb
+cmake -DBUILD_STATIC_LIBS=ON ..
a0bbcb
 ```
a0bbcb
 
a0bbcb
 ### Building with partial threading support
a0bbcb
a0bbcb
From af7a3e05af5e7410c1d8e00ec10b728db737843a Mon Sep 17 00:00:00 2001
a0bbcb
From: dota17 <chenguopingdota@163.com>
a0bbcb
Date: Thu, 7 May 2020 14:50:43 +0800
a0bbcb
Subject: [PATCH 10/18] update
a0bbcb
a0bbcb
---
a0bbcb
 CMakeLists.txt |  7 +------
a0bbcb
 README.md      | 12 +++---------
a0bbcb
 2 files changed, 4 insertions(+), 15 deletions(-)
a0bbcb
a0bbcb
diff --git a/CMakeLists.txt b/CMakeLists.txt
a0bbcb
index 7d7bd7fcc4..f82103879a 100644
a0bbcb
--- a/CMakeLists.txt
a0bbcb
+++ b/CMakeLists.txt
a0bbcb
@@ -65,6 +65,7 @@ include(GNUInstallDirs)
a0bbcb
 include(CMakePackageConfigHelpers)
a0bbcb
 
a0bbcb
 option(BUILD_SHARED_LIBS  "Default to building shared libraries" ON)
a0bbcb
+option(BUILD_STATIC_LIBS  "Default to building static libraries" ON)
a0bbcb
 
a0bbcb
 # Generate a release merge and test it to verify the correctness of republishing the package.
a0bbcb
 ADD_CUSTOM_TARGET(distcheck
a0bbcb
@@ -404,12 +405,6 @@ if (BUILD_STATIC_LIBS)
a0bbcb
     set_target_properties(${ORIGINAL_STATIC_LIB_NAME} PROPERTIES
a0bbcb
         OUTPUT_NAME ${PROJECT_NAME}
a0bbcb
     )
a0bbcb
-
a0bbcb
-    target_include_directories(${PROJECT_NAME}
a0bbcb
-        PUBLIC
a0bbcb
-            $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}>
a0bbcb
-            $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}>
a0bbcb
-    )
a0bbcb
 endif ()
a0bbcb
 
a0bbcb
 # Always create new install dirs with 0755 permissions, regardless of umask
a0bbcb
diff --git a/README.md b/README.md
a0bbcb
index 909fd116bf..f5a7ee39b4 100644
a0bbcb
--- a/README.md
a0bbcb
+++ b/README.md
a0bbcb
@@ -97,8 +97,8 @@ Variable             | Type   | Description
a0bbcb
 ---------------------|--------|--------------
a0bbcb
 CMAKE_INSTALL_PREFIX | String | The install location.
a0bbcb
 CMAKE_BUILD_TYPE     | String | Defaults to "debug"
a0bbcb
-BUILD_SHARED_LIBS    | Bool   | The default build generates a dynamic (dll/so) library.  Set this to OFF to create a static library instead.
a0bbcb
-BUILD_STATIC_LIBS    | Bool   | This build generates a static (lib/a) library.
a0bbcb
+BUILD_SHARED_LIBS    | Bool   | The default build generates a dynamic (dll/so) library.  Set this to OFF to create a static library only.
a0bbcb
+BUILD_STATIC_LIBS    | Bool   | The default build generates a static (lib/a) library.  Set this to OFF to create a shared library only.
a0bbcb
 ENABLE_RDRAND        | Bool   | Enable RDRAND Hardware RNG Hash Seed
a0bbcb
 ENABLE_THREADING     | Bool   | Enable partial threading support
a0bbcb
 DISABLE_WERROR       | Bool   | Disable use of -Werror
a0bbcb
@@ -107,16 +107,10 @@ DISABLE_BSYMBOLIC    | Bool   | Disable use of -Bsymbolic-functions
a0bbcb
 Pass these options as `-D` on CMake's command-line.
a0bbcb
 
a0bbcb
 ```sh
a0bbcb
-# build a static library
a0bbcb
+# build a static library only
a0bbcb
 cmake -DBUILD_SHARED_LIBS=OFF ..
a0bbcb
 ```
a0bbcb
 
a0bbcb
-Allow to build both static and shared libraries.
a0bbcb
-
a0bbcb
-```sh
a0bbcb
-cmake -DBUILD_STATIC_LIBS=ON ..
a0bbcb
-```
a0bbcb
-
a0bbcb
 ### Building with partial threading support
a0bbcb
 
a0bbcb
 Although json-c does not support fully multi-threaded access to
a0bbcb
a0bbcb
From 077eceead18152fae8c6bd8e2288d53d5eba7cf6 Mon Sep 17 00:00:00 2001
a0bbcb
From: hofnarr <hofnarr@hofnarr.fi>
a0bbcb
Date: Fri, 8 May 2020 02:16:52 +0300
a0bbcb
Subject: [PATCH 11/18] cmake: add list for build targets
a0bbcb
a0bbcb
---
a0bbcb
 CMakeLists.txt | 5 +++--
a0bbcb
 1 file changed, 3 insertions(+), 2 deletions(-)
a0bbcb
a0bbcb
diff --git a/CMakeLists.txt b/CMakeLists.txt
a0bbcb
index f82103879a..00613a8d67 100644
a0bbcb
--- a/CMakeLists.txt
a0bbcb
+++ b/CMakeLists.txt
a0bbcb
@@ -384,7 +384,7 @@ add_library(${PROJECT_NAME}
a0bbcb
 set_target_properties(${PROJECT_NAME} PROPERTIES
a0bbcb
     VERSION 5.0.0
a0bbcb
     SOVERSION 5)
a0bbcb
-
a0bbcb
+list(APPEND CMAKE_TARGETS ${PROJECT_NAME})
a0bbcb
 # If json-c is used as subroject it set to target correct interface -I flags and allow
a0bbcb
 # to build external target without extra include_directories(...)
a0bbcb
 target_include_directories(${PROJECT_NAME}
a0bbcb
@@ -405,6 +405,7 @@ if (BUILD_STATIC_LIBS)
a0bbcb
     set_target_properties(${ORIGINAL_STATIC_LIB_NAME} PROPERTIES
a0bbcb
         OUTPUT_NAME ${PROJECT_NAME}
a0bbcb
     )
a0bbcb
+    list(APPEND CMAKE_TARGETS ${STATIC_LIB})
a0bbcb
 endif ()
a0bbcb
 
a0bbcb
 # Always create new install dirs with 0755 permissions, regardless of umask
a0bbcb
@@ -418,7 +419,7 @@ set(CMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS
a0bbcb
 	WORLD_EXECUTE
a0bbcb
    )
a0bbcb
 
a0bbcb
-install(TARGETS ${PROJECT_NAME}
a0bbcb
+install(TARGETS ${CMAKE_TARGETS}
a0bbcb
     EXPORT ${PROJECT_NAME}-targets
a0bbcb
     RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
a0bbcb
     LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
a0bbcb
a0bbcb
From 20895f941ee4e1ffe8248c30c01322970479d7cd Mon Sep 17 00:00:00 2001
a0bbcb
From: hofnarr <hofnarr@hofnarr.fi>
a0bbcb
Date: Fri, 8 May 2020 02:19:38 +0300
a0bbcb
Subject: [PATCH 12/18] cmake: change variable name
a0bbcb
a0bbcb
---
a0bbcb
 CMakeLists.txt | 6 +++---
a0bbcb
 1 file changed, 3 insertions(+), 3 deletions(-)
a0bbcb
a0bbcb
diff --git a/CMakeLists.txt b/CMakeLists.txt
a0bbcb
index 00613a8d67..7302d4edf0 100644
a0bbcb
--- a/CMakeLists.txt
a0bbcb
+++ b/CMakeLists.txt
a0bbcb
@@ -395,14 +395,14 @@ target_include_directories(${PROJECT_NAME}
a0bbcb
 
a0bbcb
 # Allow to build static and shared libraries at the same time
a0bbcb
 if (BUILD_STATIC_LIBS)
a0bbcb
-    set(ORIGINAL_STATIC_LIB_NAME ${PROJECT_NAME}-static)
a0bbcb
-    add_library(${ORIGINAL_STATIC_LIB_NAME} STATIC
a0bbcb
+    set(STATIC_LIB ${PROJECT_NAME}-static)
a0bbcb
+    add_library(${STATIC_LIB} STATIC
a0bbcb
         ${JSON_C_SOURCES}
a0bbcb
         ${JSON_C_HEADERS}
a0bbcb
     )
a0bbcb
 
a0bbcb
     # rename the static library
a0bbcb
-    set_target_properties(${ORIGINAL_STATIC_LIB_NAME} PROPERTIES
a0bbcb
+    set_target_properties(${STATIC_LIB} PROPERTIES
a0bbcb
         OUTPUT_NAME ${PROJECT_NAME}
a0bbcb
     )
a0bbcb
     list(APPEND CMAKE_TARGETS ${STATIC_LIB})
a0bbcb
a0bbcb
From 2db5633de4980a33c911e9a52984ac62f2a5edf7 Mon Sep 17 00:00:00 2001
a0bbcb
From: hofnarr <hofnarr@hofnarr.fi>
a0bbcb
Date: Fri, 8 May 2020 02:27:06 +0300
a0bbcb
Subject: [PATCH 13/18] cmake-configure: fix enable-static option
a0bbcb
a0bbcb
---
a0bbcb
 cmake-configure | 2 +-
a0bbcb
 1 file changed, 1 insertion(+), 1 deletion(-)
a0bbcb
a0bbcb
diff --git a/cmake-configure b/cmake-configure
a0bbcb
index 2fcc39e3ca..c8e44aeed4 100755
a0bbcb
--- a/cmake-configure
a0bbcb
+++ b/cmake-configure
a0bbcb
@@ -65,7 +65,7 @@ while [ $# -gt 0 ] ; do
a0bbcb
 		FLAGS+=(-DBUILD_SHARED_LIBS=ON)
a0bbcb
 		;;
a0bbcb
 	--enable-static)
a0bbcb
-		FLAGS+=(-DBUILD_SHARED_LIBS=OFF)
a0bbcb
+		FLAGS+=(-DBUILD_STATIC_LIBS=ON)
a0bbcb
 		;;
a0bbcb
 	--disable-Bsymbolic)
a0bbcb
 		FLAGS+=(-DDISABLE_BSYMBOLIC=ON)
a0bbcb
a0bbcb
From 7a4807fe0cdb1d9e20273c79762cbf54833aaae4 Mon Sep 17 00:00:00 2001
a0bbcb
From: Eric Haszlakiewicz <erh+git@nimenees.com>
a0bbcb
Date: Sun, 10 May 2020 03:32:19 +0000
a0bbcb
Subject: [PATCH 14/18] Issue #599: Fix the backwards check in
a0bbcb
 lh_table_insert_w_hash() that was preventing adding more than 11 objects. Add
a0bbcb
 a test to check for this too.
a0bbcb
a0bbcb
---
a0bbcb
 linkhash.c           |  2 +-
a0bbcb
 tests/test4.c        | 29 +++++++++++++++++++++++++++++
a0bbcb
 tests/test4.expected |  1 +
a0bbcb
 3 files changed, 31 insertions(+), 1 deletion(-)
a0bbcb
a0bbcb
diff --git a/linkhash.c b/linkhash.c
a0bbcb
index 51e90b13a2..f930efd387 100644
a0bbcb
--- a/linkhash.c
a0bbcb
+++ b/linkhash.c
a0bbcb
@@ -582,7 +582,7 @@ int lh_table_insert_w_hash(struct lh_table *t, const void *k, const void *v, con
a0bbcb
 
a0bbcb
 	if (t->count >= t->size * LH_LOAD_FACTOR) {
a0bbcb
 		/* Avoid signed integer overflow with large tables. */
a0bbcb
-		int new_size = INT_MAX / 2 < t->size ? t->size * 2 : INT_MAX;
a0bbcb
+		int new_size = (t->size > INT_MAX / 2) ? INT_MAX : (t->size * 2);
a0bbcb
 		if (t->size == INT_MAX || lh_table_resize(t, new_size) != 0)
a0bbcb
 			return -1;
a0bbcb
 	}
a0bbcb
diff --git a/tests/test4.c b/tests/test4.c
a0bbcb
index bd964ec789..fd2f3be8ec 100644
a0bbcb
--- a/tests/test4.c
a0bbcb
+++ b/tests/test4.c
a0bbcb
@@ -3,8 +3,10 @@
a0bbcb
  */
a0bbcb
 
a0bbcb
 #include "config.h"
a0bbcb
+#include <assert.h>
a0bbcb
 #include <stdio.h>
a0bbcb
 #include <string.h>
a0bbcb
+#include <stdlib.h>
a0bbcb
 
a0bbcb
 #include "json_inttypes.h"
a0bbcb
 #include "json_object.h"
a0bbcb
@@ -24,6 +26,30 @@ void print_hex(const char *s)
a0bbcb
 	putchar('\n');
a0bbcb
 }
a0bbcb
 
a0bbcb
+static void test_lot_of_adds(void);
a0bbcb
+static void test_lot_of_adds()
a0bbcb
+{
a0bbcb
+	int ii;
a0bbcb
+	char key[50];
a0bbcb
+	json_object *jobj = json_object_new_object();
a0bbcb
+	assert(jobj != NULL);
a0bbcb
+	for (ii = 0; ii < 500; ii++)
a0bbcb
+	{
a0bbcb
+		snprintf(key, sizeof(key), "k%d", ii);
a0bbcb
+		json_object *iobj = json_object_new_int(ii);
a0bbcb
+		assert(iobj != NULL);
a0bbcb
+		if (json_object_object_add(jobj, key, iobj))
a0bbcb
+		{
a0bbcb
+			fprintf(stderr, "FAILED to add object #%d\n", ii);
a0bbcb
+			abort();
a0bbcb
+		}
a0bbcb
+	}
a0bbcb
+	printf("%s\n", json_object_to_json_string(jobj));
a0bbcb
+	assert(json_object_object_length(jobj) == 500);
a0bbcb
+	json_object_put(jobj);
a0bbcb
+}
a0bbcb
+
a0bbcb
+
a0bbcb
 int main(void)
a0bbcb
 {
a0bbcb
 	const char *input = "\"\\ud840\\udd26,\\ud840\\udd27,\\ud800\\udd26,\\ud800\\udd27\"";
a0bbcb
@@ -52,5 +78,8 @@ int main(void)
a0bbcb
 		retval = 1;
a0bbcb
 	}
a0bbcb
 	json_object_put(parse_result);
a0bbcb
+
a0bbcb
+	test_lot_of_adds();
a0bbcb
+
a0bbcb
 	return retval;
a0bbcb
 }
a0bbcb
diff --git a/tests/test4.expected b/tests/test4.expected
a0bbcb
index 68d4336d90..cb2744012b 100644
a0bbcb
--- a/tests/test4.expected
a0bbcb
+++ b/tests/test4.expected
a0bbcb
@@ -1,3 +1,4 @@
a0bbcb
 input: "\ud840\udd26,\ud840\udd27,\ud800\udd26,\ud800\udd27"
a0bbcb
 JSON parse result is correct: 𠄦,𠄧,𐄦,𐄧
a0bbcb
 PASS
a0bbcb
+{ "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 }
a0bbcb
a0bbcb
From b4c0c8d0270155a37f192033786b7602245eb923 Mon Sep 17 00:00:00 2001
a0bbcb
From: Eric Haszlakiewicz <erh+git@nimenees.com>
a0bbcb
Date: Sun, 10 May 2020 03:48:45 +0000
a0bbcb
Subject: [PATCH 15/18] Issue #598: avoid building static libraries twice.
a0bbcb
a0bbcb
---
a0bbcb
 CMakeLists.txt | 2 +-
a0bbcb
 1 file changed, 1 insertion(+), 1 deletion(-)
a0bbcb
a0bbcb
diff --git a/CMakeLists.txt b/CMakeLists.txt
a0bbcb
index 7302d4edf0..67c2ae6e7c 100644
a0bbcb
--- a/CMakeLists.txt
a0bbcb
+++ b/CMakeLists.txt
a0bbcb
@@ -394,7 +394,7 @@ target_include_directories(${PROJECT_NAME}
a0bbcb
 )
a0bbcb
 
a0bbcb
 # Allow to build static and shared libraries at the same time
a0bbcb
-if (BUILD_STATIC_LIBS)
a0bbcb
+if (BUILD_STATIC_LIBS AND BUILD_SHARED_LIBS)
a0bbcb
     set(STATIC_LIB ${PROJECT_NAME}-static)
a0bbcb
     add_library(${STATIC_LIB} STATIC
a0bbcb
         ${JSON_C_SOURCES}
a0bbcb
a0bbcb
From 5d3466d0cb709da0f84b1010c4658a87805db47f Mon Sep 17 00:00:00 2001
a0bbcb
From: Eric Haszlakiewicz <erh+git@nimenees.com>
a0bbcb
Date: Sun, 10 May 2020 03:58:27 +0000
a0bbcb
Subject: [PATCH 16/18] Re-format after recent change to fix linkhash.
a0bbcb
a0bbcb
---
a0bbcb
 linkhash.c    | 3 ++-
a0bbcb
 tests/test4.c | 3 +--
a0bbcb
 2 files changed, 3 insertions(+), 3 deletions(-)
a0bbcb
a0bbcb
diff --git a/linkhash.c b/linkhash.c
a0bbcb
index f930efd387..b021ef10b0 100644
a0bbcb
--- a/linkhash.c
a0bbcb
+++ b/linkhash.c
a0bbcb
@@ -580,7 +580,8 @@ int lh_table_insert_w_hash(struct lh_table *t, const void *k, const void *v, con
a0bbcb
 {
a0bbcb
 	unsigned long n;
a0bbcb
 
a0bbcb
-	if (t->count >= t->size * LH_LOAD_FACTOR) {
a0bbcb
+	if (t->count >= t->size * LH_LOAD_FACTOR)
a0bbcb
+	{
a0bbcb
 		/* Avoid signed integer overflow with large tables. */
a0bbcb
 		int new_size = (t->size > INT_MAX / 2) ? INT_MAX : (t->size * 2);
a0bbcb
 		if (t->size == INT_MAX || lh_table_resize(t, new_size) != 0)
a0bbcb
diff --git a/tests/test4.c b/tests/test4.c
a0bbcb
index fd2f3be8ec..7d3d0be168 100644
a0bbcb
--- a/tests/test4.c
a0bbcb
+++ b/tests/test4.c
a0bbcb
@@ -5,8 +5,8 @@
a0bbcb
 #include "config.h"
a0bbcb
 #include <assert.h>
a0bbcb
 #include <stdio.h>
a0bbcb
-#include <string.h>
a0bbcb
 #include <stdlib.h>
a0bbcb
+#include <string.h>
a0bbcb
 
a0bbcb
 #include "json_inttypes.h"
a0bbcb
 #include "json_object.h"
a0bbcb
@@ -49,7 +49,6 @@ static void test_lot_of_adds()
a0bbcb
 	json_object_put(jobj);
a0bbcb
 }
a0bbcb
 
a0bbcb
-
a0bbcb
 int main(void)
a0bbcb
 {
a0bbcb
 	const char *input = "\"\\ud840\\udd26,\\ud840\\udd27,\\ud800\\udd26,\\ud800\\udd27\"";
a0bbcb
a0bbcb
From f0bbaec2d4e1c64bcc2b4e9880d15ccb46233fc0 Mon Sep 17 00:00:00 2001
a0bbcb
From: Eric Haszlakiewicz <erh+git@nimenees.com>
a0bbcb
Date: Sun, 10 May 2020 03:58:51 +0000
a0bbcb
Subject: [PATCH 17/18] Issue #600: don't rename the static library on Windows,
a0bbcb
 it _needs_ to have a different name because the dll build also creates a
a0bbcb
 "json-c.lib" file.
a0bbcb
a0bbcb
---
a0bbcb
 CMakeLists.txt | 2 ++
a0bbcb
 1 file changed, 2 insertions(+)
a0bbcb
a0bbcb
diff --git a/CMakeLists.txt b/CMakeLists.txt
a0bbcb
index 67c2ae6e7c..b980a5a2f8 100644
a0bbcb
--- a/CMakeLists.txt
a0bbcb
+++ b/CMakeLists.txt
a0bbcb
@@ -402,9 +402,11 @@ if (BUILD_STATIC_LIBS AND BUILD_SHARED_LIBS)
a0bbcb
     )
a0bbcb
 
a0bbcb
     # rename the static library
a0bbcb
+    if (NOT MSVC)
a0bbcb
     set_target_properties(${STATIC_LIB} PROPERTIES
a0bbcb
         OUTPUT_NAME ${PROJECT_NAME}
a0bbcb
     )
a0bbcb
+    endif()
a0bbcb
     list(APPEND CMAKE_TARGETS ${STATIC_LIB})
a0bbcb
 endif ()
a0bbcb
 
a0bbcb
a0bbcb
From c7c7d1cbe93a978898c0f270948369bb8ec9cc05 Mon Sep 17 00:00:00 2001
a0bbcb
From: Eric Haszlakiewicz <erh+git@nimenees.com>
a0bbcb
Date: Sun, 10 May 2020 04:04:28 +0000
a0bbcb
Subject: [PATCH 18/18] Fix snprintf on windows problem for test4.
a0bbcb
a0bbcb
---
a0bbcb
 tests/test4.c | 1 +
a0bbcb
 1 file changed, 1 insertion(+)
a0bbcb
a0bbcb
diff --git a/tests/test4.c b/tests/test4.c
a0bbcb
index 7d3d0be168..288cec1792 100644
a0bbcb
--- a/tests/test4.c
a0bbcb
+++ b/tests/test4.c
a0bbcb
@@ -11,6 +11,7 @@
a0bbcb
 #include "json_inttypes.h"
a0bbcb
 #include "json_object.h"
a0bbcb
 #include "json_tokener.h"
a0bbcb
+#include "snprintf_compat.h"
a0bbcb
 
a0bbcb
 void print_hex(const char *s)
a0bbcb
 {