Skip to content

Commit

Permalink
Don't assume that "char" is signed.
Browse files Browse the repository at this point in the history
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!
  • Loading branch information
antirez committed Jul 18, 2012
1 parent a2db8e4 commit b62bdf1
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 7 deletions.
6 changes: 3 additions & 3 deletions src/bitops.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);
Expand Down
8 changes: 4 additions & 4 deletions src/ziplist.c
Original file line number Diff line number Diff line change
Expand Up @@ -317,15 +317,15 @@ 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));
memrev16ifbe(p);
} 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));
Expand All @@ -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);
Expand All @@ -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) {
Expand Down

0 comments on commit b62bdf1

Please sign in to comment.