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.
This commit is contained in:
antirez 2017-11-06 12:33:42 +01:00
parent 34d5804d4c
commit a1944c3e4d

View File

@ -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");
} }