This commit is contained in:
Kristján Valur Jónsson 2025-02-11 08:50:09 +00:00 committed by GitHub
commit 0057fb53de
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 59 additions and 46 deletions

View File

@ -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"

View File

@ -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 <stdlib.h>
@ -75,7 +78,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);

2
dict.c
View File

@ -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--)

2
dict.h
View File

@ -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);

View File

@ -323,12 +323,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;
@ -534,7 +534,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;
@ -594,7 +594,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 */
@ -626,7 +626,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);
}
@ -634,7 +634,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) {
@ -681,7 +681,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) {
@ -979,7 +979,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)

14
net.c
View File

@ -327,7 +327,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;
@ -386,7 +386,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 (redisContextUpdateCommandTimeout(c, &tv) != REDIS_OK) {
__redisSetError(c, REDIS_ERR_OOM, "Out of memory");
@ -539,7 +539,7 @@ addrretry:
}
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;
}
@ -562,7 +562,7 @@ addrretry:
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;
@ -682,13 +682,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;
}

22
read.c
View File

@ -29,6 +29,9 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
/* turn of windows warnings for _strcmp etc. */
#define _CRT_NONSTDC_NO_DEPRECATE
#include "fmacros.h"
#include <string.h>
#include <stdlib.h>
@ -213,7 +216,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;
@ -222,9 +225,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));
@ -270,7 +273,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) {
@ -291,7 +294,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;
@ -353,7 +356,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') {
@ -368,7 +371,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");
@ -400,7 +403,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;
@ -498,7 +501,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)

24
sds.c
View File

@ -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;
}

17
test.c
View File

@ -1,3 +1,6 @@
/* turn of windows warnings for _strcmp etc. */
#define _CRT_NONSTDC_NO_DEPRECATE
#include "fmacros.h"
#include "sockcompat.h"
#include <stdio.h>
@ -190,7 +193,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. */
@ -203,9 +206,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) {
@ -234,8 +237,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 {
@ -268,7 +271,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");
@ -891,7 +894,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) {