summaryrefslogtreecommitdiff
path: root/src/rdb.c
diff options
context:
space:
mode:
authorMatt Stancliff <matt@genges.com>2015-01-18 15:54:30 -0500
committerMatt Stancliff <matt@genges.com>2015-01-19 14:10:12 -0500
commitf704360462640a88975eeb68fd80617921d7c97d (patch)
tree92b049233346966325d420b515e70b65e4dc02f6 /src/rdb.c
parentcf76af6b9fb7f808ac6f0ab79393d390a14f9cd9 (diff)
downloadredis-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.c26
1 files changed, 13 insertions, 13 deletions
diff --git a/src/rdb.c b/src/rdb.c
index 36ba151c7..8165ef265 100644
--- a/src/rdb.c
+++ b/src/rdb.c
@@ -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;
}