Blame SOURCES/redis-CVE-2021-41099.patch

3a8238
Backported for 5.0.3
3a8238
3a8238
3a8238
3a8238
From 48f04a82a0ac542341fb644a4cfbebadd5c59a33 Mon Sep 17 00:00:00 2001
3a8238
From: Yossi Gottlieb <yossigo@gmail.com>
3a8238
Date: Mon, 22 Feb 2021 15:41:32 +0200
3a8238
Subject: [PATCH] Fix integer overflow (CVE-2021-21309). (#8522)
3a8238
3a8238
On 32-bit systems, setting the proto-max-bulk-len config parameter to a high value may result with integer overflow and a subsequent heap overflow when parsing an input bulk (CVE-2021-21309).
3a8238
3a8238
This fix has two parts:
3a8238
3a8238
Set a reasonable limit to the config parameter.
3a8238
Add additional checks to prevent the problem in other potential but unknown code paths.
3a8238
3a8238
(cherry picked from commit d32f2e9999ce003bad0bd2c3bca29f64dcce4433)
3a8238
3a8238
Fix MSVR reported issue.
3a8238
---
3a8238
 src/config.c  | 16 ++++++++--------
3a8238
 src/sds.c     |  3 +++
3a8238
 src/zmalloc.c | 10 ++++++++++
3a8238
 3 files changed, 21 insertions(+), 8 deletions(-)
3a8238
3a8238
diff --git a/src/sds.c b/src/sds.c
3a8238
index cd60946bdd32..12c9da356d9b 100644
3a8238
--- a/src/sds.c
3a8238
+++ b/src/sds.c
3a8238
@@ -96,6 +96,7 @@ sds sdsnewlen(const void *init, size_t initlen) {
3a8238
     int hdrlen = sdsHdrSize(type);
3a8238
     unsigned char *fp; /* flags pointer. */
3a8238
 
3a8238
+    assert(hdrlen+initlen+1 > initlen); /* Catch size_t overflow */
3a8238
     sh = s_malloc(hdrlen+initlen+1);
3a8238
     if (init==SDS_NOINIT)
3a8238
         init = NULL;
3a8238
@@ -214,6 +215,7 @@ sds sdsMakeRoomFor(sds s, size_t addlen) {
3a8238
     len = sdslen(s);
3a8238
     sh = (char*)s-sdsHdrSize(oldtype);
3a8238
     newlen = (len+addlen);
3a8238
+    assert(newlen > len);   /* Catch size_t overflow */
3a8238
     if (newlen < SDS_MAX_PREALLOC)
3a8238
         newlen *= 2;
3a8238
     else
3a8238
@@ -227,6 +229,7 @@ sds sdsMakeRoomFor(sds s, size_t addlen) {
3a8238
     if (type == SDS_TYPE_5) type = SDS_TYPE_8;
3a8238
 
3a8238
     hdrlen = sdsHdrSize(type);
3a8238
+    assert(hdrlen+newlen+1 > len);  /* Catch size_t overflow */
3a8238
     if (oldtype==type) {
3a8238
         newsh = s_realloc(sh, hdrlen+newlen+1);
3a8238
         if (newsh == NULL) return NULL;
3a8238
3a8238
From 2b0ac7427ba5a6e1bc89380e960b138af893bbdd Mon Sep 17 00:00:00 2001
3a8238
From: YiyuanGUO <yguoaz@gmail.com>
3a8238
Date: Wed, 29 Sep 2021 10:20:35 +0300
3a8238
Subject: [PATCH] Fix integer overflow in _sdsMakeRoomFor (CVE-2021-41099)
3a8238
3a8238
---
3a8238
 src/sds.c | 6 +++---
3a8238
 1 file changed, 3 insertions(+), 3 deletions(-)
3a8238
3a8238
diff --git a/src/sds.c b/src/sds.c
3a8238
index 12c9da356d9b..73d9807ae3c0 100644
3a8238
--- a/src/sds.c
3a8238
+++ b/src/sds.c
3a8238
@@ -205,7 +205,7 @@ void sdsclear(sds s) {
3a8238
 sds sdsMakeRoomFor(sds s, size_t addlen) {
3a8238
     void *sh, *newsh;
3a8238
     size_t avail = sdsavail(s);
3a8238
-    size_t len, newlen;
3a8238
+    size_t len, newlen, reqlen;
3a8238
     char type, oldtype = s[-1] & SDS_TYPE_MASK;
3a8238
     int hdrlen;
3a8238
 
3a8238
@@ -214,7 +214,7 @@ sds sdsMakeRoomFor(sds s, size_t addlen) {
3a8238
 
3a8238
     len = sdslen(s);
3a8238
     sh = (char*)s-sdsHdrSize(oldtype);
3a8238
-    newlen = (len+addlen);
3a8238
+    reqlen = newlen = (len+addlen);
3a8238
     assert(newlen > len);   /* Catch size_t overflow */
3a8238
     if (newlen < SDS_MAX_PREALLOC)
3a8238
         newlen *= 2;
3a8238
@@ -229,7 +229,7 @@ sds sdsMakeRoomFor(sds s, size_t addlen) {
3a8238
     if (type == SDS_TYPE_5) type = SDS_TYPE_8;
3a8238
 
3a8238
     hdrlen = sdsHdrSize(type);
3a8238
-    assert(hdrlen+newlen+1 > len);  /* Catch size_t overflow */
3a8238
+    assert(hdrlen + newlen + 1 > reqlen);  /* Catch size_t overflow */
3a8238
     if (oldtype==type) {
3a8238
         newsh = s_realloc(sh, hdrlen+newlen+1);
3a8238
         if (newsh == NULL) return NULL;