summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2012-07-18 12:01:43 +0200
committerantirez <antirez@gmail.com>2012-07-18 12:01:43 +0200
commit82675c86a622b7955e3faec0096c844caf2e88af (patch)
treebb9c9b76097bf9807002b1c3dd217f90aaf2ff7a
parent8a8e01f4a7d8658d992be1ad45511d4c4f70a1c2 (diff)
downloadredis-82675c86a622b7955e3faec0096c844caf2e88af.tar.gz
Don't assume that "char" is signed.
For the C standard char can be either signed or unsigned, it's up to the compiler, but Redis assumed that it was signed in a few places. The practical effect of this patch is that now Redis 2.6 will run correctly in every system where char is unsigned, notably the RaspBerry PI and other ARM systems with GCC. Thanks to Georgi Marinov (@eesn on twitter) that reported the problem and allowed me to use his RaspBerry via SSH to trace and fix the issue!
-rw-r--r--src/bitops.c6
-rw-r--r--src/ziplist.c8
2 files changed, 7 insertions, 7 deletions
diff --git a/src/bitops.c b/src/bitops.c
index 00192b92b..deec0971d 100644
--- a/src/bitops.c
+++ b/src/bitops.c
@@ -114,14 +114,14 @@ void setbitCommand(redisClient *c) {
o->ptr = sdsgrowzero(o->ptr,byte+1);
/* Get current values */
- byteval = ((char*)o->ptr)[byte];
+ byteval = ((uint8_t*)o->ptr)[byte];
bit = 7 - (bitoffset & 0x7);
bitval = byteval & (1 << bit);
/* Update byte with new bit value and return original value */
byteval &= ~(1 << bit);
byteval |= ((on & 0x1) << bit);
- ((char*)o->ptr)[byte] = byteval;
+ ((uint8_t*)o->ptr)[byte] = byteval;
signalModifiedKey(c->db,c->argv[1]);
server.dirty++;
addReply(c, bitval ? shared.cone : shared.czero);
@@ -148,7 +148,7 @@ void getbitCommand(redisClient *c) {
bitval = llbuf[byte] & (1 << bit);
} else {
if (byte < sdslen(o->ptr))
- bitval = ((char*)o->ptr)[byte] & (1 << bit);
+ bitval = ((uint8_t*)o->ptr)[byte] & (1 << bit);
}
addReply(c, bitval ? shared.cone : shared.czero);
diff --git a/src/ziplist.c b/src/ziplist.c
index 50167651b..76a2cdde0 100644
--- a/src/ziplist.c
+++ b/src/ziplist.c
@@ -317,7 +317,7 @@ static void zipSaveInteger(unsigned char *p, int64_t value, unsigned char encodi
int32_t i32;
int64_t i64;
if (encoding == ZIP_INT_8B) {
- ((char*)p)[0] = (char)value;
+ ((int8_t*)p)[0] = (int8_t)value;
} else if (encoding == ZIP_INT_16B) {
i16 = value;
memcpy(p,&i16,sizeof(i16));
@@ -325,7 +325,7 @@ static void zipSaveInteger(unsigned char *p, int64_t value, unsigned char encodi
} else if (encoding == ZIP_INT_24B) {
i32 = value<<8;
memrev32ifbe(&i32);
- memcpy(p,((unsigned char*)&i32)+1,sizeof(i32)-sizeof(int8_t));
+ memcpy(p,((uint8_t*)&i32)+1,sizeof(i32)-sizeof(uint8_t));
} else if (encoding == ZIP_INT_32B) {
i32 = value;
memcpy(p,&i32,sizeof(i32));
@@ -347,7 +347,7 @@ static int64_t zipLoadInteger(unsigned char *p, unsigned char encoding) {
int32_t i32;
int64_t i64, ret = 0;
if (encoding == ZIP_INT_8B) {
- ret = ((char*)p)[0];
+ ret = ((int8_t*)p)[0];
} else if (encoding == ZIP_INT_16B) {
memcpy(&i16,p,sizeof(i16));
memrev16ifbe(&i16);
@@ -358,7 +358,7 @@ static int64_t zipLoadInteger(unsigned char *p, unsigned char encoding) {
ret = i32;
} else if (encoding == ZIP_INT_24B) {
i32 = 0;
- memcpy(((unsigned char*)&i32)+1,p,sizeof(i32)-sizeof(int8_t));
+ memcpy(((uint8_t*)&i32)+1,p,sizeof(i32)-sizeof(uint8_t));
memrev32ifbe(&i32);
ret = i32>>8;
} else if (encoding == ZIP_INT_64B) {