From 24cc0b984d4ed5045c6ff125b0e619b6ce5ea9c6 Mon Sep 17 00:00:00 2001 From: yiyuaner Date: Mon, 4 Oct 2021 16:11:09 +0800 Subject: [PATCH] Fix integer overflow in _sdsMakeRoomFor (CVE-2021-41099) (#9558) The existing overflow checks handled the greedy growing, but didn't handle a case where the addition of the header size is what causes the overflow. --- src/sds.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sds.c b/src/sds.c index 3e2e7db3d7ba..4279e92a5dc0 100644 --- a/src/sds.c +++ b/src/sds.c @@ -239,7 +239,7 @@ void sdsclear(sds s) { sds _sdsMakeRoomFor(sds s, size_t addlen, int greedy) { void *sh, *newsh; size_t avail = sdsavail(s); - size_t len, newlen; + size_t len, newlen, reqlen; char type, oldtype = s[-1] & SDS_TYPE_MASK; int hdrlen; size_t usable; @@ -249,7 +249,7 @@ sds _sdsMakeRoomFor(sds s, size_t addlen, int greedy) { len = sdslen(s); sh = (char*)s-sdsHdrSize(oldtype); - newlen = (len+addlen); + reqlen = newlen = (len+addlen); assert(newlen > len); /* Catch size_t overflow */ if (greedy == 1) { if (newlen < SDS_MAX_PREALLOC) @@ -266,7 +266,7 @@ sds _sdsMakeRoomFor(sds s, size_t addlen, int greedy) { if (type == SDS_TYPE_5) type = SDS_TYPE_8; hdrlen = sdsHdrSize(type); - assert(hdrlen + newlen + 1 > len); /* Catch size_t overflow */ + assert(hdrlen + newlen + 1 > reqlen); /* Catch size_t overflow */ if (oldtype==type) { newsh = s_realloc_usable(sh, hdrlen+newlen+1, &usable); if (newsh == NULL) return NULL;