1
0
mirror of https://github.com/fluencelabs/redis synced 2025-06-20 20:46:31 +00:00

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 ). 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.
This commit is contained in:
antirez
2017-11-06 12:33:42 +01:00
parent 1740300f35
commit 1ee6af4d87

@ -656,7 +656,7 @@ ssize_t rdbSaveObject(rio *rdb, robj *o) {
if ((n = rdbSaveLen(rdb,ql->len)) == -1) return -1; if ((n = rdbSaveLen(rdb,ql->len)) == -1) return -1;
nwritten += n; nwritten += n;
do { while(node) {
if (quicklistNodeIsCompressed(node)) { if (quicklistNodeIsCompressed(node)) {
void *data; void *data;
size_t compress_len = quicklistGetLzf(node, &data); size_t compress_len = quicklistGetLzf(node, &data);
@ -666,7 +666,8 @@ ssize_t rdbSaveObject(rio *rdb, robj *o) {
if ((n = rdbSaveRawString(rdb,node->zl,node->sz)) == -1) return -1; if ((n = rdbSaveRawString(rdb,node->zl,node->sz)) == -1) return -1;
nwritten += n; nwritten += n;
} }
} while ((node = node->next)); node = node->next;
}
} else { } else {
serverPanic("Unknown list encoding"); serverPanic("Unknown list encoding");
} }