Skip to content

Commit ec8633b

Browse files
enjoy-binbinmadolson
authored andcommitted
sanitize dump payload: fix crash with empty set with listpack encoding (redis#11519)
The following example will create an empty set (listpack encoding): ``` > RESTORE key 0 "\x14\x25\x25\x00\x00\x00\x00\x00\x02\x01\x82\x5F\x37\x03\x06\x01\x82\x5F\x35\x03\x82\x5F\x33\x03\x00\x01\x82\x5F\x31\x03\x82\x5F\x39\x03\x04\xA9\x08\x01\xFF\x0B\x00\xA3\x26\x49\xB4\x86\xB0\x0F\x41" OK > SCARD key (integer) 0 > SRANDMEMBER key Error: Server closed the connection ``` In the spirit of redis#9297, skip empty set when loading RDB_TYPE_SET_LISTPACK. Introduced in redis#11290
1 parent 71bc93c commit ec8633b

File tree

4 files changed

+19
-2
lines changed

4 files changed

+19
-2
lines changed

src/rdb.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2319,6 +2319,13 @@ robj *rdbLoadObject(int rdbtype, rio *rdb, sds key, int dbid, int *error) {
23192319
}
23202320
o->type = OBJ_SET;
23212321
o->encoding = OBJ_ENCODING_LISTPACK;
2322+
2323+
if (setTypeSize(o) == 0) {
2324+
zfree(encoded);
2325+
o->ptr = NULL;
2326+
decrRefCount(o);
2327+
goto emptykey;
2328+
}
23222329
if (setTypeSize(o) > server.set_max_listpack_entries)
23232330
setTypeConvert(o, OBJ_ENCODING_HT);
23242331
break;

src/rdb.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ void rdbRemoveTempFile(pid_t childpid, int from_signal);
158158
int rdbSave(int req, char *filename, rdbSaveInfo *rsi);
159159
ssize_t rdbSaveObject(rio *rdb, robj *o, robj *key, int dbid);
160160
size_t rdbSavedObjectLen(robj *o, robj *key, int dbid);
161-
robj *rdbLoadObject(int type, rio *rdb, sds key, int dbid, int *error);
161+
robj *rdbLoadObject(int rdbtype, rio *rdb, sds key, int dbid, int *error);
162162
void backgroundSaveDoneHandler(int exitcode, int bysignal);
163163
int rdbSaveKeyValuePair(rio *rdb, robj *key, robj *val, long long expiretime,int dbid);
164164
ssize_t rdbSaveSingleModuleAux(rio *rdb, int when, moduleType *mt);

tests/integration/corrupt-dump-fuzzer.tcl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# tests of corrupt ziplist payload with valid CRC
1+
# tests of corrupt listpack payload with valid CRC
22

33
tags {"dump" "corruption" "external:skip"} {
44

@@ -32,6 +32,7 @@ proc generate_collections {suffix elements} {
3232
proc generate_types {} {
3333
r config set list-max-ziplist-size 5
3434
r config set hash-max-ziplist-entries 5
35+
r config set set-max-listpack-entries 5
3536
r config set zset-max-ziplist-entries 5
3637
r config set stream-node-max-entries 5
3738

tests/integration/corrupt-dump.tcl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -800,6 +800,15 @@ test {corrupt payload: fuzzer findings - valgrind fishy value warning} {
800800
}
801801
}
802802

803+
test {corrupt payload: fuzzer findings - empty set listpack} {
804+
start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] {
805+
r config set sanitize-dump-payload no
806+
r debug set-skip-checksum-validation 1
807+
catch {r restore _key 0 "\x14\x25\x25\x00\x00\x00\x00\x00\x02\x01\x82\x5F\x37\x03\x06\x01\x82\x5F\x35\x03\x82\x5F\x33\x03\x00\x01\x82\x5F\x31\x03\x82\x5F\x39\x03\x04\xA9\x08\x01\xFF\x0B\x00\xA3\x26\x49\xB4\x86\xB0\x0F\x41"} err
808+
assert_match "*Bad data format*" $err
809+
r ping
810+
}
811+
}
803812

804813
} ;# tags
805814

0 commit comments

Comments
 (0)