diff options
author | Matt Stancliff <matt@genges.com> | 2015-01-18 15:54:30 -0500 |
---|---|---|
committer | Matt Stancliff <matt@genges.com> | 2015-01-19 14:10:12 -0500 |
commit | f704360462640a88975eeb68fd80617921d7c97d (patch) | |
tree | 92b049233346966325d420b515e70b65e4dc02f6 /src/rdb.c | |
parent | cf76af6b9fb7f808ac6f0ab79393d390a14f9cd9 (diff) | |
download | redis-f704360462640a88975eeb68fd80617921d7c97d.tar.gz |
Improve RDB type correctness
It's possible large objects could be larger than 'int', so let's
upgrade all size counters to ssize_t.
This also fixes rdbSaveObject serialized bytes calculation.
Since entire serializations of data structures can be large,
so we don't want to limit their calculated size to a 32 bit signed max.
This commit increases object size calculation and
cascades the change back up to serializedlength printing.
Before:
127.0.0.1:6379> debug object hihihi
... encoding:quicklist serializedlength:-2147483559 ...
After:
127.0.0.1:6379> debug object hihihi
... encoding:quicklist serializedlength:2147483737 ...
Diffstat (limited to 'src/rdb.c')
-rw-r--r-- | src/rdb.c | 26 |
1 files changed, 13 insertions, 13 deletions
@@ -222,10 +222,10 @@ int rdbTryIntegerEncoding(char *s, size_t len, unsigned char *enc) { return rdbEncodeInteger(value,enc); } -int rdbSaveLzfBlob(rio *rdb, void *data, size_t compress_len, - size_t original_len) { +ssize_t rdbSaveLzfBlob(rio *rdb, void *data, size_t compress_len, + size_t original_len) { unsigned char byte; - int n, nwritten = 0; + ssize_t n, nwritten = 0; /* Data compressed! Let's save it on disk */ byte = (REDIS_RDB_ENCVAL<<6)|REDIS_RDB_ENC_LZF; @@ -247,7 +247,7 @@ writeerr: return -1; } -int rdbSaveLzfStringObject(rio *rdb, unsigned char *s, size_t len) { +ssize_t rdbSaveLzfStringObject(rio *rdb, unsigned char *s, size_t len) { size_t comprlen, outlen; void *out; @@ -260,7 +260,7 @@ int rdbSaveLzfStringObject(rio *rdb, unsigned char *s, size_t len) { zfree(out); return 0; } - size_t nwritten = rdbSaveLzfBlob(rdb, out, comprlen, len); + ssize_t nwritten = rdbSaveLzfBlob(rdb, out, comprlen, len); zfree(out); return nwritten; } @@ -305,9 +305,9 @@ err: /* Save a string object as [len][data] on disk. If the object is a string * representation of an integer value we try to save it in a special form */ -int rdbSaveRawString(rio *rdb, unsigned char *s, size_t len) { +ssize_t rdbSaveRawString(rio *rdb, unsigned char *s, size_t len) { int enclen; - int n, nwritten = 0; + ssize_t n, nwritten = 0; /* Try integer encoding */ if (len <= 11) { @@ -338,9 +338,9 @@ int rdbSaveRawString(rio *rdb, unsigned char *s, size_t len) { } /* Save a long long value as either an encoded string or a string. */ -int rdbSaveLongLongAsStringObject(rio *rdb, long long value) { +ssize_t rdbSaveLongLongAsStringObject(rio *rdb, long long value) { unsigned char buf[32]; - int n, nwritten = 0; + ssize_t n, nwritten = 0; int enclen = rdbEncodeInteger(value,buf); if (enclen > 0) { return rdbWriteRaw(rdb,buf,enclen); @@ -532,8 +532,8 @@ int rdbLoadObjectType(rio *rdb) { } /* Save a Redis object. Returns -1 on error, number of bytes written on success. */ -int rdbSaveObject(rio *rdb, robj *o) { - int n = 0, nwritten = 0; +ssize_t rdbSaveObject(rio *rdb, robj *o) { + ssize_t n = 0, nwritten = 0; if (o->type == REDIS_STRING) { /* Save a string value */ @@ -654,8 +654,8 @@ int rdbSaveObject(rio *rdb, robj *o) { * the rdbSaveObject() function. Currently we use a trick to get * this length with very little changes to the code. In the future * we could switch to a faster solution. */ -off_t rdbSavedObjectLen(robj *o) { - int len = rdbSaveObject(NULL,o); +size_t rdbSavedObjectLen(robj *o) { + ssize_t len = rdbSaveObject(NULL,o); redisAssertWithInfo(NULL,o,len != -1); return len; } |