summaryrefslogtreecommitdiff
path: root/deps
diff options
context:
space:
mode:
authorYossi Gottlieb <yossigo@gmail.com>2021-10-12 20:16:29 +0300
committerGitHub <noreply@github.com>2021-10-12 20:16:29 +0300
commit922ef86a3b1c15292e1f35338a0ac137a08a11b4 (patch)
tree1d5801138ca3ebecebc68be5ca4235bb5f7b4b4a /deps
parent252981914f8f3e5b6891ee14fcc3ac20f59ac262 (diff)
downloadredis-922ef86a3b1c15292e1f35338a0ac137a08a11b4.tar.gz
hiredis: improve calloc() overflow fix. (#9630)
Cherry pick a more complete fix to 0215324a6 that also doesn't leak memory from latest hiredis.
Diffstat (limited to 'deps')
-rw-r--r--deps/hiredis/alloc.c4
-rw-r--r--deps/hiredis/alloc.h5
-rw-r--r--deps/hiredis/hiredis.c1
3 files changed, 9 insertions, 1 deletions
diff --git a/deps/hiredis/alloc.c b/deps/hiredis/alloc.c
index 7fb6b35e7..0902286c7 100644
--- a/deps/hiredis/alloc.c
+++ b/deps/hiredis/alloc.c
@@ -68,6 +68,10 @@ void *hi_malloc(size_t size) {
}
void *hi_calloc(size_t nmemb, size_t size) {
+ /* Overflow check as the user can specify any arbitrary allocator */
+ if (SIZE_MAX / size < nmemb)
+ return NULL;
+
return hiredisAllocFns.callocFn(nmemb, size);
}
diff --git a/deps/hiredis/alloc.h b/deps/hiredis/alloc.h
index 34a05f49f..771f9fee5 100644
--- a/deps/hiredis/alloc.h
+++ b/deps/hiredis/alloc.h
@@ -32,6 +32,7 @@
#define HIREDIS_ALLOC_H
#include <stddef.h> /* for size_t */
+#include <stdint.h>
#ifdef __cplusplus
extern "C" {
@@ -59,6 +60,10 @@ static inline void *hi_malloc(size_t size) {
}
static inline void *hi_calloc(size_t nmemb, size_t size) {
+ /* Overflow check as the user can specify any arbitrary allocator */
+ if (SIZE_MAX / size < nmemb)
+ return NULL;
+
return hiredisAllocFns.callocFn(nmemb, size);
}
diff --git a/deps/hiredis/hiredis.c b/deps/hiredis/hiredis.c
index 990f61960..51f22a665 100644
--- a/deps/hiredis/hiredis.c
+++ b/deps/hiredis/hiredis.c
@@ -174,7 +174,6 @@ static void *createArrayObject(const redisReadTask *task, size_t elements) {
return NULL;
if (elements > 0) {
- if (SIZE_MAX / sizeof(redisReply*) < elements) return NULL; /* Don't overflow */
r->element = hi_calloc(elements,sizeof(redisReply*));
if (r->element == NULL) {
freeReplyObject(r);