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

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