summaryrefslogtreecommitdiff
path: root/recipes-extended/rsyslog/libfastjson/CVE-2020-12762.patch
blob: 84e8206901eccee27dd1fa8af17572260e5bd7e1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
From 73d5726b116e89d1e756419ceea5ed071d211642 Mon Sep 17 00:00:00 2001
From: "mykola.salomatin" <mykola.salomatin@globallogic.com>
Date: Tue, 2 Mar 2021 13:22:21 +0200
Subject: [PATCH] Fix integer overflows

This commit is a backport of the following commit in json-c:
  * d07b91014986900a3a75f306d302e13e005e9d67

In component json-c, several files were affected:
  * linkhash.c
  * arraylist.c
  * printbuf.c

In the current version of the libfastjson (0.99.8):
  * linkhash.c was removed,
  * arraylist.c doesn't have a necessary function for patching,
  * printbuf.c is patched manually in current patch.

---
CVE: CVE-2020-12762
Signed-off-by: Mykola Salomatin

 printbuf.c | 20 +++++++++++++++++---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/printbuf.c b/printbuf.c
index cc0f0d2..97e3ddd 100644
--- a/printbuf.c
+++ b/printbuf.c
@@ -13,6 +13,7 @@
 
 #include "config.h"
 
+#include <limits.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -68,9 +69,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)
-		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",
@@ -85,6 +93,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)
 			return -1;
@@ -136,6 +147,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)
 	{
-- 
2.7.4