diff options
author | antirez <antirez@gmail.com> | 2017-11-06 12:33:42 +0100 |
---|---|---|
committer | antirez <antirez@gmail.com> | 2017-11-06 12:37:30 +0100 |
commit | 0aa0cdf7ccdb0456172cb453af50fb38312a0867 (patch) | |
tree | 562a09efb3d9226200ab3a181c5cfdc3365f8813 | |
parent | 5727d7ec2ff260b03c5aaadb2b7fb45cb6e7ef05 (diff) | |
download | redis-0aa0cdf7ccdb0456172cb453af50fb38312a0867.tar.gz |
Fix saving of zero-length lists.
Normally in modern Redis you can't create zero-len lists, however it's
possible to load them from old RDB files generated, for instance, using
Redis 2.8 (see issue #4409). The "Right Thing" would be not loading such
lists at all, but this requires to hook in rdb.c random places in a not
great way, for a problem that is at this point, at best, minor.
Here in this commit instead I just fix the fact that zero length lists,
materialized as quicklists with the first node set to NULL, were
iterated in the wrong way while they are saved, leading to a crash.
The other parts of the list implementation are apparently able to deal
with empty lists correctly, even if they are no longer a thing.
-rw-r--r-- | src/rdb.c | 5 |
1 files changed, 3 insertions, 2 deletions
@@ -584,7 +584,7 @@ ssize_t rdbSaveObject(rio *rdb, robj *o) { if ((n = rdbSaveLen(rdb,ql->len)) == -1) return -1; nwritten += n; - do { + while(node) { if (quicklistNodeIsCompressed(node)) { void *data; size_t compress_len = quicklistGetLzf(node, &data); @@ -594,7 +594,8 @@ ssize_t rdbSaveObject(rio *rdb, robj *o) { if ((n = rdbSaveRawString(rdb,node->zl,node->sz)) == -1) return -1; nwritten += n; } - } while ((node = node->next)); + node = node->next; + } } else { serverPanic("Unknown list encoding"); } |