Skip to content

Commit 76a7b10

Browse files
yossigomichael-grunder
authored andcommitted
Fix for integer/buffer overflow CVE-2021-32765
This fix prevents hiredis from trying to allocate more than `SIZE_MAX` bytes, which would result in a buffer overrun. [Full Details](GHSA-hfm9-39pp-55p2)
1 parent d5b4c69 commit 76a7b10

File tree

2 files changed

+15
-0
lines changed

2 files changed

+15
-0
lines changed

hiredis.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ static void *createArrayObject(const redisReadTask *task, size_t elements) {
174174
return NULL;
175175

176176
if (elements > 0) {
177+
if (SIZE_MAX / sizeof(redisReply*) < elements) return NULL; /* Don't overflow */
177178
r->element = hi_calloc(elements,sizeof(redisReply*));
178179
if (r->element == NULL) {
179180
freeReplyObject(r);

test.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -493,6 +493,20 @@ static void test_reply_reader(void) {
493493
freeReplyObject(reply);
494494
redisReaderFree(reader);
495495

496+
test("Multi-bulk never overflows regardless of maxelements: ");
497+
size_t bad_mbulk_len = (SIZE_MAX / sizeof(void *)) + 3;
498+
char bad_mbulk_reply[100];
499+
snprintf(bad_mbulk_reply, sizeof(bad_mbulk_reply), "*%llu\r\n+asdf\r\n",
500+
(unsigned long long) bad_mbulk_len);
501+
502+
reader = redisReaderCreate();
503+
reader->maxelements = 0; /* Don't rely on default limit */
504+
redisReaderFeed(reader, bad_mbulk_reply, strlen(bad_mbulk_reply));
505+
ret = redisReaderGetReply(reader,&reply);
506+
test_cond(ret == REDIS_ERR && strcasecmp(reader->errstr, "Out of memory") == 0);
507+
freeReplyObject(reply);
508+
redisReaderFree(reader);
509+
496510
#if LLONG_MAX > SIZE_MAX
497511
test("Set error when array > SIZE_MAX: ");
498512
reader = redisReaderCreate();

0 commit comments

Comments
 (0)