From e10388c928a4b780f3873d3bec454f53e8ef9397 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristj=C3=A1n=20Valur=20J=C3=B3nsson?= Date: Thu, 7 Jul 2022 11:13:56 +0000 Subject: [PATCH 1/5] Bugfix: Fix incorrect negation of an unsigned value --- read.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/read.c b/read.c index 228d4d029..8cd4d3758 100644 --- a/read.c +++ b/read.c @@ -213,7 +213,7 @@ static int string2ll(const char *s, size_t slen, long long *value) { if (negative) { if (v > ((unsigned long long)(-(LLONG_MIN+1))+1)) /* Overflow. */ return REDIS_ERR; - if (value != NULL) *value = -v; + if (value != NULL) *value = -(long long)v; } else { if (v > LLONG_MAX) /* Overflow. */ return REDIS_ERR; From 429c07feb61fa3c85800256038c774c7561019cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristj=C3=A1n=20Valur=20J=C3=B3nsson?= Date: Sat, 17 Apr 2021 12:19:04 +0000 Subject: [PATCH 2/5] Fix various int/size_t discrepancies reported by microsoft C --- async.c | 2 +- dict.c | 2 +- dict.h | 2 +- hiredis.c | 14 +++++++------- net.c | 14 +++++++------- read.c | 17 +++++++++-------- sds.c | 24 ++++++++++++------------ test.c | 4 ++-- 8 files changed, 40 insertions(+), 39 deletions(-) diff --git a/async.c b/async.c index 3dad137b9..16f2c125e 100644 --- a/async.c +++ b/async.c @@ -75,7 +75,7 @@ static void *callbackValDup(void *privdata, const void *src) { } static int callbackKeyCompare(void *privdata, const void *key1, const void *key2) { - int l1, l2; + size_t l1, l2; ((void) privdata); l1 = sdslen((const sds)key1); diff --git a/dict.c b/dict.c index ad571818e..9d3d8dd3e 100644 --- a/dict.c +++ b/dict.c @@ -51,7 +51,7 @@ static int _dictInit(dict *ht, dictType *type, void *privDataPtr); /* Generic hash function (a popular one from Bernstein). * I tested a few and this was the best. */ -static unsigned int dictGenHashFunction(const unsigned char *buf, int len) { +static unsigned int dictGenHashFunction(const unsigned char *buf, size_t len) { unsigned int hash = 5381; while (len--) diff --git a/dict.h b/dict.h index 6ad0acd8d..cef43e7e9 100644 --- a/dict.h +++ b/dict.h @@ -111,7 +111,7 @@ typedef struct dictIterator { #define dictSize(ht) ((ht)->used) /* API */ -static unsigned int dictGenHashFunction(const unsigned char *buf, int len); +static unsigned int dictGenHashFunction(const unsigned char *buf, size_t len); static dict *dictCreate(dictType *type, void *privDataPtr); static int dictExpand(dict *ht, unsigned long size); static int dictAdd(dict *ht, void *key, void *val); diff --git a/hiredis.c b/hiredis.c index 91086f6f6..364ad6e32 100644 --- a/hiredis.c +++ b/hiredis.c @@ -312,12 +312,12 @@ static size_t bulklen(size_t len) { int redisvFormatCommand(char **target, const char *format, va_list ap) { const char *c = format; char *cmd = NULL; /* final command */ - int pos; /* position in final command */ + size_t pos; /* position in final command */ sds curarg, newarg; /* current argument */ int touched = 0; /* was the current argument touched? */ char **curargv = NULL, **newargv = NULL; int argc = 0; - int totlen = 0; + size_t totlen = 0; int error_type = 0; /* 0 = no error; -1 = memory error; -2 = format error */ int j; @@ -516,7 +516,7 @@ int redisvFormatCommand(char **target, const char *format, va_list ap) { hi_free(curargv); *target = cmd; - return totlen; + return (int)totlen; format_err: error_type = -2; @@ -576,7 +576,7 @@ long long redisFormatSdsCommandArgv(sds *target, int argc, const char **argv, const size_t *argvlen) { sds cmd, aux; - unsigned long long totlen, len; + size_t totlen, len; int j; /* Abort on a NULL target */ @@ -616,7 +616,7 @@ long long redisFormatSdsCommandArgv(sds *target, int argc, const char **argv, assert(sdslen(cmd)==totlen); *target = cmd; - return totlen; + return (long long) totlen; /* api doesn't use ssize_t */ } void redisFreeSdsCommand(sds cmd) { @@ -663,7 +663,7 @@ long long redisFormatCommandArgv(char **target, int argc, const char **argv, con cmd[pos] = '\0'; *target = cmd; - return totlen; + return (long long) totlen; /* api doesn't use ssize_t */ } void redisFreeCommand(char *cmd) { @@ -941,7 +941,7 @@ redisPushFn *redisSetPushCallback(redisContext *c, redisPushFn *fn) { * see if there is a reply available. */ int redisBufferRead(redisContext *c) { char buf[1024*16]; - int nread; + ssize_t nread; /* Return early when the context has seen an error. */ if (c->err) diff --git a/net.c b/net.c index 3ff89edad..f742da2bb 100644 --- a/net.c +++ b/net.c @@ -272,7 +272,7 @@ static int redisContextWaitReady(redisContext *c, long msec) { } int redisCheckConnectDone(redisContext *c, int *completed) { - int rc = connect(c->fd, (const struct sockaddr *)c->saddr, c->addrlen); + int rc = connect(c->fd, (const struct sockaddr *)c->saddr, (socklen_t)c->addrlen); if (rc == 0) { *completed = 1; return REDIS_OK; @@ -331,7 +331,7 @@ int redisCheckSocketError(redisContext *c) { int redisContextSetTimeout(redisContext *c, const struct timeval tv) { const void *to_ptr = &tv; - size_t to_sz = sizeof(tv); + socklen_t to_sz = sizeof(tv); if (setsockopt(c->fd,SOL_SOCKET,SO_RCVTIMEO,to_ptr,to_sz) == -1) { __redisSetErrorFromErrno(c,REDIS_ERR_IO,"setsockopt(SO_RCVTIMEO)"); @@ -473,7 +473,7 @@ static int _redisContextConnectTcp(redisContext *c, const char *addr, int port, } for (b = bservinfo; b != NULL; b = b->ai_next) { - if (bind(s,b->ai_addr,b->ai_addrlen) != -1) { + if (bind(s,b->ai_addr,(socklen_t)b->ai_addrlen) != -1) { bound = 1; break; } @@ -496,7 +496,7 @@ static int _redisContextConnectTcp(redisContext *c, const char *addr, int port, memcpy(c->saddr, p->ai_addr, p->ai_addrlen); c->addrlen = p->ai_addrlen; - if (connect(s,p->ai_addr,p->ai_addrlen) == -1) { + if (connect(s,p->ai_addr,(socklen_t)p->ai_addrlen) == -1) { if (errno == EHOSTUNREACH) { redisNetClose(c); continue; @@ -616,13 +616,13 @@ int redisContextConnectUnix(redisContext *c, const char *path, const struct time c->flags |= REDIS_CONNECTED; return REDIS_OK; +oom: + __redisSetError(c, REDIS_ERR_OOM, "Out of memory"); + return REDIS_ERR; #else /* We currently do not support Unix sockets for Windows. */ /* TODO(m): https://devblogs.microsoft.com/commandline/af_unix-comes-to-windows/ */ errno = EPROTONOSUPPORT; return REDIS_ERR; #endif /* _WIN32 */ -oom: - __redisSetError(c, REDIS_ERR_OOM, "Out of memory"); - return REDIS_ERR; } diff --git a/read.c b/read.c index 8cd4d3758..b90d761cf 100644 --- a/read.c +++ b/read.c @@ -222,9 +222,9 @@ static int string2ll(const char *s, size_t slen, long long *value) { return REDIS_OK; } -static char *readLine(redisReader *r, int *_len) { +static char *readLine(redisReader *r, size_t *_len) { char *p, *s; - int len; + size_t len; p = r->buf+r->pos; s = seekNewline(p,(r->len-r->pos)); @@ -269,7 +269,7 @@ static int processLineItem(redisReader *r) { redisReadTask *cur = r->task[r->ridx]; void *obj; char *p; - int len; + size_t len; if ((p = readLine(r,&len)) != NULL) { if (cur->type == REDIS_REPLY_INTEGER) { @@ -290,7 +290,7 @@ static int processLineItem(redisReader *r) { char buf[326], *eptr; double d; - if ((size_t)len >= sizeof(buf)) { + if (len >= sizeof(buf)) { __redisReaderSetError(r,REDIS_ERR_PROTOCOL, "Double value is too large"); return REDIS_ERR; @@ -349,7 +349,7 @@ static int processLineItem(redisReader *r) { } else if (cur->type == REDIS_REPLY_BIGNUM) { /* Ensure all characters are decimal digits (with possible leading * minus sign). */ - for (int i = 0; i < len; i++) { + for (size_t i = 0; i < len; i++) { /* XXX Consider: Allow leading '+'? Error on leading '0's? */ if (i == 0 && p[0] == '-') continue; if (p[i] < '0' || p[i] > '9') { @@ -364,7 +364,7 @@ static int processLineItem(redisReader *r) { obj = (void*)REDIS_REPLY_BIGNUM; } else { /* Type will be error or status. */ - for (int i = 0; i < len; i++) { + for (size_t i = 0; i < len; i++) { if (p[i] == '\r' || p[i] == '\n') { __redisReaderSetError(r,REDIS_ERR_PROTOCOL, "Bad simple string value"); @@ -396,7 +396,7 @@ static int processBulkItem(redisReader *r) { void *obj = NULL; char *p, *s; long long len; - unsigned long bytelen; + size_t bytelen; int success = 0; p = r->buf+r->pos; @@ -494,7 +494,8 @@ static int processAggregateItem(redisReader *r) { void *obj; char *p; long long elements; - int root = 0, len; + int root = 0; + size_t len; if (r->ridx == r->tasks - 1) { if (redisReaderGrow(r) == REDIS_ERR) diff --git a/sds.c b/sds.c index a20ba1912..9c296c96f 100644 --- a/sds.c +++ b/sds.c @@ -99,27 +99,27 @@ sds sdsnewlen(const void *init, size_t initlen) { fp = ((unsigned char*)s)-1; switch(type) { case SDS_TYPE_5: { - *fp = type | (initlen << SDS_TYPE_BITS); + *fp = type | ((char)initlen << SDS_TYPE_BITS); break; } case SDS_TYPE_8: { SDS_HDR_VAR(8,s); - sh->len = initlen; - sh->alloc = initlen; + sh->len = (uint8_t) initlen; + sh->alloc = (uint8_t) initlen; *fp = type; break; } case SDS_TYPE_16: { SDS_HDR_VAR(16,s); - sh->len = initlen; - sh->alloc = initlen; + sh->len = (uint16_t)initlen; + sh->alloc = (uint16_t)initlen; *fp = type; break; } case SDS_TYPE_32: { SDS_HDR_VAR(32,s); - sh->len = initlen; - sh->alloc = initlen; + sh->len = (uint32_t)initlen; + sh->alloc = (uint32_t)initlen; *fp = type; break; } @@ -431,7 +431,7 @@ sds sdscpy(sds s, const char *t) { * The function returns the length of the null-terminated string * representation stored at 's'. */ #define SDS_LLSTR_SIZE 21 -int sdsll2str(char *s, long long value) { +size_t sdsll2str(char *s, long long value) { char *p, aux; unsigned long long v; size_t l; @@ -463,7 +463,7 @@ int sdsll2str(char *s, long long value) { } /* Identical sdsll2str(), but for unsigned long long type. */ -int sdsull2str(char *s, unsigned long long v) { +size_t sdsull2str(char *s, unsigned long long v) { char *p, aux; size_t l; @@ -497,7 +497,7 @@ int sdsull2str(char *s, unsigned long long v) { */ sds sdsfromlonglong(long long value) { char buf[SDS_LLSTR_SIZE]; - int len = sdsll2str(buf,value); + size_t len = sdsll2str(buf,value); return sdsnewlen(buf,len); } @@ -583,7 +583,7 @@ sds sdscatprintf(sds s, const char *fmt, ...) { */ sds sdscatfmt(sds s, char const *fmt, ...) { const char *f = fmt; - long i; + size_t i; va_list ap; va_start(ap,fmt); @@ -789,7 +789,7 @@ int sdscmp(const sds s1, const sds s2) { l2 = sdslen(s2); minlen = (l1 < l2) ? l1 : l2; cmp = memcmp(s1,s2,minlen); - if (cmp == 0) return l1-l2; + if (cmp == 0) return l1 < l2 ? -1 : 1; return cmp; } diff --git a/test.c b/test.c index b831680fe..aeda7971c 100644 --- a/test.c +++ b/test.c @@ -251,7 +251,7 @@ static void do_reconnect(redisContext *c, struct config config) { static void test_format_commands(void) { char *cmd; - int len; + long long len; test("Format command without interpolation: "); len = redisFormatCommand(&cmd,"SET foo bar"); @@ -775,7 +775,7 @@ static void *hi_calloc_insecure(size_t nmemb, size_t size) { (void)nmemb; (void)size; insecure_calloc_calls++; - return (void*)0xdeadc0de; + return (void*)(uintptr_t)0xdeadc0de; } static void *hi_realloc_fail(void *ptr, size_t size) { From 4c8e732dc54dd91a70c8a21011666768d1d051ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristj=C3=A1n=20Valur=20J=C3=B3nsson?= Date: Thu, 8 Apr 2021 16:41:06 +0000 Subject: [PATCH 3/5] Disable windows warnings for strdup(), etc. --- alloc.c | 3 +++ async.c | 3 +++ read.c | 3 +++ test.c | 3 +++ 4 files changed, 12 insertions(+) diff --git a/alloc.c b/alloc.c index 0902286c7..734ea7117 100644 --- a/alloc.c +++ b/alloc.c @@ -27,6 +27,9 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ + +/* turn of windows warnings for _strcmp etc. */ +#define _CRT_NONSTDC_NO_DEPRECATE #include "fmacros.h" #include "alloc.h" diff --git a/async.c b/async.c index 16f2c125e..f1549a536 100644 --- a/async.c +++ b/async.c @@ -29,6 +29,9 @@ * POSSIBILITY OF SUCH DAMAGE. */ +/* turn of windows warnings for _strcmp etc. */ +#define _CRT_NONSTDC_NO_DEPRECATE + #include "fmacros.h" #include "alloc.h" #include diff --git a/read.c b/read.c index b90d761cf..b370cd5ea 100644 --- a/read.c +++ b/read.c @@ -29,6 +29,9 @@ * POSSIBILITY OF SUCH DAMAGE. */ +/* turn of windows warnings for _strcmp etc. */ +#define _CRT_NONSTDC_NO_DEPRECATE + #include "fmacros.h" #include #include diff --git a/test.c b/test.c index aeda7971c..aff06d2d0 100644 --- a/test.c +++ b/test.c @@ -1,3 +1,6 @@ +/* turn of windows warnings for _strcmp etc. */ +#define _CRT_NONSTDC_NO_DEPRECATE + #include "fmacros.h" #include "sockcompat.h" #include From 5e8900ae24a66b853c5b979777a9e9571e3e0a73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristj=C3=A1n=20Valur=20J=C3=B3nsson?= Date: Thu, 7 Jul 2022 10:39:22 +0000 Subject: [PATCH 4/5] use redisFD type --- test.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test.c b/test.c index aff06d2d0..aac7c6502 100644 --- a/test.c +++ b/test.c @@ -176,7 +176,7 @@ static void send_client_tracking(redisContext *c, const char *str) { freeReplyObject(reply); } -static int disconnect(redisContext *c, int keep_fd) { +static redisFD disconnect(redisContext *c, int keep_fd) { redisReply *reply; /* Make sure we're on DB 9. */ @@ -189,9 +189,9 @@ static int disconnect(redisContext *c, int keep_fd) { /* Free the context as well, but keep the fd if requested. */ if (keep_fd) - return redisFreeKeepFd(c); + return (int)redisFreeKeepFd(c); redisFree(c); - return -1; + return REDIS_INVALID_FD; } static void do_ssl_handshake(redisContext *c) { @@ -220,8 +220,8 @@ static redisContext *do_connect(struct config config) { /* Create a dummy connection just to get an fd to inherit */ redisContext *dummy_ctx = redisConnectUnix(config.unix_sock.path); if (dummy_ctx) { - int fd = disconnect(dummy_ctx, 1); - printf("Connecting to inherited fd %d\n", fd); + redisFD fd = disconnect(dummy_ctx, 1); + printf("Connecting to inherited fd %d\n", (int)fd); c = redisConnectFd(fd); } } else { From b4b858d67c1698155f871d381548cacd289f1d72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristj=C3=A1n=20Valur=20J=C3=B3nsson?= Date: Tue, 22 Mar 2022 17:17:22 +0000 Subject: [PATCH 5/5] fix call to sdscatfmt --- hiredis.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hiredis.c b/hiredis.c index 364ad6e32..fb4479502 100644 --- a/hiredis.c +++ b/hiredis.c @@ -608,7 +608,7 @@ long long redisFormatSdsCommandArgv(sds *target, int argc, const char **argv, cmd = sdscatfmt(cmd, "*%i\r\n", argc); for (j=0; j < argc; j++) { len = argvlen ? argvlen[j] : strlen(argv[j]); - cmd = sdscatfmt(cmd, "$%U\r\n", len); + cmd = sdscatfmt(cmd, "$%U\r\n", (unsigned long long)len); cmd = sdscatlen(cmd, argv[j], len); cmd = sdscatlen(cmd, "\r\n", sizeof("\r\n")-1); }