From 17be1a4a173461772230716ad99d373a512e8f9e Mon Sep 17 00:00:00 2001 From: antirez Date: Fri, 27 Mar 2009 21:27:42 +0100 Subject: [PATCH] IMPORTANT FIX: new dump format implementation was broken. Now it's ok but tests for the 32-bit case values are needed --- redis.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/redis.c b/redis.c index cf3d6675..87521e16 100644 --- a/redis.c +++ b/redis.c @@ -104,7 +104,7 @@ #define REDIS_RDB_6BITLEN 0 #define REDIS_RDB_14BITLEN 1 #define REDIS_RDB_32BITLEN 2 -#define REDIS_RDB_64BITLEN 3 +#define REDIS_RDB_ENCVAL 3 #define REDIS_RDB_LENERR UINT_MAX /* When a length of a string object stored on disk has the first two bits @@ -1518,7 +1518,7 @@ static int rdbSaveLen(FILE *fp, uint32_t len) { /* Save a 14 bit len */ buf[0] = ((len>>8)&0xFF)|(REDIS_RDB_14BITLEN<<6); buf[1] = len&0xFF; - if (fwrite(buf,4,1,fp) == 0) return -1; + if (fwrite(buf,2,1,fp) == 0) return -1; } else { /* Save a 32 bit len */ buf[0] = (REDIS_RDB_32BITLEN<<6); @@ -1670,11 +1670,14 @@ static uint32_t rdbLoadLen(FILE *fp, int rdbver) { if (fread(&len,4,1,fp) == 0) return REDIS_RDB_LENERR; return ntohl(len); } else { + int type; + if (fread(buf,1,1,fp) == 0) return REDIS_RDB_LENERR; - if ((buf[0]&0xC0) == REDIS_RDB_6BITLEN) { + type = (buf[0]&0xC0)>>6; + if (type == REDIS_RDB_6BITLEN) { /* Read a 6 bit len */ return buf[0]; - } else if ((buf[0]&0xC0) == REDIS_RDB_14BITLEN) { + } else if (type == REDIS_RDB_14BITLEN) { /* Read a 14 bit len */ if (fread(buf+1,1,1,fp) == 0) return REDIS_RDB_LENERR; return ((buf[0]&0x3F)<<8)|buf[1]; -- 2.45.2