diff options
Diffstat (limited to 'examples/redis-unstable/tests/integration/corrupt-dump.tcl')
| -rw-r--r-- | examples/redis-unstable/tests/integration/corrupt-dump.tcl | 970 |
1 files changed, 970 insertions, 0 deletions
diff --git a/examples/redis-unstable/tests/integration/corrupt-dump.tcl b/examples/redis-unstable/tests/integration/corrupt-dump.tcl new file mode 100644 index 0000000..654b887 --- /dev/null +++ b/examples/redis-unstable/tests/integration/corrupt-dump.tcl | |||
| @@ -0,0 +1,970 @@ | |||
| 1 | # tests of corrupt ziplist payload with valid CRC | ||
| 2 | # * setting crash-memcheck-enabled to no to avoid issues with valgrind | ||
| 3 | # * setting use-exit-on-panic to yes so that valgrind can search for leaks | ||
| 4 | # * setting debug set-skip-checksum-validation to 1 on some tests for which we | ||
| 5 | # didn't bother to fake a valid checksum | ||
| 6 | # * some tests set sanitize-dump-payload to no and some to yet, depending on | ||
| 7 | # what we want to test | ||
| 8 | |||
| 9 | tags {"dump" "corruption" "external:skip"} { | ||
| 10 | |||
| 11 | # We only run OOM related tests on x86_64 and aarch64, as jemalloc on other | ||
| 12 | # platforms (notably s390x) may actually succeed very large allocations. As | ||
| 13 | # a result the test may hang for a very long time at the cleanup phase, | ||
| 14 | # iterating as many as 2^61 hash table slots. | ||
| 15 | |||
| 16 | set arch_name [exec uname -m] | ||
| 17 | set run_oom_tests [expr {($arch_name == "x86_64" || $arch_name == "aarch64") && !$::tsan}] | ||
| 18 | |||
| 19 | set corrupt_payload_7445 "\x0E\x01\x1D\x1D\x00\x00\x00\x16\x00\x00\x00\x03\x00\x00\x04\x43\x43\x43\x43\x06\x04\x42\x42\x42\x42\x06\x3F\x41\x41\x41\x41\xFF\x09\x00\x88\xA5\xCA\xA8\xC5\x41\xF4\x35" | ||
| 20 | |||
| 21 | test {corrupt payload: #7445 - with sanitize} { | ||
| 22 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 23 | r config set sanitize-dump-payload yes | ||
| 24 | catch { | ||
| 25 | r restore key 0 $corrupt_payload_7445 | ||
| 26 | } err | ||
| 27 | assert_match "*Bad data format*" $err | ||
| 28 | verify_log_message 0 "*integrity check failed*" 0 | ||
| 29 | } | ||
| 30 | } | ||
| 31 | |||
| 32 | test {corrupt payload: hash with valid zip list header, invalid entry len} { | ||
| 33 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 34 | catch { | ||
| 35 | r restore key 0 "\x0D\x1B\x1B\x00\x00\x00\x16\x00\x00\x00\x04\x00\x00\x02\x61\x00\x04\x02\x62\x00\x04\x14\x63\x00\x04\x02\x64\x00\xFF\x09\x00\xD9\x10\x54\x92\x15\xF5\x5F\x52" | ||
| 36 | } err | ||
| 37 | assert_match "*Bad data format*" $err | ||
| 38 | verify_log_message 0 "*integrity check failed*" 0 | ||
| 39 | } | ||
| 40 | } | ||
| 41 | |||
| 42 | test {corrupt payload: invalid zlbytes header} { | ||
| 43 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 44 | catch { | ||
| 45 | r restore key 0 "\x0D\x1B\x25\x00\x00\x00\x16\x00\x00\x00\x04\x00\x00\x02\x61\x00\x04\x02\x62\x00\x04\x02\x63\x00\x04\x02\x64\x00\xFF\x09\x00\xB7\xF7\x6E\x9F\x43\x43\x14\xC6" | ||
| 46 | } err | ||
| 47 | assert_match "*Bad data format*" $err | ||
| 48 | verify_log_message 0 "*integrity check failed*" 0 | ||
| 49 | } | ||
| 50 | } | ||
| 51 | |||
| 52 | test {corrupt payload: valid zipped hash header, dup records} { | ||
| 53 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 54 | catch { | ||
| 55 | r restore key 0 "\x0D\x1B\x1B\x00\x00\x00\x16\x00\x00\x00\x04\x00\x00\x02\x61\x00\x04\x02\x62\x00\x04\x02\x61\x00\x04\x02\x64\x00\xFF\x09\x00\xA1\x98\x36\x78\xCC\x8E\x93\x2E" | ||
| 56 | } err | ||
| 57 | assert_match "*Bad data format*" $err | ||
| 58 | verify_log_message 0 "*integrity check failed*" 0 | ||
| 59 | } | ||
| 60 | } | ||
| 61 | |||
| 62 | test {corrupt payload: hash listpackex with invalid string TTL} { | ||
| 63 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 64 | r config set sanitize-dump-payload yes | ||
| 65 | catch { | ||
| 66 | r restore key 0 "\x17\x2d\x2d\x00\x00\x00\x09\x00\x81\x61\x02\x01\x01\xf4\xa6\x96\x18\xb8\x8f\x01\x00\x00\x09\x82\x66\x31\x03\x82\x76\x31\x03\x83\x66\x6f\x6f\x04\x82\x66\x32\x03\x82\x76\x32\x03\x00\x01\xff\x0c\x00\xde\x40\xe5\x37\x51\x1c\x12\x56" replace | ||
| 67 | } err | ||
| 68 | assert_match "*Bad data format*" $err | ||
| 69 | r ping | ||
| 70 | } | ||
| 71 | } | ||
| 72 | |||
| 73 | test {corrupt payload: hash listpackex with TTL large than EB_EXPIRE_TIME_MAX} { | ||
| 74 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 75 | r config set sanitize-dump-payload yes | ||
| 76 | catch { | ||
| 77 | r restore key 0 "\x17\x33\x33\x00\x00\x00\x09\x00\x00\x01\x00\x01\xf4\x01\xc5\x89\x95\x8f\x01\x00\x00\x09\x01\x01\x82\x5f\x31\x03\xf4\x29\x94\x97\x95\x8f\x01\x00\x00\x09\x02\x01\x02\x01\xf4\x01\x5e\xaf\x95\x8f\x01\x33\x00\x09\xff\x0c\x00\x7e\x4f\xf4\x33\xe9\xc5\x3e\x56" replace | ||
| 78 | } err | ||
| 79 | assert_match "*Bad data format*" $err | ||
| 80 | r ping | ||
| 81 | } | ||
| 82 | } | ||
| 83 | |||
| 84 | test {corrupt payload: hash listpackex with unordered TTL fields} { | ||
| 85 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 86 | r config set sanitize-dump-payload yes | ||
| 87 | catch { | ||
| 88 | r restore key 0 "\x17\xc3\x30\x35\x14\x35\x00\x00\x00\t\x00\x82\x66\x32\x03\x82\x76\x32\x03\xf4\x80\x73\x16\xd1\x8f\x01\x20\x12\x02\x82\x66\x31\x20\x11\x03\x31\x03\xf4\x7f\xe0\x01\x11\x00\x33\x20\x11\x04\x33\x03\x00\x01\xff\x0c\x00\xf6\x70\x29\x57\x11\x68\x9d\xe5" replace | ||
| 89 | } err | ||
| 90 | assert_match "*Bad data format*" $err | ||
| 91 | r ping | ||
| 92 | } | ||
| 93 | } | ||
| 94 | |||
| 95 | test {corrupt payload: hash listpackex field without TTL should not be followed by field with TTL} { | ||
| 96 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 97 | r config set sanitize-dump-payload yes | ||
| 98 | catch { | ||
| 99 | r restore key 0 "\x17\x2d\x2d\x00\x00\x00\x09\x00\x82\x66\x31\x03\x82\x76\x31\x03\x00\x01\x82\x66\x32\x03\x82\x76\x32\x03\xf4\xe0\x59\x7a\x96\x00\x00\x00\x00\x09\x82\x66\x33\x03\x82\x76\x33\x03\x00\x01\xff\x0c\x00\x42\x66\xd4\xbe\x17\xc3\x96\x72" replace | ||
| 100 | } err | ||
| 101 | assert_match "*Bad data format*" $err | ||
| 102 | r ping | ||
| 103 | } | ||
| 104 | } | ||
| 105 | |||
| 106 | test {corrupt payload: hash hashtable with TTL large than EB_EXPIRE_TIME_MAX} { | ||
| 107 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 108 | r config set hash-max-listpack-entries 0 | ||
| 109 | r config set sanitize-dump-payload yes | ||
| 110 | catch { | ||
| 111 | r restore key 0 "\x16\x02\x81\x00\x01\x00\x00\x00\x00\x00\x00\x02\x66\x31\x02\x76\x31\x81\x00\x01\x00\x00\x00\x00\x00\x00\x02\x66\x32\x02\x76\x32\x0c\x00\xb9\x3c\x65\x28\x40\x94\x58\x36" replace | ||
| 112 | } err | ||
| 113 | assert_match "*Bad data format*" $err | ||
| 114 | r ping | ||
| 115 | } | ||
| 116 | } | ||
| 117 | |||
| 118 | test {corrupt payload: quicklist big ziplist prev len} { | ||
| 119 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 120 | r config set sanitize-dump-payload no | ||
| 121 | catch {r restore key 0 "\x0E\x01\x13\x13\x00\x00\x00\x0E\x00\x00\x00\x02\x00\x00\x02\x61\x00\x0E\x02\x62\x00\xFF\x09\x00\x49\x97\x30\xB2\x0D\xA1\xED\xAA"} err | ||
| 122 | assert_match "*Bad data format*" $err | ||
| 123 | verify_log_message 0 "*integrity check failed*" 0 | ||
| 124 | } | ||
| 125 | } | ||
| 126 | |||
| 127 | test {corrupt payload: quicklist small ziplist prev len} { | ||
| 128 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 129 | r config set sanitize-dump-payload yes | ||
| 130 | catch { | ||
| 131 | r restore key 0 "\x0E\x01\x13\x13\x00\x00\x00\x0E\x00\x00\x00\x02\x00\x00\x02\x61\x00\x02\x02\x62\x00\xFF\x09\x00\xC7\x71\x03\x97\x07\x75\xB0\x63" | ||
| 132 | } err | ||
| 133 | assert_match "*Bad data format*" $err | ||
| 134 | verify_log_message 0 "*integrity check failed*" 0 | ||
| 135 | } | ||
| 136 | } | ||
| 137 | |||
| 138 | test {corrupt payload: quicklist ziplist wrong count} { | ||
| 139 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 140 | r config set sanitize-dump-payload no | ||
| 141 | catch {r restore key 0 "\x0E\x01\x13\x13\x00\x00\x00\x0E\x00\x00\x00\x03\x00\x00\x02\x61\x00\x04\x02\x62\x00\xFF\x09\x00\x4D\xE2\x0A\x2F\x08\x25\xDF\x91"} err | ||
| 142 | assert_match "*Bad data format*" $err | ||
| 143 | verify_log_message 0 "*integrity check failed*" 0 | ||
| 144 | } | ||
| 145 | } | ||
| 146 | |||
| 147 | test {corrupt payload: #3080 - quicklist} { | ||
| 148 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 149 | r config set sanitize-dump-payload no | ||
| 150 | catch { | ||
| 151 | r RESTORE key 0 "\x0E\x01\x80\x00\x00\x00\x10\x41\x41\x41\x41\x41\x41\x41\x41\x02\x00\x00\x80\x41\x41\x41\x41\x07\x00\x03\xC7\x1D\xEF\x54\x68\xCC\xF3" | ||
| 152 | r DUMP key ;# DUMP was used in the original issue, but now even with shallow sanitization restore safely fails, so this is dead code | ||
| 153 | } err | ||
| 154 | assert_match "*Bad data format*" $err | ||
| 155 | verify_log_message 0 "*integrity check failed*" 0 | ||
| 156 | } | ||
| 157 | } | ||
| 158 | |||
| 159 | test {corrupt payload: quicklist with empty ziplist} { | ||
| 160 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 161 | r config set sanitize-dump-payload no | ||
| 162 | r debug set-skip-checksum-validation 1 | ||
| 163 | catch {r restore key 0 "\x0E\x01\x0B\x0B\x00\x00\x00\x0A\x00\x00\x00\x00\x00\xFF\x09\x00\xC2\x69\x37\x83\x3C\x7F\xFE\x6F" replace} err | ||
| 164 | assert_match "*Bad data format*" $err | ||
| 165 | r ping | ||
| 166 | } | ||
| 167 | } | ||
| 168 | |||
| 169 | test {corrupt payload: quicklist encoded_len is 0} { | ||
| 170 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 171 | catch { r restore _list 0 "\x12\x01\x01\x00\x0a\x00\x8f\xc6\xc0\x57\x1c\x0a\xb3\x3c" replace } err | ||
| 172 | assert_match "*Bad data format*" $err | ||
| 173 | r ping | ||
| 174 | } | ||
| 175 | } | ||
| 176 | |||
| 177 | test {corrupt payload: quicklist listpack entry start with EOF} { | ||
| 178 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 179 | r config set sanitize-dump-payload yes | ||
| 180 | catch { r restore _list 0 "\x12\x01\x02\x0b\x0b\x00\x00\x00\x01\x00\x81\x61\x02\xff\xff\x0a\x00\x7e\xd8\xde\x5b\x0d\xd7\x70\xb8" replace } err | ||
| 181 | assert_match "*Bad data format*" $err | ||
| 182 | r ping | ||
| 183 | } | ||
| 184 | } | ||
| 185 | |||
| 186 | test {corrupt payload: #3080 - ziplist} { | ||
| 187 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 188 | # shallow sanitization is enough for restore to safely reject the payload with wrong size | ||
| 189 | r config set sanitize-dump-payload no | ||
| 190 | catch { | ||
| 191 | r RESTORE key 0 "\x0A\x80\x00\x00\x00\x10\x41\x41\x41\x41\x41\x41\x41\x41\x02\x00\x00\x80\x41\x41\x41\x41\x07\x00\x39\x5B\x49\xE0\xC1\xC6\xDD\x76" | ||
| 192 | } err | ||
| 193 | assert_match "*Bad data format*" $err | ||
| 194 | verify_log_message 0 "*integrity check failed*" 0 | ||
| 195 | } | ||
| 196 | } | ||
| 197 | |||
| 198 | test {corrupt payload: load corrupted rdb with no CRC - #3505} { | ||
| 199 | set server_path [tmpdir "server.rdb-corruption-test"] | ||
| 200 | exec cp tests/assets/corrupt_ziplist.rdb $server_path | ||
| 201 | set srv [start_server [list overrides [list "dir" $server_path "dbfilename" "corrupt_ziplist.rdb" loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no sanitize-dump-payload no]]] | ||
| 202 | |||
| 203 | # wait for termination | ||
| 204 | wait_for_condition 100 50 { | ||
| 205 | ! [is_alive [dict get $srv pid]] | ||
| 206 | } else { | ||
| 207 | fail "rdb loading didn't fail" | ||
| 208 | } | ||
| 209 | |||
| 210 | set stdout [dict get $srv stdout] | ||
| 211 | assert_equal [count_message_lines $stdout "Terminating server after rdb file reading failure."] 1 | ||
| 212 | assert_lessthan 1 [count_message_lines $stdout "integrity check failed"] | ||
| 213 | kill_server $srv ;# let valgrind look for issues | ||
| 214 | } | ||
| 215 | |||
| 216 | foreach sanitize_dump {no yes} { | ||
| 217 | test {corrupt payload: load corrupted rdb with empty keys} { | ||
| 218 | set server_path [tmpdir "server.rdb-corruption-empty-keys-test"] | ||
| 219 | exec cp tests/assets/corrupt_empty_keys.rdb $server_path | ||
| 220 | start_server [list overrides [list "dir" $server_path "dbfilename" "corrupt_empty_keys.rdb" "sanitize-dump-payload" $sanitize_dump]] { | ||
| 221 | r select 0 | ||
| 222 | assert_equal [r dbsize] 0 | ||
| 223 | |||
| 224 | verify_log_message 0 "*skipping empty key: set*" 0 | ||
| 225 | verify_log_message 0 "*skipping empty key: list_quicklist*" 0 | ||
| 226 | verify_log_message 0 "*skipping empty key: list_quicklist_empty_ziplist*" 0 | ||
| 227 | verify_log_message 0 "*skipping empty key: list_ziplist*" 0 | ||
| 228 | verify_log_message 0 "*skipping empty key: hash*" 0 | ||
| 229 | verify_log_message 0 "*skipping empty key: hash_ziplist*" 0 | ||
| 230 | verify_log_message 0 "*skipping empty key: zset*" 0 | ||
| 231 | verify_log_message 0 "*skipping empty key: zset_ziplist*" 0 | ||
| 232 | verify_log_message 0 "*skipping empty key: zset_listpack*" 0 | ||
| 233 | verify_log_message 0 "*empty keys skipped: 9*" 0 | ||
| 234 | } | ||
| 235 | } | ||
| 236 | } | ||
| 237 | |||
| 238 | test {corrupt payload: listpack invalid size header} { | ||
| 239 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 240 | r config set sanitize-dump-payload no | ||
| 241 | catch { | ||
| 242 | r restore key 0 "\x0F\x01\x10\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x02\x40\x55\x5F\x00\x00\x00\x0F\x00\x01\x01\x00\x01\x02\x01\x88\x31\x00\x00\x00\x00\x00\x00\x00\x09\x88\x32\x00\x00\x00\x00\x00\x00\x00\x09\x00\x01\x00\x01\x00\x01\x00\x01\x02\x02\x88\x31\x00\x00\x00\x00\x00\x00\x00\x09\x88\x61\x00\x00\x00\x00\x00\x00\x00\x09\x88\x32\x00\x00\x00\x00\x00\x00\x00\x09\x88\x62\x00\x00\x00\x00\x00\x00\x00\x09\x08\x01\xFF\x0A\x01\x00\x00\x09\x00\x45\x91\x0A\x87\x2F\xA5\xF9\x2E" | ||
| 243 | } err | ||
| 244 | assert_match "*Bad data format*" $err | ||
| 245 | verify_log_message 0 "*Stream listpack integrity check failed*" 0 | ||
| 246 | } | ||
| 247 | } | ||
| 248 | |||
| 249 | test {corrupt payload: listpack too long entry len} { | ||
| 250 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 251 | r config set sanitize-dump-payload no | ||
| 252 | catch { | ||
| 253 | r restore key 0 "\x0F\x01\x10\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x02\x40\x55\x55\x00\x00\x00\x0F\x00\x01\x01\x00\x01\x02\x01\x88\x31\x00\x00\x00\x00\x00\x00\x00\x09\x88\x32\x00\x00\x00\x00\x00\x00\x00\x09\x00\x01\x00\x01\x00\x01\x00\x01\x02\x02\x89\x31\x00\x00\x00\x00\x00\x00\x00\x09\x88\x61\x00\x00\x00\x00\x00\x00\x00\x09\x88\x32\x00\x00\x00\x00\x00\x00\x00\x09\x88\x62\x00\x00\x00\x00\x00\x00\x00\x09\x08\x01\xFF\x0A\x01\x00\x00\x09\x00\x40\x63\xC9\x37\x03\xA2\xE5\x68" | ||
| 254 | } err | ||
| 255 | assert_equal [count_log_message 0 "crashed by signal"] 0 | ||
| 256 | assert_equal [count_log_message 0 "ASSERTION FAILED"] 1 | ||
| 257 | } | ||
| 258 | } | ||
| 259 | |||
| 260 | test {corrupt payload: listpack very long entry len} { | ||
| 261 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 262 | r config set sanitize-dump-payload no | ||
| 263 | catch { | ||
| 264 | # This will catch migrated payloads from v6.2.x | ||
| 265 | r restore key 0 "\x0F\x01\x10\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x02\x40\x55\x55\x00\x00\x00\x0F\x00\x01\x01\x00\x01\x02\x01\x88\x31\x00\x00\x00\x00\x00\x00\x00\x09\x88\x32\x00\x00\x00\x00\x00\x00\x00\x09\x00\x01\x00\x01\x00\x01\x00\x01\x02\x02\x88\x31\x00\x00\x00\x00\x00\x00\x00\x09\x88\x61\x00\x00\x00\x00\x00\x00\x00\x09\x88\x32\x00\x00\x00\x00\x00\x00\x00\x09\x9C\x62\x00\x00\x00\x00\x00\x00\x00\x09\x08\x01\xFF\x0A\x01\x00\x00\x09\x00\x63\x6F\x42\x8E\x7C\xB5\xA2\x9D" | ||
| 266 | } err | ||
| 267 | assert_equal [count_log_message 0 "crashed by signal"] 0 | ||
| 268 | assert_equal [count_log_message 0 "ASSERTION FAILED"] 1 | ||
| 269 | } | ||
| 270 | } | ||
| 271 | |||
| 272 | test {corrupt payload: listpack too long entry prev len} { | ||
| 273 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 274 | r config set sanitize-dump-payload yes | ||
| 275 | catch { | ||
| 276 | r restore key 0 "\x0F\x01\x10\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x02\x40\x55\x55\x00\x00\x00\x0F\x00\x01\x01\x00\x15\x02\x01\x88\x31\x00\x00\x00\x00\x00\x00\x00\x09\x88\x32\x00\x00\x00\x00\x00\x00\x00\x09\x00\x01\x00\x01\x00\x01\x00\x01\x02\x02\x88\x31\x00\x00\x00\x00\x00\x00\x00\x09\x88\x61\x00\x00\x00\x00\x00\x00\x00\x09\x88\x32\x00\x00\x00\x00\x00\x00\x00\x09\x88\x62\x00\x00\x00\x00\x00\x00\x00\x09\x08\x01\xFF\x0A\x01\x00\x00\x09\x00\x06\xFB\x44\x24\x0A\x8E\x75\xEA" | ||
| 277 | } err | ||
| 278 | assert_match "*Bad data format*" $err | ||
| 279 | verify_log_message 0 "*Stream listpack integrity check failed*" 0 | ||
| 280 | } | ||
| 281 | } | ||
| 282 | |||
| 283 | test {corrupt payload: stream entry with invalid lp_count causing infinite loop in reverse iteration} { | ||
| 284 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 285 | r config set sanitize-dump-payload no | ||
| 286 | r debug set-skip-checksum-validation 1 | ||
| 287 | r restore key 0 "\x15\x03\x10\x00\x00\x01\x99\x52\xB3\xAC\x2F\x00\x00\x00\x00\x00\x00\x00\x00\xC3\x40\x4F\x40\x5C\x18\x5C\x00\x00\x00\x24\x00\x05\x01\x00\x01\x02\x01\x84\x69\x74\x65\x6D\x05\x85\x76\x61\x6C\x75\x65\x06\x40\x10\x00\x00\x20\x01\x00\x01\x20\x03\x00\x19\x20\x1C\x40\x09\x05\x01\x01\x82\x5F\x31\x03\x80\x0D\x00\x02\x20\x0D\x00\x02\xA0\x19\x00\x03\x20\x0B\x02\x82\x5F\x33\xA0\x19\x00\x04\x20\x0D\x00\x04\x20\x19\x00\xFF\x10\x00\x00\x01\x99\x52\xB3\xAC\x32\x00\x00\x00\x00\x00\x00\x00\x00\xC3\x40\x51\x40\x5E\x18\x5E\x00\x00\x00\x24\x00\x05\x01\x00\x01\x02\x01\x84\x69\x74\x65\x6D\x05\x85\x76\x61\x6C\x75\x65\x06\x40\x10\x00\x00\x20\x01\x06\x01\x01\x82\x5F\x35\x03\x05\x20\x1E\x00\x01\x60\x0D\x01\x06\x01\x40\x0B\x00\x04\x60\x0B\x02\x82\x5F\x37\x60\x19\x40\x3E\x02\x01\x01\x08\x20\x07\x40\x0B\x40\x00\x02\x82\x5F\x39\x20\x19\x00\xFF\x10\x00\x00\x01\x99\x52\xB3\xAC\x39\x00\x00\x00\x00\x00\x00\x00\x00\xC3\x3B\x40\x49\x18\x49\x00\x00\x00\x15\x00\x02\x01\x00\x01\x02\x01\x84\x69\x74\x65\x6D\x05\x85\x76\x61\x6C\x75\x65\x06\x40\x10\x00\x00\x20\x01\x40\x00\x00\x05\x20\x07\x40\x09\xC0\x22\x09\x01\x01\x86\x75\x6E\x69\x71\x75\x65\x07\xA0\x2C\x02\x08\x01\xFF\x0C\x81\x00\x00\x01\x99\x52\xB3\xAC\x39\x01\x81\x00\x00\x01\x99\x52\xB3\xAC\x2F\x00\x00\x00\x0C\x00\x0C\x00\xA4\x99\xB6\x4E\x9D\x69\x79\x6A" | ||
| 288 | |||
| 289 | catch {r XREVRANGE key + -} | ||
| 290 | assert_equal [count_log_message 0 "crashed by signal"] 0 | ||
| 291 | assert_equal [count_log_message 0 "ASSERTION FAILED"] 1 | ||
| 292 | } | ||
| 293 | } | ||
| 294 | |||
| 295 | test {corrupt payload: stream entry with invalid numfields causing infinite loop in reverse iteration} { | ||
| 296 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 297 | r config set sanitize-dump-payload no | ||
| 298 | r debug set-skip-checksum-validation 1 | ||
| 299 | |||
| 300 | r restore key 0 "\x15\x01\x10\x00\x00\x01\x9a\x0e\x68\xdd\x3e\x00\x00\x00\x00\x00\x00\x00\x00\x40\x5c\x5c\x00\x00\x00\x1f\x00\x03\x01\x01\x01\x02\x01\x84\x69\x74\x65\x6d\x05\x85\x76\x61\x6c\x75\x65\x06\x00\x01\x02\x01\x00\x01\x00\x01\x01\x01\x00\x01\x05\x01\x03\x01\x0e\x01\x00\x01\x01\x01\x82\x5f\x31\x03\x05\x01\x30\x01\x0e\x01\x01\x01\x01\x01\x02\x01\x05\x01\x00\x01\xf3\x91\x20\x13\x17\x05\x00\x01\x01\x01\xf3\x64\x2f\xdf\xe7\x05\xf3\x80\xd3\x91\x1d\x05\x06\x01\xff\x03\x81\x00\x00\x01\x9a\x25\x7b\xfd\xcf\x00\x81\x00\x00\x01\x9a\x0e\x68\xdd\x3e\x00\x81\x00\x00\x01\x9a\x0e\x68\xdd\x4c\x00\x04\x01\x07\x6d\x79\x67\x72\x6f\x75\x70\x81\x00\x00\x01\x9a\x0e\x68\xdd\x4c\x00\x02\x01\x00\x00\x01\x9a\x0e\x68\xdd\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x4d\xdd\x68\x0e\x9a\x01\x00\x00\x01\x01\x05\x41\x6c\x69\x63\x65\x4d\xdd\x68\x0e\x9a\x01\x00\x00\x4d\xdd\x68\x0e\x9a\x01\x00\x00\x01\x00\x00\x01\x9a\x0e\x68\xdd\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x00\xd8\xd6\x84\x4e\xc6\xc0\x63\xdb" replace | ||
| 301 | catch {r XREVRANGE key + -} | ||
| 302 | assert_equal [count_log_message 0 "crashed by signal"] 0 | ||
| 303 | assert_equal [count_log_message 0 "ASSERTION FAILED"] 1 | ||
| 304 | } | ||
| 305 | } | ||
| 306 | |||
| 307 | test {corrupt payload: stream with duplicate consumers} { | ||
| 308 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 309 | catch { | ||
| 310 | r restore key 0 "\x0F\x00\x00\x00\x00\x01\x07\x6D\x79\x67\x72\x6F\x75\x70\x00\x00\x00\x02\x04\x6E\x61\x6D\x65\x2A\x4C\xAA\x9A\x7D\x01\x00\x00\x00\x04\x6E\x61\x6D\x65\x2B\x4C\xAA\x9A\x7D\x01\x00\x00\x00\x0A\x00\xCC\xED\x8C\xA7\x62\xEE\xC7\xC8" | ||
| 311 | } err | ||
| 312 | assert_match "*Bad data format*" $err | ||
| 313 | verify_log_message 0 "*Duplicate stream consumer detected*" 0 | ||
| 314 | r ping | ||
| 315 | } | ||
| 316 | } | ||
| 317 | |||
| 318 | test {corrupt payload: hash ziplist with duplicate records} { | ||
| 319 | # when we do perform full sanitization, we expect duplicate records to fail the restore | ||
| 320 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 321 | r config set sanitize-dump-payload yes | ||
| 322 | r debug set-skip-checksum-validation 1 | ||
| 323 | catch { r RESTORE _hash 0 "\x0D\x3D\x3D\x00\x00\x00\x3A\x00\x00\x00\x14\x13\x00\xF5\x02\xF5\x02\xF2\x02\x53\x5F\x31\x04\xF3\x02\xF3\x02\xF7\x02\xF7\x02\xF8\x02\x02\x5F\x37\x04\xF1\x02\xF1\x02\xF6\x02\x02\x5F\x35\x04\xF4\x02\x02\x5F\x33\x04\xFA\x02\x02\x5F\x39\x04\xF9\x02\xF9\xFF\x09\x00\xB5\x48\xDE\x62\x31\xD0\xE5\x63" } err | ||
| 324 | assert_match "*Bad data format*" $err | ||
| 325 | } | ||
| 326 | } | ||
| 327 | |||
| 328 | test {corrupt payload: hash listpack with duplicate records} { | ||
| 329 | # when we do perform full sanitization, we expect duplicate records to fail the restore | ||
| 330 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 331 | r config set sanitize-dump-payload yes | ||
| 332 | r debug set-skip-checksum-validation 1 | ||
| 333 | catch { r RESTORE _hash 0 "\x10\x17\x17\x00\x00\x00\x04\x00\x82\x61\x00\x03\x82\x62\x00\x03\x82\x61\x00\x03\x82\x64\x00\x03\xff\x0a\x00\xc0\xcf\xa6\x87\xe5\xa7\xc5\xbe" } err | ||
| 334 | assert_match "*Bad data format*" $err | ||
| 335 | } | ||
| 336 | } | ||
| 337 | |||
| 338 | test {corrupt payload: hash listpack with duplicate records - convert} { | ||
| 339 | # when we do NOT perform full sanitization, but we convert to hash, we expect duplicate records panic | ||
| 340 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 341 | r config set sanitize-dump-payload no | ||
| 342 | r config set hash-max-listpack-entries 1 | ||
| 343 | r debug set-skip-checksum-validation 1 | ||
| 344 | catch { r RESTORE _hash 0 "\x10\x17\x17\x00\x00\x00\x04\x00\x82\x61\x00\x03\x82\x62\x00\x03\x82\x61\x00\x03\x82\x64\x00\x03\xff\x0a\x00\xc0\xcf\xa6\x87\xe5\xa7\xc5\xbe" } err | ||
| 345 | assert_equal [count_log_message 0 "crashed by signal"] 0 | ||
| 346 | assert_equal [count_log_message 0 "listpack with dup elements"] 1 | ||
| 347 | } | ||
| 348 | } | ||
| 349 | |||
| 350 | test {corrupt payload: hash ziplist uneven record count} { | ||
| 351 | # when we do NOT perform full sanitization, but shallow sanitization can detect uneven count | ||
| 352 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 353 | r config set sanitize-dump-payload no | ||
| 354 | r debug set-skip-checksum-validation 1 | ||
| 355 | catch { r RESTORE _hash 0 "\r\x1b\x1b\x00\x00\x00\x16\x00\x00\x00\x04\x00\x00\x02a\x00\x04\x02b\x00\x04\x02a\x00\x04\x02d\x00\xff\t\x00\xa1\x98\x36x\xcc\x8e\x93\x2e" } err | ||
| 356 | assert_match "*Bad data format*" $err | ||
| 357 | } | ||
| 358 | } | ||
| 359 | |||
| 360 | test {corrupt payload: hash duplicate records} { | ||
| 361 | # when we do perform full sanitization, we expect duplicate records to fail the restore | ||
| 362 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 363 | r config set sanitize-dump-payload yes | ||
| 364 | r debug set-skip-checksum-validation 1 | ||
| 365 | catch { r RESTORE _hash 0 "\x04\x02\x01a\x01b\x01a\x01d\t\x00\xc6\x9c\xab\xbc\bk\x0c\x06" } err | ||
| 366 | assert_match "*Bad data format*" $err | ||
| 367 | } | ||
| 368 | } | ||
| 369 | |||
| 370 | test {corrupt payload: hash empty zipmap} { | ||
| 371 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 372 | r config set sanitize-dump-payload no | ||
| 373 | r debug set-skip-checksum-validation 1 | ||
| 374 | catch { r RESTORE _hash 0 "\x09\x02\x00\xFF\x09\x00\xC0\xF1\xB8\x67\x4C\x16\xAC\xE3" } err | ||
| 375 | assert_match "*Bad data format*" $err | ||
| 376 | verify_log_message 0 "*Zipmap integrity check failed*" 0 | ||
| 377 | } | ||
| 378 | } | ||
| 379 | |||
| 380 | test {corrupt payload: fuzzer findings - NPD in streamIteratorGetID} { | ||
| 381 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 382 | r config set sanitize-dump-payload no | ||
| 383 | r debug set-skip-checksum-validation 1 | ||
| 384 | catch { | ||
| 385 | r RESTORE key 0 "\x0F\x01\x10\x00\x00\x01\x73\xBD\x68\x48\x71\x00\x00\x00\x00\x00\x00\x00\x00\x40\x42\x42\x00\x00\x00\x18\x00\x03\x01\x00\x01\x02\x01\x84\x69\x74\x65\x6D\x05\x85\x76\x61\x6C\x75\x65\x06\x00\x01\x02\x01\x00\x01\x00\x01\x01\x01\x00\x01\x05\x01\x02\x01\x00\x01\x01\x01\x01\x01\x82\x5F\x31\x03\x05\x01\x02\x01\x00\x01\x02\x01\x01\x01\x02\x01\x48\x01\xFF\x03\x81\x00\x00\x01\x73\xBD\x68\x48\x71\x02\x01\x07\x6D\x79\x67\x72\x6F\x75\x70\x81\x00\x00\x01\x73\xBD\x68\x48\x71\x00\x01\x00\x00\x01\x73\xBD\x68\x48\x71\x00\x00\x00\x00\x00\x00\x00\x00\x72\x48\x68\xBD\x73\x01\x00\x00\x01\x01\x05\x41\x6C\x69\x63\x65\x72\x48\x68\xBD\x73\x01\x00\x00\x01\x00\x00\x01\x73\xBD\x68\x48\x71\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x80\xCD\xB0\xD5\x1A\xCE\xFF\x10" | ||
| 386 | r XREVRANGE key 725 233 | ||
| 387 | } | ||
| 388 | assert_equal [count_log_message 0 "crashed by signal"] 0 | ||
| 389 | assert_equal [count_log_message 0 "ASSERTION FAILED"] 1 | ||
| 390 | } | ||
| 391 | } | ||
| 392 | |||
| 393 | test {corrupt payload: fuzzer findings - listpack NPD on invalid stream} { | ||
| 394 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 395 | r config set sanitize-dump-payload no | ||
| 396 | r debug set-skip-checksum-validation 1 | ||
| 397 | catch { | ||
| 398 | r RESTORE _stream 0 "\x0F\x01\x10\x00\x00\x01\x73\xDC\xB6\x6B\xF1\x00\x00\x00\x00\x00\x00\x00\x00\x40\x42\x42\x00\x00\x00\x18\x00\x03\x01\x00\x01\x02\x01\x84\x69\x74\x65\x6D\x05\x85\x76\x61\x6C\x75\x65\x06\x00\x01\x02\x01\x00\x01\x00\x01\x01\x01\x00\x01\x05\x01\x02\x01\x1F\x01\x00\x01\x01\x01\x6D\x5F\x31\x03\x05\x01\x02\x01\x29\x01\x00\x01\x01\x01\x02\x01\x05\x01\xFF\x03\x81\x00\x00\x01\x73\xDC\xB6\x6C\x1A\x00\x01\x07\x6D\x79\x67\x72\x6F\x75\x70\x81\x00\x00\x01\x73\xDC\xB6\x6B\xF1\x00\x01\x00\x00\x01\x73\xDC\xB6\x6B\xF1\x00\x00\x00\x00\x00\x00\x00\x00\x4B\x6C\xB6\xDC\x73\x01\x00\x00\x01\x01\x05\x41\x6C\x69\x63\x65\x3D\x6C\xB6\xDC\x73\x01\x00\x00\x01\x00\x00\x01\x73\xDC\xB6\x6B\xF1\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\xC7\x7D\x1C\xD7\x04\xFF\xE6\x9D" | ||
| 399 | r XREAD STREAMS _stream 519389898758 | ||
| 400 | } | ||
| 401 | assert_equal [count_log_message 0 "crashed by signal"] 0 | ||
| 402 | assert_equal [count_log_message 0 "ASSERTION FAILED"] 1 | ||
| 403 | } | ||
| 404 | } | ||
| 405 | |||
| 406 | test {corrupt payload: fuzzer findings - NPD in quicklistIndex} { | ||
| 407 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 408 | r config set sanitize-dump-payload no | ||
| 409 | r debug set-skip-checksum-validation 1 | ||
| 410 | catch { | ||
| 411 | r RESTORE key 0 "\x0E\x01\x13\x13\x00\x00\x00\x10\x00\x00\x00\x03\x12\x00\xF3\x02\x02\x5F\x31\x04\xF1\xFF\x09\x00\xC9\x4B\x31\xFE\x61\xC0\x96\xFE" | ||
| 412 | } err | ||
| 413 | assert_match "*Bad data format*" $err | ||
| 414 | verify_log_message 0 "*integrity check failed*" 0 | ||
| 415 | } | ||
| 416 | } | ||
| 417 | |||
| 418 | test {corrupt payload: fuzzer findings - encoded entry header reach outside the allocation} { | ||
| 419 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 420 | r debug set-skip-checksum-validation 1 | ||
| 421 | catch { | ||
| 422 | r RESTORE key 0 "\x0D\x19\x19\x00\x00\x00\x16\x00\x00\x00\x06\x00\x00\xF1\x02\xF1\x02\xF2\x02\x02\x5F\x31\x04\x99\x02\xF3\xFF\x09\x00\xC5\xB8\x10\xC0\x8A\xF9\x16\xDF" | ||
| 423 | } err | ||
| 424 | assert_match "*Bad data format*" $err | ||
| 425 | verify_log_message 0 "*integrity check failed*" 0 | ||
| 426 | } | ||
| 427 | } | ||
| 428 | |||
| 429 | |||
| 430 | test {corrupt payload: fuzzer findings - invalid ziplist encoding} { | ||
| 431 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 432 | r config set sanitize-dump-payload yes | ||
| 433 | r debug set-skip-checksum-validation 1 | ||
| 434 | catch { | ||
| 435 | r RESTORE _listbig 0 "\x0E\x02\x1B\x1B\x00\x00\x00\x16\x00\x00\x00\x05\x00\x00\x02\x5F\x39\x04\xF9\x02\x86\x5F\x37\x04\xF7\x02\x02\x5F\x35\xFF\x19\x19\x00\x00\x00\x16\x00\x00\x00\x05\x00\x00\xF5\x02\x02\x5F\x33\x04\xF3\x02\x02\x5F\x31\x04\xF1\xFF\x09\x00\x0C\xFC\x99\x2C\x23\x45\x15\x60" | ||
| 436 | } err | ||
| 437 | assert_match "*Bad data format*" $err | ||
| 438 | verify_log_message 0 "*integrity check failed*" 0 | ||
| 439 | } | ||
| 440 | } | ||
| 441 | |||
| 442 | test {corrupt payload: fuzzer findings - hash crash} { | ||
| 443 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 444 | r config set sanitize-dump-payload yes | ||
| 445 | r debug set-skip-checksum-validation 1 | ||
| 446 | r RESTORE _hash 0 "\x0D\x19\x19\x00\x00\x00\x16\x00\x00\x00\x06\x00\x00\xF1\x02\xF1\x02\xF2\x02\x02\x5F\x31\x04\xF3\x02\xF3\xFF\x09\x00\x38\xB8\x10\xC0\x8A\xF9\x16\xDF" | ||
| 447 | r HSET _hash 394891450 1635910264 | ||
| 448 | r HMGET _hash 887312884855 | ||
| 449 | } | ||
| 450 | } | ||
| 451 | |||
| 452 | test {corrupt payload: fuzzer findings - uneven entry count in hash} { | ||
| 453 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 454 | r debug set-skip-checksum-validation 1 | ||
| 455 | catch { | ||
| 456 | r RESTORE _hashbig 0 "\x0D\x3D\x3D\x00\x00\x00\x38\x00\x00\x00\x14\x00\x00\xF2\x02\x02\x5F\x31\x04\x1C\x02\xF7\x02\xF1\x02\xF1\x02\xF5\x02\xF5\x02\xF4\x02\x02\x5F\x33\x04\xF6\x02\x02\x5F\x35\x04\xF8\x02\x02\x5F\x37\x04\xF9\x02\xF9\x02\xF3\x02\xF3\x02\xFA\x02\x02\x5F\x39\xFF\x09\x00\x73\xB7\x68\xC8\x97\x24\x8E\x88" | ||
| 457 | } err | ||
| 458 | assert_match "*Bad data format*" $err | ||
| 459 | verify_log_message 0 "*integrity check failed*" 0 | ||
| 460 | } | ||
| 461 | } | ||
| 462 | |||
| 463 | test {corrupt payload: fuzzer findings - invalid read in lzf_decompress} { | ||
| 464 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 465 | r config set sanitize-dump-payload no | ||
| 466 | r debug set-skip-checksum-validation 1 | ||
| 467 | catch { r RESTORE _setbig 0 "\x02\x03\x02\x5F\x31\xC0\x02\xC3\x00\x09\x00\xE6\xDC\x76\x44\xFF\xEB\x3D\xFE" } err | ||
| 468 | assert_match "*Bad data format*" $err | ||
| 469 | } | ||
| 470 | } | ||
| 471 | |||
| 472 | test {corrupt payload: fuzzer findings - leak in rdbloading due to dup entry in set} { | ||
| 473 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 474 | r config set sanitize-dump-payload no | ||
| 475 | r debug set-skip-checksum-validation 1 | ||
| 476 | catch { r RESTORE _setbig 0 "\x02\x0A\x02\x5F\x39\xC0\x06\x02\x5F\x31\xC0\x00\xC0\x04\x02\x5F\x35\xC0\x02\xC0\x08\x02\x5F\x31\x02\x5F\x33\x09\x00\x7A\x5A\xFB\x90\x3A\xE9\x3C\xBE" } err | ||
| 477 | assert_match "*Bad data format*" $err | ||
| 478 | } | ||
| 479 | } | ||
| 480 | |||
| 481 | test {corrupt payload: fuzzer findings - empty intset} { | ||
| 482 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 483 | r config set sanitize-dump-payload no | ||
| 484 | r debug set-skip-checksum-validation 1 | ||
| 485 | catch {r RESTORE _setbig 0 "\x02\xC0\xC0\x06\x02\x5F\x39\xC0\x02\x02\x5F\x33\xC0\x00\x02\x5F\x31\xC0\x04\xC0\x08\x02\x5F\x37\x02\x5F\x35\x09\x00\xC5\xD4\x6D\xBA\xAD\x14\xB7\xE7"} err | ||
| 486 | assert_match "*Bad data format*" $err | ||
| 487 | r ping | ||
| 488 | } | ||
| 489 | } | ||
| 490 | |||
| 491 | test {corrupt payload: fuzzer findings - zset ziplist entry lensize is 0} { | ||
| 492 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 493 | r config set sanitize-dump-payload no | ||
| 494 | r debug set-skip-checksum-validation 1 | ||
| 495 | catch {r RESTORE _zsetbig 0 "\x0C\x3D\x3D\x00\x00\x00\x3A\x00\x00\x00\x14\x00\x00\xF1\x02\xF1\x02\x02\x5F\x31\x04\xF2\x02\xF3\x02\xF3\x02\x02\x5F\x33\x04\xF4\x02\xEE\x02\xF5\x02\x02\x5F\x35\x04\xF6\x02\xF7\x02\xF7\x02\x02\x5F\x37\x04\xF8\x02\xF9\x02\xF9\x02\x02\x5F\x39\x04\xFA\xFF\x09\x00\xAE\xF9\x77\x2A\x47\x24\x33\xF6"} err | ||
| 496 | assert_match "*Bad data format*" $err | ||
| 497 | verify_log_message 0 "*Zset ziplist integrity check failed*" 0 | ||
| 498 | } | ||
| 499 | } | ||
| 500 | |||
| 501 | test {corrupt payload: fuzzer findings - valgrind ziplist prevlen reaches outside the ziplist} { | ||
| 502 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 503 | r config set sanitize-dump-payload no | ||
| 504 | r debug set-skip-checksum-validation 1 | ||
| 505 | catch {r RESTORE _listbig 0 "\x0E\x02\x1B\x1B\x00\x00\x00\x16\x00\x00\x00\x05\x00\x00\x02\x5F\x39\x04\xF9\x02\x02\x5F\x37\x04\xF7\x02\x02\x5F\x35\xFF\x19\x19\x00\x00\x00\x16\x00\x00\x00\x05\x00\x00\xF5\x02\x02\x5F\x33\x04\xF3\x95\x02\x5F\x31\x04\xF1\xFF\x09\x00\x0C\xFC\x99\x2C\x23\x45\x15\x60"} err | ||
| 506 | assert_match "*Bad data format*" $err | ||
| 507 | verify_log_message 0 "*integrity check failed*" 0 | ||
| 508 | } | ||
| 509 | } | ||
| 510 | |||
| 511 | test {corrupt payload: fuzzer findings - valgrind - bad rdbLoadDoubleValue} { | ||
| 512 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 513 | r config set sanitize-dump-payload no | ||
| 514 | r debug set-skip-checksum-validation 1 | ||
| 515 | catch { r RESTORE _list 0 "\x03\x01\x11\x11\x00\x00\x00\x0A\x00\x00\x00\x01\x00\x00\xD0\x07\x1A\xE9\x02\xFF\x09\x00\x1A\x06\x07\x32\x41\x28\x3A\x46" } err | ||
| 516 | assert_match "*Bad data format*" $err | ||
| 517 | } | ||
| 518 | } | ||
| 519 | |||
| 520 | test {corrupt payload: fuzzer findings - valgrind ziplist prev too big} { | ||
| 521 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 522 | r config set sanitize-dump-payload no | ||
| 523 | r debug set-skip-checksum-validation 1 | ||
| 524 | catch {r RESTORE _list 0 "\x0E\x01\x13\x13\x00\x00\x00\x10\x00\x00\x00\x03\x00\x00\xF3\x02\x02\x5F\x31\xC1\xF1\xFF\x09\x00\xC9\x4B\x31\xFE\x61\xC0\x96\xFE"} err | ||
| 525 | assert_match "*Bad data format*" $err | ||
| 526 | verify_log_message 0 "*integrity check failed*" 0 | ||
| 527 | } | ||
| 528 | } | ||
| 529 | |||
| 530 | test {corrupt payload: fuzzer findings - lzf decompression fails, avoid valgrind invalid read} { | ||
| 531 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 532 | r config set sanitize-dump-payload no | ||
| 533 | r debug set-skip-checksum-validation 1 | ||
| 534 | catch {r RESTORE _stream 0 "\x0F\x02\x10\x00\x00\x01\x73\xDD\xAA\x2A\xB9\x00\x00\x00\x00\x00\x00\x00\x00\xC3\x40\x4B\x40\x5C\x18\x5C\x00\x00\x00\x24\x00\x05\x01\x00\x01\x02\x01\x84\x69\x74\x65\x6D\x05\x85\x76\x61\x6C\x75\x65\x06\x40\x10\x00\x00\x20\x01\x00\x01\x20\x03\x00\x05\x20\x1C\x40\x07\x05\x01\x01\x82\x5F\x31\x03\x80\x0D\x40\x00\x00\x02\x60\x19\x40\x27\x40\x19\x00\x33\x60\x19\x40\x29\x02\x01\x01\x04\x20\x19\x00\xFF\x10\x00\x00\x01\x73\xDD\xAA\x2A\xBC\x00\x00\x00\x00\x00\x00\x00\x00\xC3\x40\x4D\x40\x5E\x18\x5E\x00\x00\x00\x24\x00\x05\x01\x00\x01\x02\x01\x84\x69\x74\x65\x6D\x05\x85\x76\x61\x6C\x75\x65\x06\x40\x10\x00\x00\x20\x01\x06\x01\x01\x82\x5F\x35\x03\x05\x20\x1E\x17\x0B\x03\x01\x01\x06\x01\x40\x0B\x00\x01\x60\x0D\x02\x82\x5F\x37\x60\x19\x80\x00\x00\x08\x60\x19\x80\x27\x02\x82\x5F\x39\x20\x19\x00\xFF\x0A\x81\x00\x00\x01\x73\xDD\xAA\x2A\xBE\x00\x00\x09\x00\x21\x85\x77\x43\x71\x7B\x17\x88"} err | ||
| 535 | assert_match "*Bad data format*" $err | ||
| 536 | } | ||
| 537 | } | ||
| 538 | |||
| 539 | test {corrupt payload: fuzzer findings - stream bad lp_count} { | ||
| 540 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 541 | r config set sanitize-dump-payload yes | ||
| 542 | r debug set-skip-checksum-validation 1 | ||
| 543 | catch { r RESTORE _stream 0 "\x0F\x01\x10\x00\x00\x01\x73\xDE\xDF\x7D\x9B\x00\x00\x00\x00\x00\x00\x00\x00\x40\x42\x42\x00\x00\x00\x18\x00\x03\x01\x00\x01\x02\x01\x84\x69\x74\x65\x6D\x05\x85\x76\x61\x6C\x75\x65\x06\x00\x01\x02\x01\x00\x01\x00\x01\x01\x01\x00\x01\x56\x01\x02\x01\x22\x01\x00\x01\x01\x01\x82\x5F\x31\x03\x05\x01\x02\x01\x2C\x01\x00\x01\x01\x01\x02\x01\x05\x01\xFF\x03\x81\x00\x00\x01\x73\xDE\xDF\x7D\xC7\x00\x01\x07\x6D\x79\x67\x72\x6F\x75\x70\x81\x00\x00\x01\x73\xDE\xDF\x7D\x9B\x00\x01\x00\x00\x01\x73\xDE\xDF\x7D\x9B\x00\x00\x00\x00\x00\x00\x00\x00\xF9\x7D\xDF\xDE\x73\x01\x00\x00\x01\x01\x05\x41\x6C\x69\x63\x65\xEB\x7D\xDF\xDE\x73\x01\x00\x00\x01\x00\x00\x01\x73\xDE\xDF\x7D\x9B\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\xB2\xA8\xA7\x5F\x1B\x61\x72\xD5"} err | ||
| 544 | assert_match "*Bad data format*" $err | ||
| 545 | r ping | ||
| 546 | } | ||
| 547 | } | ||
| 548 | |||
| 549 | test {corrupt payload: fuzzer findings - stream bad lp_count - unsanitized} { | ||
| 550 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 551 | r config set sanitize-dump-payload no | ||
| 552 | r debug set-skip-checksum-validation 1 | ||
| 553 | r RESTORE _stream 0 "\x0F\x01\x10\x00\x00\x01\x73\xDE\xDF\x7D\x9B\x00\x00\x00\x00\x00\x00\x00\x00\x40\x42\x42\x00\x00\x00\x18\x00\x03\x01\x00\x01\x02\x01\x84\x69\x74\x65\x6D\x05\x85\x76\x61\x6C\x75\x65\x06\x00\x01\x02\x01\x00\x01\x00\x01\x01\x01\x00\x01\x56\x01\x02\x01\x22\x01\x00\x01\x01\x01\x82\x5F\x31\x03\x05\x01\x02\x01\x2C\x01\x00\x01\x01\x01\x02\x01\x05\x01\xFF\x03\x81\x00\x00\x01\x73\xDE\xDF\x7D\xC7\x00\x01\x07\x6D\x79\x67\x72\x6F\x75\x70\x81\x00\x00\x01\x73\xDE\xDF\x7D\x9B\x00\x01\x00\x00\x01\x73\xDE\xDF\x7D\x9B\x00\x00\x00\x00\x00\x00\x00\x00\xF9\x7D\xDF\xDE\x73\x01\x00\x00\x01\x01\x05\x41\x6C\x69\x63\x65\xEB\x7D\xDF\xDE\x73\x01\x00\x00\x01\x00\x00\x01\x73\xDE\xDF\x7D\x9B\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\xB2\xA8\xA7\x5F\x1B\x61\x72\xD5" | ||
| 554 | catch { r XREVRANGE _stream 638932639 738} | ||
| 555 | assert_equal [count_log_message 0 "crashed by signal"] 0 | ||
| 556 | assert_equal [count_log_message 0 "ASSERTION FAILED"] 1 | ||
| 557 | } | ||
| 558 | } | ||
| 559 | |||
| 560 | test {corrupt payload: fuzzer findings - stream integrity check issue} { | ||
| 561 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 562 | r config set sanitize-dump-payload yes | ||
| 563 | r debug set-skip-checksum-validation 1 | ||
| 564 | catch { r RESTORE _stream 0 "\x0F\x02\x10\x00\x00\x01\x75\x2D\xA2\x90\x67\x00\x00\x00\x00\x00\x00\x00\x00\xC3\x40\x4F\x40\x5C\x18\x5C\x00\x00\x00\x24\x00\x05\x01\x00\x01\x4A\x01\x84\x69\x74\x65\x6D\x05\x85\x76\x61\x6C\x75\x65\x06\x40\x10\x00\x00\x20\x01\x00\x01\x20\x03\x00\x05\x20\x1C\x40\x09\x05\x01\x01\x82\x5F\x31\x03\x80\x0D\x00\x02\x20\x0D\x00\x02\xA0\x19\x00\x03\x20\x0B\x02\x82\x5F\x33\xA0\x19\x00\x04\x20\x0D\x00\x04\x20\x19\x00\xFF\x10\x00\x00\x01\x75\x2D\xA2\x90\x67\x00\x00\x00\x00\x00\x00\x00\x05\xC3\x40\x56\x40\x60\x18\x60\x00\x00\x00\x24\x00\x05\x01\x00\x01\x02\x01\x84\x69\x74\x65\x6D\x05\x85\x76\x61\x6C\x75\x65\x06\x40\x10\x00\x00\x20\x01\x06\x01\x01\x82\x5F\x35\x03\x05\x20\x1E\x40\x0B\x03\x01\x01\x06\x01\x80\x0B\x00\x02\x20\x0B\x02\x82\x5F\x37\x60\x19\x03\x01\x01\xDF\xFB\x20\x05\x00\x08\x60\x1A\x20\x0C\x00\xFC\x20\x05\x02\x82\x5F\x39\x20\x1B\x00\xFF\x0A\x81\x00\x00\x01\x75\x2D\xA2\x90\x68\x01\x00\x09\x00\x1D\x6F\xC0\x69\x8A\xDE\xF7\x92" } err | ||
| 565 | assert_match "*Bad data format*" $err | ||
| 566 | } | ||
| 567 | } | ||
| 568 | |||
| 569 | test {corrupt payload: fuzzer findings - infinite loop} { | ||
| 570 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 571 | r config set sanitize-dump-payload no | ||
| 572 | r debug set-skip-checksum-validation 1 | ||
| 573 | r RESTORE _stream 0 "\x0F\x01\x10\x00\x00\x01\x75\x3A\xA6\xD0\x93\x00\x00\x00\x00\x00\x00\x00\x00\x40\x42\x42\x00\x00\x00\x18\x00\x03\x01\x00\x01\x02\x01\x84\x69\x74\x65\x6D\x05\x85\x76\x61\x6C\x75\x65\x06\x00\x01\x02\x01\x00\x01\x00\x01\x01\x01\x00\x01\x05\x01\x02\x01\x00\x01\x01\x01\x01\x01\x82\x5F\x31\x03\xFD\x01\x02\x01\x00\x01\x02\x01\x01\x01\x02\x01\x05\x01\xFF\x03\x81\x00\x00\x01\x75\x3A\xA6\xD0\x93\x02\x01\x07\x6D\x79\x67\x72\x6F\x75\x70\x81\x00\x00\x01\x75\x3A\xA6\xD0\x93\x00\x01\x00\x00\x01\x75\x3A\xA6\xD0\x93\x00\x00\x00\x00\x00\x00\x00\x00\x94\xD0\xA6\x3A\x75\x01\x00\x00\x01\x01\x05\x41\x6C\x69\x63\x65\x94\xD0\xA6\x3A\x75\x01\x00\x00\x01\x00\x00\x01\x75\x3A\xA6\xD0\x93\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\xC4\x09\xAD\x69\x7E\xEE\xA6\x2F" | ||
| 574 | catch { r XREVRANGE _stream 288270516 971031845 } | ||
| 575 | assert_equal [count_log_message 0 "crashed by signal"] 0 | ||
| 576 | assert_equal [count_log_message 0 "ASSERTION FAILED"] 1 | ||
| 577 | } | ||
| 578 | } | ||
| 579 | |||
| 580 | test {corrupt payload: fuzzer findings - hash ziplist too long entry len} { | ||
| 581 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 582 | r debug set-skip-checksum-validation 1 | ||
| 583 | catch { | ||
| 584 | r RESTORE _hash 0 "\x0D\x3D\x3D\x00\x00\x00\x3A\x00\x00\x00\x14\x13\x00\xF5\x02\xF5\x02\xF2\x02\x53\x5F\x31\x04\xF3\x02\xF3\x02\xF7\x02\xF7\x02\xF8\x02\x02\x5F\x37\x04\xF1\x02\xF1\x02\xF6\x02\x02\x5F\x35\x04\xF4\x02\x02\x5F\x33\x04\xFA\x02\x02\x5F\x39\x04\xF9\x02\xF9\xFF\x09\x00\xB5\x48\xDE\x62\x31\xD0\xE5\x63" | ||
| 585 | } err | ||
| 586 | assert_match "*Bad data format*" $err | ||
| 587 | verify_log_message 0 "*integrity check failed*" 0 | ||
| 588 | } | ||
| 589 | } | ||
| 590 | |||
| 591 | if {$run_oom_tests} { | ||
| 592 | |||
| 593 | test {corrupt payload: OOM in rdbGenericLoadStringObject} { | ||
| 594 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 595 | r config set sanitize-dump-payload no | ||
| 596 | catch { r RESTORE x 0 "\x0A\x81\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x13\x00\x00\x00\x0E\x00\x00\x00\x02\x00\x00\x02\x61\x00\x04\x02\x62\x00\xFF\x09\x00\x57\x04\xE5\xCD\xD4\x37\x6C\x57" } err | ||
| 597 | assert_match "*Bad data format*" $err | ||
| 598 | r ping | ||
| 599 | } | ||
| 600 | } | ||
| 601 | |||
| 602 | test {corrupt payload: fuzzer findings - OOM in dictExpand} { | ||
| 603 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 604 | r config set sanitize-dump-payload no | ||
| 605 | r debug set-skip-checksum-validation 1 | ||
| 606 | catch { r RESTORE x 0 "\x02\x81\x02\x5F\x31\xC0\x00\xC0\x02\x09\x00\xCD\x84\x2C\xB7\xE8\xA4\x49\x57" } err | ||
| 607 | assert_match "*Bad data format*" $err | ||
| 608 | r ping | ||
| 609 | } | ||
| 610 | } {} {tsan:skip} | ||
| 611 | |||
| 612 | } | ||
| 613 | |||
| 614 | test {corrupt payload: fuzzer findings - zset ziplist invalid tail offset} { | ||
| 615 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 616 | r config set sanitize-dump-payload no | ||
| 617 | r debug set-skip-checksum-validation 1 | ||
| 618 | catch {r RESTORE _zset 0 "\x0C\x19\x19\x00\x00\x00\x02\x00\x00\x00\x06\x00\x00\xF1\x02\xF1\x02\x02\x5F\x31\x04\xF2\x02\xF3\x02\xF3\xFF\x09\x00\x4D\x72\x7B\x97\xCD\x9A\x70\xC1"} err | ||
| 619 | assert_match "*Bad data format*" $err | ||
| 620 | verify_log_message 0 "*Zset ziplist integrity check failed*" 0 | ||
| 621 | } | ||
| 622 | } | ||
| 623 | |||
| 624 | test {corrupt payload: fuzzer findings - negative reply length} { | ||
| 625 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 626 | r config set sanitize-dump-payload no | ||
| 627 | r debug set-skip-checksum-validation 1 | ||
| 628 | r RESTORE _stream 0 "\x0F\x01\x10\x00\x00\x01\x75\xCF\xA1\x16\xA7\x00\x00\x00\x00\x00\x00\x00\x00\x40\x42\x42\x00\x00\x00\x18\x00\x03\x01\x00\x01\x02\x01\x84\x69\x74\x65\x6D\x05\x85\x76\x61\x6C\x75\x65\x06\x00\x01\x02\x01\x00\x01\x00\x01\x01\x01\x00\x01\x05\x01\x02\x01\x00\x01\x01\x01\x01\x01\x14\x5F\x31\x03\x05\x01\x02\x01\x00\x01\x02\x01\x01\x01\x02\x01\x05\x01\xFF\x03\x81\x00\x00\x01\x75\xCF\xA1\x16\xA7\x02\x01\x07\x6D\x79\x67\x72\x6F\x75\x70\x81\x00\x00\x01\x75\xCF\xA1\x16\xA7\x01\x01\x00\x00\x01\x75\xCF\xA1\x16\xA7\x00\x00\x00\x00\x00\x00\x00\x01\xA7\x16\xA1\xCF\x75\x01\x00\x00\x01\x01\x05\x41\x6C\x69\x63\x65\xA7\x16\xA1\xCF\x75\x01\x00\x00\x01\x00\x00\x01\x75\xCF\xA1\x16\xA7\x00\x00\x00\x00\x00\x00\x00\x01\x09\x00\x1B\x42\x52\xB8\xDD\x5C\xE5\x4E" | ||
| 629 | catch {r XADD _stream * -956 -2601503852} | ||
| 630 | catch {r XINFO STREAM _stream FULL} | ||
| 631 | assert_equal [count_log_message 0 "crashed by signal"] 0 | ||
| 632 | assert_equal [count_log_message 0 "ASSERTION FAILED"] 1 | ||
| 633 | } | ||
| 634 | } | ||
| 635 | |||
| 636 | test {corrupt payload: fuzzer findings - valgrind negative malloc} { | ||
| 637 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 638 | r config set sanitize-dump-payload yes | ||
| 639 | r debug set-skip-checksum-validation 1 | ||
| 640 | catch {r RESTORE _key 0 "\x0E\x01\x81\xD6\xD6\x00\x00\x00\x0A\x00\x00\x00\x01\x00\x00\x40\xC8\x6F\x2F\x36\xE2\xDF\xE3\x2E\x26\x64\x8B\x87\xD1\x7A\xBD\xFF\xEF\xEF\x63\x65\xF6\xF8\x8C\x4E\xEC\x96\x89\x56\x88\xF8\x3D\x96\x5A\x32\xBD\xD1\x36\xD8\x02\xE6\x66\x37\xCB\x34\x34\xC4\x52\xA7\x2A\xD5\x6F\x2F\x7E\xEE\xA2\x94\xD9\xEB\xA9\x09\x38\x3B\xE1\xA9\x60\xB6\x4E\x09\x44\x1F\x70\x24\xAA\x47\xA8\x6E\x30\xE1\x13\x49\x4E\xA1\x92\xC4\x6C\xF0\x35\x83\xD9\x4F\xD9\x9C\x0A\x0D\x7A\xE7\xB1\x61\xF5\xC1\x2D\xDC\xC3\x0E\x87\xA6\x80\x15\x18\xBA\x7F\x72\xDD\x14\x75\x46\x44\x0B\xCA\x9C\x8F\x1C\x3C\xD7\xDA\x06\x62\x18\x7E\x15\x17\x24\xAB\x45\x21\x27\xC2\xBC\xBB\x86\x6E\xD8\xBD\x8E\x50\xE0\xE0\x88\xA4\x9B\x9D\x15\x2A\x98\xFF\x5E\x78\x6C\x81\xFC\xA8\xC9\xC8\xE6\x61\xC8\xD1\x4A\x7F\x81\xD6\xA6\x1A\xAD\x4C\xC1\xA2\x1C\x90\x68\x15\x2A\x8A\x36\xC0\x58\xC3\xCC\xA6\x54\x19\x12\x0F\xEB\x46\xFF\x6E\xE3\xA7\x92\xF8\xFF\x09\x00\xD0\x71\xF7\x9F\xF7\x6A\xD6\x2E"} err | ||
| 641 | assert_match "*Bad data format*" $err | ||
| 642 | r ping | ||
| 643 | } | ||
| 644 | } | ||
| 645 | |||
| 646 | test {corrupt payload: fuzzer findings - valgrind invalid read} { | ||
| 647 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 648 | r config set sanitize-dump-payload yes | ||
| 649 | r debug set-skip-checksum-validation 1 | ||
| 650 | catch {r RESTORE _key 0 "\x05\x0A\x02\x5F\x39\x00\x00\x00\x00\x00\x00\x22\x40\xC0\x08\x00\x00\x00\x00\x00\x00\x20\x40\x02\x5F\x37\x00\x00\x00\x00\x00\x00\x1C\x40\xC0\x06\x00\x00\x00\x00\x00\x00\x18\x40\x02\x5F\x33\x00\x00\x00\x00\x00\x00\x14\x40\xC0\x04\x00\x00\x00\x00\x00\x00\x10\x40\x02\x5F\x33\x00\x00\x00\x00\x00\x00\x08\x40\xC0\x02\x00\x00\x00\x00\x00\x00\x00\x40\x02\x5F\x31\x00\x00\x00\x00\x00\x00\xF0\x3F\xC0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x3C\x66\xD7\x14\xA9\xDA\x3C\x69"} err | ||
| 651 | assert_match "*Bad data format*" $err | ||
| 652 | r ping | ||
| 653 | } | ||
| 654 | } | ||
| 655 | |||
| 656 | test {corrupt payload: fuzzer findings - empty hash ziplist} { | ||
| 657 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 658 | r config set sanitize-dump-payload yes | ||
| 659 | r debug set-skip-checksum-validation 1 | ||
| 660 | catch {r RESTORE _int 0 "\x04\xC0\x01\x09\x00\xF6\x8A\xB6\x7A\x85\x87\x72\x4D"} err | ||
| 661 | assert_match "*Bad data format*" $err | ||
| 662 | r ping | ||
| 663 | } | ||
| 664 | } | ||
| 665 | |||
| 666 | test {corrupt payload: fuzzer findings - stream with no records} { | ||
| 667 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 668 | r config set sanitize-dump-payload no | ||
| 669 | r debug set-skip-checksum-validation 1 | ||
| 670 | r restore _stream 0 "\x0F\x01\x10\x00\x00\x01\x78\x4D\x55\x68\x09\x00\x00\x00\x00\x00\x00\x00\x00\x40\x42\x42\x00\x00\x00\x18\x00\x02\x01\x01\x01\x02\x01\x84\x69\x74\x65\x6D\x05\x85\x76\x61\x6C\x75\x65\x06\x00\x01\x02\x01\x00\x01\x00\x01\x01\x01\x00\x01\x05\x01\x03\x01\x3E\x01\x00\x01\x01\x01\x82\x5F\x31\x03\x05\x01\x02\x01\x50\x01\x00\x01\x01\x01\x02\x01\x05\x23\xFF\x02\x81\x00\x00\x01\x78\x4D\x55\x68\x59\x00\x01\x07\x6D\x79\x67\x72\x6F\x75\x70\x81\x00\x00\x01\x78\x4D\x55\x68\x47\x00\x01\x00\x00\x01\x78\x4D\x55\x68\x47\x00\x00\x00\x00\x00\x00\x00\x00\x9F\x68\x55\x4D\x78\x01\x00\x00\x01\x01\x05\x41\x6C\x69\x63\x65\x85\x68\x55\x4D\x78\x01\x00\x00\x01\x00\x00\x01\x78\x4D\x55\x68\x47\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\xF1\xC0\x72\x70\x39\x40\x1E\xA9" replace | ||
| 671 | catch {r XREAD STREAMS _stream $} | ||
| 672 | assert_equal [count_log_message 0 "crashed by signal"] 0 | ||
| 673 | assert_equal [count_log_message 0 "Guru Meditation"] 1 | ||
| 674 | } | ||
| 675 | } | ||
| 676 | |||
| 677 | test {corrupt payload: fuzzer findings - quicklist ziplist tail followed by extra data which start with 0xff} { | ||
| 678 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 679 | r config set sanitize-dump-payload yes | ||
| 680 | r debug set-skip-checksum-validation 1 | ||
| 681 | catch { | ||
| 682 | r restore key 0 "\x0E\x01\x11\x11\x00\x00\x00\x0A\x00\x00\x00\x01\x00\x00\xF6\xFF\xB0\x6C\x9C\xFF\x09\x00\x9C\x37\x47\x49\x4D\xDE\x94\xF5" replace | ||
| 683 | } err | ||
| 684 | assert_match "*Bad data format*" $err | ||
| 685 | verify_log_message 0 "*integrity check failed*" 0 | ||
| 686 | } | ||
| 687 | } | ||
| 688 | |||
| 689 | test {corrupt payload: fuzzer findings - dict init to huge size} { | ||
| 690 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 691 | r config set sanitize-dump-payload no | ||
| 692 | r debug set-skip-checksum-validation 1 | ||
| 693 | catch {r restore key 0 "\x02\x81\xC0\x00\x02\x5F\x31\xC0\x02\x09\x00\xB2\x1B\xE5\x17\x2E\x15\xF4\x6C" replace} err | ||
| 694 | assert_match "*Bad data format*" $err | ||
| 695 | r ping | ||
| 696 | } | ||
| 697 | } {} {tsan:skip} | ||
| 698 | |||
| 699 | test {corrupt payload: fuzzer findings - huge string} { | ||
| 700 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 701 | r config set sanitize-dump-payload yes | ||
| 702 | r debug set-skip-checksum-validation 1 | ||
| 703 | catch {r restore key 0 "\x00\x81\x01\x09\x00\xF6\x2B\xB6\x7A\x85\x87\x72\x4D"} err | ||
| 704 | assert_match "*Bad data format*" $err | ||
| 705 | r ping | ||
| 706 | } | ||
| 707 | } {} {tsan:skip} | ||
| 708 | |||
| 709 | test {corrupt payload: fuzzer findings - stream PEL without consumer} { | ||
| 710 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 711 | r config set sanitize-dump-payload yes | ||
| 712 | r debug set-skip-checksum-validation 1 | ||
| 713 | catch {r restore _stream 0 "\x0F\x01\x10\x00\x00\x01\x7B\x08\xF0\xB2\x34\x00\x00\x00\x00\x00\x00\x00\x00\xC3\x3B\x40\x42\x19\x42\x00\x00\x00\x18\x00\x02\x01\x01\x01\x02\x01\x84\x69\x74\x65\x6D\x05\x85\x76\x61\x6C\x75\x65\x06\x00\x20\x10\x00\x00\x20\x01\x00\x01\x20\x03\x02\x05\x01\x03\x20\x05\x40\x00\x04\x82\x5F\x31\x03\x05\x60\x19\x80\x32\x02\x05\x01\xFF\x02\x81\x00\x00\x01\x7B\x08\xF0\xB2\x34\x02\x01\x07\x6D\x79\x67\x72\x6F\x75\x70\x81\x00\x00\x01\x7B\x08\xF0\xB2\x34\x01\x01\x00\x00\x01\x7B\x08\xF0\xB2\x34\x00\x00\x00\x00\x00\x00\x00\x01\x35\xB2\xF0\x08\x7B\x01\x00\x00\x01\x01\x13\x41\x6C\x69\x63\x65\x35\xB2\xF0\x08\x7B\x01\x00\x00\x01\x00\x00\x01\x7B\x08\xF0\xB2\x34\x00\x00\x00\x00\x00\x00\x00\x01\x09\x00\x28\x2F\xE0\xC5\x04\xBB\xA7\x31"} err | ||
| 714 | assert_match "*Bad data format*" $err | ||
| 715 | r ping | ||
| 716 | } | ||
| 717 | } | ||
| 718 | |||
| 719 | test {corrupt payload: fuzzer findings - stream listpack valgrind issue} { | ||
| 720 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 721 | r config set sanitize-dump-payload no | ||
| 722 | r debug set-skip-checksum-validation 1 | ||
| 723 | r restore _stream 0 "\x0F\x01\x10\x00\x00\x01\x7B\x09\x5E\x94\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x40\x42\x42\x00\x00\x00\x18\x00\x02\x01\x01\x01\x02\x01\x84\x69\x74\x65\x6D\x05\x85\x76\x61\x6C\x75\x65\x06\x00\x01\x02\x01\x00\x01\x00\x01\x01\x01\x00\x01\x05\x01\x03\x01\x25\x01\x00\x01\x01\x01\x82\x5F\x31\x03\x05\x01\x02\x01\x32\x01\x00\x01\x01\x01\x02\x01\xF0\x01\xFF\x02\x81\x00\x00\x01\x7B\x09\x5E\x95\x31\x00\x01\x07\x6D\x79\x67\x72\x6F\x75\x70\x81\x00\x00\x01\x7B\x09\x5E\x95\x24\x00\x01\x00\x00\x01\x7B\x09\x5E\x95\x24\x00\x00\x00\x00\x00\x00\x00\x00\x5C\x95\x5E\x09\x7B\x01\x00\x00\x01\x01\x05\x41\x6C\x69\x63\x65\x4B\x95\x5E\x09\x7B\x01\x00\x00\x01\x00\x00\x01\x7B\x09\x5E\x95\x24\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\x19\x29\x94\xDF\x76\xF8\x1A\xC6" | ||
| 724 | catch {r XINFO STREAM _stream FULL } | ||
| 725 | assert_equal [count_log_message 0 "crashed by signal"] 0 | ||
| 726 | assert_equal [count_log_message 0 "ASSERTION FAILED"] 1 | ||
| 727 | } | ||
| 728 | } | ||
| 729 | |||
| 730 | test {corrupt payload: fuzzer findings - stream with bad lpFirst} { | ||
| 731 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 732 | r config set sanitize-dump-payload yes | ||
| 733 | r debug set-skip-checksum-validation 1 | ||
| 734 | catch {r restore _stream 0 "\x0F\x01\x10\x00\x00\x01\x7B\x0E\x52\xD2\xEC\x00\x00\x00\x00\x00\x00\x00\x00\x40\x42\x42\x00\x00\x00\x18\x00\x02\xF7\x01\x01\x02\x01\x84\x69\x74\x65\x6D\x05\x85\x76\x61\x6C\x75\x65\x06\x00\x01\x02\x01\x00\x01\x00\x01\x01\x01\x00\x01\x05\x01\x03\x01\x01\x01\x00\x01\x01\x01\x82\x5F\x31\x03\x05\x01\x02\x01\x01\x01\x01\x01\x01\x01\x02\x01\x05\x01\xFF\x02\x81\x00\x00\x01\x7B\x0E\x52\xD2\xED\x01\x01\x07\x6D\x79\x67\x72\x6F\x75\x70\x81\x00\x00\x01\x7B\x0E\x52\xD2\xED\x00\x01\x00\x00\x01\x7B\x0E\x52\xD2\xED\x00\x00\x00\x00\x00\x00\x00\x00\xED\xD2\x52\x0E\x7B\x01\x00\x00\x01\x01\x05\x41\x6C\x69\x63\x65\xED\xD2\x52\x0E\x7B\x01\x00\x00\x01\x00\x00\x01\x7B\x0E\x52\xD2\xED\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\xAC\x05\xC9\x97\x5D\x45\x80\xB3"} err | ||
| 735 | assert_match "*Bad data format*" $err | ||
| 736 | r ping | ||
| 737 | } | ||
| 738 | } | ||
| 739 | |||
| 740 | test {corrupt payload: fuzzer findings - stream listpack lpPrev valgrind issue} { | ||
| 741 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 742 | r config set sanitize-dump-payload no | ||
| 743 | r debug set-skip-checksum-validation 1 | ||
| 744 | r restore _stream 0 "\x0F\x01\x10\x00\x00\x01\x7B\x0E\xAE\x66\x36\x00\x00\x00\x00\x00\x00\x00\x00\x40\x42\x42\x00\x00\x00\x18\x00\x02\x01\x01\x01\x02\x01\x84\x69\x74\x65\x6D\x05\x85\x76\x61\x6C\x75\x65\x06\x00\x01\x02\x01\x00\x01\x00\x01\x01\x01\x00\x01\x1D\x01\x03\x01\x24\x01\x00\x01\x01\x69\x82\x5F\x31\x03\x05\x01\x02\x01\x33\x01\x00\x01\x01\x01\x02\x01\x05\x01\xFF\x02\x81\x00\x00\x01\x7B\x0E\xAE\x66\x69\x00\x01\x07\x6D\x79\x67\x72\x6F\x75\x70\x81\x00\x00\x01\x7B\x0E\xAE\x66\x5A\x00\x01\x00\x00\x01\x7B\x0E\xAE\x66\x5A\x00\x00\x00\x00\x00\x00\x00\x00\x94\x66\xAE\x0E\x7B\x01\x00\x00\x01\x01\x05\x41\x6C\x69\x63\x65\x83\x66\xAE\x0E\x7B\x01\x00\x00\x01\x00\x00\x01\x7B\x0E\xAE\x66\x5A\x00\x00\x00\x00\x00\x00\x00\x00\x09\x00\xD5\xD7\xA5\x5C\x63\x1C\x09\x40" | ||
| 745 | catch {r XREVRANGE _stream 1618622681 606195012389} | ||
| 746 | assert_equal [count_log_message 0 "crashed by signal"] 0 | ||
| 747 | assert_equal [count_log_message 0 "ASSERTION FAILED"] 1 | ||
| 748 | } | ||
| 749 | } | ||
| 750 | |||
| 751 | test {corrupt payload: fuzzer findings - stream with non-integer entry id} { | ||
| 752 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 753 | r config set sanitize-dump-payload yes | ||
| 754 | r debug set-skip-checksum-validation 1 | ||
| 755 | catch {r restore _streambig 0 "\x0F\x03\x10\x00\x00\x01\x7B\x13\x34\xC3\xB2\x00\x00\x00\x00\x00\x00\x00\x00\xC3\x40\x4F\x40\x5C\x18\x5C\x00\x00\x00\x24\x00\x05\x01\x00\x01\x02\x01\x84\x69\x74\x65\x6D\x05\x85\x76\x61\x6C\x75\x65\x06\x40\x10\x00\x80\x20\x01\x00\x01\x20\x03\x00\x05\x20\x1C\x40\x09\x05\x01\x01\x82\x5F\x31\x03\x80\x0D\x00\x02\x20\x0D\x00\x02\xA0\x19\x00\x03\x20\x0B\x02\x82\x5F\x33\xA0\x19\x00\x04\x20\x0D\x00\x04\x20\x19\x00\xFF\x10\x00\x00\x01\x7B\x13\x34\xC3\xB2\x00\x00\x00\x00\x00\x00\x00\x05\xC3\x40\x56\x40\x61\x18\x61\x00\x00\x00\x24\x00\x05\x01\x00\x01\x02\x01\x84\x69\x74\x65\x6D\x05\x85\x76\x61\x6C\x75\x65\x06\x40\x10\x00\x00\x20\x01\x06\x01\x01\x82\x5F\x35\x03\x05\x20\x1E\x40\x0B\x03\x01\x01\x06\x01\x40\x0B\x03\x01\x01\xDF\xFB\x20\x05\x02\x82\x5F\x37\x60\x1A\x20\x0E\x00\xFC\x20\x05\x00\x08\xC0\x1B\x00\xFD\x20\x0C\x02\x82\x5F\x39\x20\x1B\x00\xFF\x10\x00\x00\x01\x7B\x13\x34\xC3\xB3\x00\x00\x00\x00\x00\x00\x00\x03\xC3\x3D\x40\x4A\x18\x4A\x00\x00\x00\x15\x00\x02\x01\x00\x01\x02\x01\x84\x69\x74\x65\x6D\x05\x85\x76\x61\x6C\x75\x65\x06\x40\x10\x00\x00\x20\x01\x40\x00\x00\x05\x60\x07\x02\xDF\xFD\x02\xC0\x23\x09\x01\x01\x86\x75\x6E\x69\x71\x75\x65\x07\xA0\x2D\x02\x08\x01\xFF\x0C\x81\x00\x00\x01\x7B\x13\x34\xC3\xB4\x00\x00\x09\x00\x9D\xBD\xD5\xB9\x33\xC4\xC5\xFF"} err | ||
| 756 | assert_match "*Bad data format*" $err | ||
| 757 | r ping | ||
| 758 | } | ||
| 759 | } | ||
| 760 | |||
| 761 | test {corrupt payload: fuzzer findings - empty quicklist} { | ||
| 762 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 763 | r config set sanitize-dump-payload yes | ||
| 764 | r debug set-skip-checksum-validation 1 | ||
| 765 | catch { | ||
| 766 | r restore key 0 "\x0E\xC0\x2B\x15\x00\x00\x00\x0A\x00\x00\x00\x01\x00\x00\xE0\x62\x58\xEA\xDF\x22\x00\x00\x00\xFF\x09\x00\xDF\x35\xD2\x67\xDC\x0E\x89\xAB" replace | ||
| 767 | } err | ||
| 768 | assert_match "*Bad data format*" $err | ||
| 769 | r ping | ||
| 770 | } | ||
| 771 | } | ||
| 772 | |||
| 773 | test {corrupt payload: fuzzer findings - empty zset} { | ||
| 774 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 775 | r config set sanitize-dump-payload yes | ||
| 776 | r debug set-skip-checksum-validation 1 | ||
| 777 | catch {r restore key 0 "\x05\xC0\x01\x09\x00\xF6\x8A\xB6\x7A\x85\x87\x72\x4D"} err | ||
| 778 | assert_match "*Bad data format*" $err | ||
| 779 | r ping | ||
| 780 | } | ||
| 781 | } | ||
| 782 | |||
| 783 | test {corrupt payload: fuzzer findings - hash with len of 0} { | ||
| 784 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 785 | r config set sanitize-dump-payload yes | ||
| 786 | r debug set-skip-checksum-validation 1 | ||
| 787 | catch {r restore key 0 "\x04\xC0\x21\x09\x00\xF6\x8A\xB6\x7A\x85\x87\x72\x4D"} err | ||
| 788 | assert_match "*Bad data format*" $err | ||
| 789 | r ping | ||
| 790 | } | ||
| 791 | } | ||
| 792 | |||
| 793 | test {corrupt payload: fuzzer findings - hash listpack first element too long entry len} { | ||
| 794 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 795 | r debug set-skip-checksum-validation 1 | ||
| 796 | r config set sanitize-dump-payload yes | ||
| 797 | catch { r restore _hash 0 "\x10\x15\x15\x00\x00\x00\x06\x00\xF0\x01\x00\x01\x01\x01\x82\x5F\x31\x03\x02\x01\x02\x01\xFF\x0A\x00\x94\x21\x0A\xFA\x06\x52\x9F\x44" replace } err | ||
| 798 | assert_match "*Bad data format*" $err | ||
| 799 | verify_log_message 0 "*integrity check failed*" 0 | ||
| 800 | } | ||
| 801 | } | ||
| 802 | |||
| 803 | test {corrupt payload: fuzzer findings - stream double free listpack when insert dup node to rax returns 0} { | ||
| 804 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 805 | r debug set-skip-checksum-validation 1 | ||
| 806 | r config set sanitize-dump-payload yes | ||
| 807 | catch { r restore _stream 0 "\x0F\x03\x10\x00\x00\x01\x7B\x60\x5A\x23\x79\x00\x00\x00\x00\x00\x00\x00\x00\xC3\x40\x4F\x40\x5C\x18\x5C\x00\x00\x00\x24\x00\x05\x01\x00\x01\x02\x01\x84\x69\x74\x65\x6D\x05\x85\x76\x61\x6C\x75\x65\x06\x40\x10\x00\x00\x20\x01\x00\x01\x20\x03\x00\x05\x20\x1C\x40\x09\x05\x01\x01\x82\x5F\x31\x03\x80\x0D\x00\x02\x20\x0D\x00\x02\xA0\x19\x00\x03\x20\x0B\x02\x82\x5F\x33\xA0\x19\x00\x04\x20\x0D\x00\x04\x20\x19\x00\xFF\x10\x00\x00\x01\x7B\x60\x5A\x23\x79\x00\x00\x00\x00\x00\x00\x00\x05\xC3\x40\x51\x40\x5E\x18\x5E\x00\x00\x00\x24\x00\x05\x01\x00\x01\x02\x01\x84\x69\x74\x65\x6D\x05\x85\x76\x61\x6C\x75\x65\x06\x40\x10\x00\x00\x20\x01\x06\x01\x01\x82\x5F\x35\x03\x05\x20\x1E\x40\x0B\x03\x01\x01\x06\x01\x80\x0B\x00\x02\x20\x0B\x02\x82\x5F\x37\xA0\x19\x00\x03\x20\x0D\x00\x08\xA0\x19\x00\x04\x20\x0B\x02\x82\x5F\x39\x20\x19\x00\xFF\x10\x00\x00\x01\x7B\x60\x5A\x23\x79\x00\x00\x00\x00\x00\x00\x00\x00\xC3\x3B\x40\x49\x18\x49\x00\x00\x00\x15\x00\x02\x01\x00\x01\x02\x01\x84\x69\x74\x65\x6D\x05\x85\x76\x61\x6C\x75\x65\x06\x40\x10\x00\x00\x20\x01\x40\x00\x00\x05\x20\x07\x40\x09\xC0\x22\x09\x01\x01\x86\x75\x6E\x69\x71\x75\x65\x07\xA0\x2C\x02\x08\x01\xFF\x0C\x81\x00\x00\x01\x7B\x60\x5A\x23\x7A\x01\x00\x0A\x00\x9C\x8F\x1E\xBF\x2E\x05\x59\x09" replace } err | ||
| 808 | assert_match "*Bad data format*" $err | ||
| 809 | r ping | ||
| 810 | } | ||
| 811 | } | ||
| 812 | |||
| 813 | test {corrupt payload: fuzzer findings - LCS OOM} { | ||
| 814 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 815 | r SETRANGE _int 423324 1450173551 | ||
| 816 | catch {r LCS _int _int} err | ||
| 817 | assert_match "*Insufficient memory*" $err | ||
| 818 | r ping | ||
| 819 | } | ||
| 820 | } | ||
| 821 | |||
| 822 | test {corrupt payload: fuzzer findings - gcc asan reports false leak on assert} { | ||
| 823 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 824 | r debug set-skip-checksum-validation 1 | ||
| 825 | r config set sanitize-dump-payload no | ||
| 826 | catch { r restore _list 0 "\x12\x01\x02\x13\x13\x00\x00\x00\x10\x00\x00\x00\x03\x00\x00\xF3\xFE\x02\x5F\x31\x04\xF1\xFF\x0A\x00\x19\x8D\x3D\x74\x85\x94\x29\xBD" } | ||
| 827 | catch { r LPOP _list } err | ||
| 828 | assert_equal [count_log_message 0 "crashed by signal"] 0 | ||
| 829 | assert_equal [count_log_message 0 "ASSERTION FAILED"] 1 | ||
| 830 | } | ||
| 831 | } | ||
| 832 | |||
| 833 | test {corrupt payload: fuzzer findings - lpFind invalid access} { | ||
| 834 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 835 | r debug set-skip-checksum-validation 1 | ||
| 836 | r config set sanitize-dump-payload no | ||
| 837 | r restore _hashbig 0 "\x10\x39\x39\x00\x00\x00\x14\x00\x06\x01\x06\x01\x03\x01\x82\x5F\x33\x03\x07\x01\x82\x5F\x37\x03\x00\x01\x00\x01\x04\x01\x04\x01\x09\x01\x82\x5F\x39\x03\x05\x01\x82\x5F\x35\x03\x08\x01\x08\x01\x01\x01\x82\x5F\x31\x03\x02\x01\xF0\x01\xFF\x0A\x00\x29\xD7\xE4\x52\x79\x7A\x95\x82" | ||
| 838 | catch { r HLEN _hashbig } | ||
| 839 | catch { r HSETNX _hashbig 513072881620 "\x9A\x4B\x1F\xF2\x99\x74\x6E\x96\x84\x7F\xB9\x85\xBE\xD6\x1A\x93\x0A\xED\xAE\x19\xA0\x5A\x67\xD6\x89\xA8\xF9\xF2\xB8\xBD\x3E\x5A\xCF\xD2\x5B\x17\xA4\xBB\xB2\xA9\x56\x67\x6E\x0B\xED\xCD\x36\x49\xC6\x84\xFF\xC2\x76\x9B\xF3\x49\x88\x97\x92\xD2\x54\xE9\x08\x19\x86\x40\x96\x24\x68\x25\x9D\xF7\x0E\xB7\x36\x85\x68\x6B\x2A\x97\x64\x30\xE6\xFF\x9A\x2A\x42\x2B\x31\x01\x32\xB3\xEE\x78\x1A\x26\x94\xE2\x07\x34\x50\x8A\xFF\xF9\xAE\xEA\xEC\x59\x42\xF5\x39\x40\x65\xDE\x55\xCC\x77\x1B\x32\x02\x19\xEE\x3C\xD4\x79\x48\x01\x4F\x51\xFE\x22\xE0\x0C\xF4\x07\x06\xCD\x55\x30\xC0\x24\x32\xD4\xCC\xAF\x82\x05\x48\x14\x10\x55\xA1\x3D\xF6\x81\x45\x54\xEA\x71\x24\x27\x06\xDC\xFA\xE4\xE4\x87\xCC\x81\xA0\x47\xA5\xAF\xD1\x89\xE7\x42\xC3\x24\xD0\x32\x7A\xDE\x44\x47\x6E\x1F\xCB\xEE\xA6\x46\xDE\x0D\xE6\xD5\x16\x03\x2A\xD6\x9E\xFD\x94\x02\x2C\xDB\x1F\xD0\xBE\x98\x10\xE3\xEB\xEA\xBE\xE5\xD1" } | ||
| 840 | } | ||
| 841 | } | ||
| 842 | |||
| 843 | test {corrupt payload: fuzzer findings - invalid access in ziplist tail prevlen decoding} { | ||
| 844 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 845 | r debug set-skip-checksum-validation 1 | ||
| 846 | r config set sanitize-dump-payload no | ||
| 847 | catch {r restore _listbig 0 "\x0e\x02\x1B\x1B\x00\x00\x00\x16\x00\x00\x00\x05\x00\x00\x02\x5F\x39\x04\xF9\x02\x02\x5F\x37\x04\xF7\x02\x02\x5F\x35\xFF\x19\x19\x00\x00\x00\x16\x00\x00\x00\x05\x00\x00\xF5\x02\x02\x5F\x33\x04\xF3\x02\x02\x5F\x31\xFE\xF1\xFF\x0A\x00\x6B\x43\x32\x2F\xBB\x29\x0a\xBE"} err | ||
| 848 | assert_match "*Bad data format*" $err | ||
| 849 | r ping | ||
| 850 | } | ||
| 851 | } | ||
| 852 | |||
| 853 | test {corrupt payload: fuzzer findings - zset zslInsert with a NAN score} { | ||
| 854 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 855 | r config set sanitize-dump-payload no | ||
| 856 | r debug set-skip-checksum-validation 1 | ||
| 857 | catch {r restore _nan_zset 0 "\x05\x0A\x02\x5F\x39\x00\x00\x00\x00\x00\x00\x22\x40\xC0\x08\x00\x00\x00\x00\x00\x00\x20\x40\x02\x5F\x37\x00\x00\x00\x00\x00\x00\x1C\x40\xC0\x06\x00\x00\x00\x00\x00\x00\x18\x40\x02\x5F\x35\x00\x00\x00\x00\x00\x00\x14\x40\xC0\x04\x00\x00\x00\x00\x00\x00\x10\x40\x02\x5F\x33\x00\x00\x00\x00\x00\x00\x08\x40\xC0\x02\x00\x00\x00\x00\x00\x00\x00\x40\x02\x5F\x31\x00\x00\x00\x00\x00\x55\xF0\x7F\xC0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0A\x00\xEC\x94\x86\xD8\xFD\x5C\x5F\xD8"} err | ||
| 858 | assert_match "*Bad data format*" $err | ||
| 859 | r ping | ||
| 860 | } | ||
| 861 | } | ||
| 862 | |||
| 863 | test {corrupt payload: fuzzer findings - streamLastValidID panic} { | ||
| 864 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 865 | r config set sanitize-dump-payload yes | ||
| 866 | r debug set-skip-checksum-validation 1 | ||
| 867 | catch {r restore _streambig 0 "\x13\xC0\x10\x00\x00\x01\x80\x20\x48\xA0\x33\x00\x00\x00\x00\x00\x00\x00\x00\xC3\x40\x4F\x40\x5C\x18\x5C\x00\x00\x00\x24\x00\x05\x01\x00\x01\x02\x01\x84\x69\x74\x65\x6D\x05\x85\x76\x61\x6C\x75\x65\x06\x40\x10\x00\x00\x20\x01\x00\x01\x20\x03\x00\x05\x20\x1C\x40\x09\x05\x01\x01\x82\x5F\x31\x03\x80\x0D\x00\x02\x20\x0D\x00\x02\xA0\x19\x00\x03\x20\x0B\x02\x82\x5F\x33\x60\x19\x40\x2F\x02\x01\x01\x04\x20\x19\x00\xFF\x10\x00\x00\x01\x80\x20\x48\xA0\x34\x00\x00\x00\x00\x00\x00\x00\x01\xC3\x40\x51\x40\x5E\x18\x5E\x00\x00\x00\x24\x00\x05\x01\x00\x01\x02\x01\x84\x69\x74\x65\x6D\x05\x85\x76\x61\x6C\x75\x65\x06\x40\x10\x00\x00\x20\x01\x06\x01\x01\x82\x5F\x35\x03\x05\x20\x1E\x40\x0B\x03\x01\x01\x06\x01\x80\x0B\x00\x02\x20\x0B\x02\x82\x5F\x37\xA0\x19\x00\x03\x20\x0D\x00\x08\xA0\x19\x00\x04\x20\x0B\x02\x82\x5F\x39\x20\x19\x00\xFF\x10\x00\x00\x01\x80\x20\x48\xA0\x34\x00\x00\x00\x00\x00\x00\x00\x06\xC3\x3D\x40\x4A\x18\x4A\x00\x00\x00\x15\x00\x02\x01\x00\x01\x02\x01\x84\x69\x74\x65\x6D\x05\x85\x76\x61\x6C\x75\x65\x06\x40\x10\x00\x00\x20\x01\x40\x00\x00\x05\x60\x07\x02\xDF\xFA\x02\xC0\x23\x09\x01\x01\x86\x75\x6E\x69\x71\x75\x65\x07\xA0\x2D\x02\x08\x01\xFF\x0C\x81\x00\x00\x01\x80\x20\x48\xA0\x35\x00\x81\x00\x00\x01\x80\x20\x48\xA0\x33\x00\x00\x00\x0C\x00\x0A\x00\x34\x8B\x0E\x5B\x42\xCD\xD6\x08"} err | ||
| 868 | assert_match "*Bad data format*" $err | ||
| 869 | r ping | ||
| 870 | } | ||
| 871 | } | ||
| 872 | |||
| 873 | test {corrupt payload: fuzzer findings - valgrind fishy value warning} { | ||
| 874 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 875 | r config set sanitize-dump-payload yes | ||
| 876 | r debug set-skip-checksum-validation 1 | ||
| 877 | catch {r restore _key 0 "\x13\x01\x10\x00\x00\x01\x81\xCC\x07\xDC\xF2\x00\x00\x00\x00\x00\x00\x00\x00\x40\x42\x42\x00\x00\x00\x18\x00\x02\x01\x01\x01\x02\x01\x84\x69\x74\x65\x6D\x05\x85\x76\x61\x6C\x75\x65\x06\x00\x01\x02\x01\x00\x01\x00\x01\x01\x01\x00\x01\x05\x01\x03\x01\x2C\x01\x00\x01\x01\x01\x82\x5F\x31\x03\x05\x01\x02\x01\x3C\x01\x00\x01\x01\x01\x02\x01\x05\x01\xFF\x02\xD0\x00\x00\x01\x81\xCC\x07\xDD\x2E\x00\x81\x00\x00\x01\x81\xCC\x07\xDC\xF2\x00\x81\x00\x00\x01\x81\xCC\x07\xDD\x1E\x00\x03\x01\x07\x6D\x79\x67\x72\x6F\x75\x70\x81\x00\x00\x01\x81\xCC\x07\xDD\x1E\x00\x02\x01\x00\x00\x01\x81\xCC\x07\xDD\x1E\x00\x00\x00\x00\x00\x00\x00\x00\x71\xDD\x07\xCC\x81\x01\x00\x00\x01\x01\x05\x41\x6C\x69\x63\x65\x58\xDD\x07\xCC\x81\x01\x00\x00\x01\x00\x00\x01\x81\xCC\x07\xDD\x1E\x00\x00\x00\x00\x00\x00\x00\x00\x0A\x00\x2F\xB0\xD1\x15\x0A\x97\x87\x6B"} err | ||
| 878 | assert_match "*Bad data format*" $err | ||
| 879 | r ping | ||
| 880 | } | ||
| 881 | } | ||
| 882 | |||
| 883 | test {corrupt payload: fuzzer findings - empty set listpack} { | ||
| 884 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 885 | r config set sanitize-dump-payload no | ||
| 886 | r debug set-skip-checksum-validation 1 | ||
| 887 | 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 | ||
| 888 | assert_match "*Bad data format*" $err | ||
| 889 | r ping | ||
| 890 | } | ||
| 891 | } | ||
| 892 | |||
| 893 | test {corrupt payload: fuzzer findings - set with duplicate elements causes sdiff to hang} { | ||
| 894 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 895 | r config set sanitize-dump-payload yes | ||
| 896 | r debug set-skip-checksum-validation 1 | ||
| 897 | catch {r restore _key 0 "\x14\x25\x25\x00\x00\x00\x0A\x00\x06\x01\x82\x5F\x35\x03\x04\x01\x82\x5F\x31\x03\x82\x5F\x33\x03\x00\x01\x82\x5F\x39\x03\x82\x5F\x33\x03\x08\x01\x02\x01\xFF\x0B\x00\x31\xBE\x7D\x41\x01\x03\x5B\xEC" replace} err | ||
| 898 | assert_match "*Bad data format*" $err | ||
| 899 | r ping | ||
| 900 | |||
| 901 | # In the past, it generated a broken protocol and left the client hung in sdiff | ||
| 902 | r config set sanitize-dump-payload no | ||
| 903 | assert_equal {OK} [r restore _key 0 "\x14\x25\x25\x00\x00\x00\x0A\x00\x06\x01\x82\x5F\x35\x03\x04\x01\x82\x5F\x31\x03\x82\x5F\x33\x03\x00\x01\x82\x5F\x39\x03\x82\x5F\x33\x03\x08\x01\x02\x01\xFF\x0B\x00\x31\xBE\x7D\x41\x01\x03\x5B\xEC" replace] | ||
| 904 | assert_type set _key | ||
| 905 | assert_encoding listpack _key | ||
| 906 | assert_equal 10 [r scard _key] | ||
| 907 | assert_equal {0 2 4 6 8 _1 _3 _3 _5 _9} [lsort [r smembers _key]] | ||
| 908 | assert_equal {0 2 4 6 8 _1 _3 _5 _9} [lsort [r sdiff _key]] | ||
| 909 | } | ||
| 910 | } {} {logreqres:skip} ;# This test violates {"uniqueItems": true} | ||
| 911 | |||
| 912 | test {corrupt payload: fuzzer findings - set with invalid length causes smembers to hang} { | ||
| 913 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 914 | # In the past, it generated a broken protocol and left the client hung in smembers | ||
| 915 | r config set sanitize-dump-payload no | ||
| 916 | assert_equal {OK} [r restore _set 0 "\x14\x16\x16\x00\x00\x00\x0c\x00\x81\x61\x02\x81\x62\x02\x81\x63\x02\x01\x01\x02\x01\x03\x01\xff\x0c\x00\x91\x00\x56\x73\xc1\x82\xd5\xbd" replace] | ||
| 917 | assert_encoding listpack _set | ||
| 918 | catch { r SMEMBERS _set } err | ||
| 919 | assert_equal [count_log_message 0 "crashed by signal"] 0 | ||
| 920 | assert_equal [count_log_message 0 "ASSERTION FAILED"] 1 | ||
| 921 | } | ||
| 922 | } | ||
| 923 | |||
| 924 | test {corrupt payload: fuzzer findings - set with invalid length causes sscan to hang} { | ||
| 925 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 926 | # In the past, it generated a broken protocol and left the client hung in smembers | ||
| 927 | r config set sanitize-dump-payload no | ||
| 928 | assert_equal {OK} [r restore _set 0 "\x14\x16\x16\x00\x00\x00\x0c\x00\x81\x61\x02\x81\x62\x02\x81\x63\x02\x01\x01\x02\x01\x03\x01\xff\x0c\x00\x91\x00\x56\x73\xc1\x82\xd5\xbd" replace] | ||
| 929 | assert_encoding listpack _set | ||
| 930 | catch { r SSCAN _set 0 } err | ||
| 931 | assert_equal [count_log_message 0 "crashed by signal"] 0 | ||
| 932 | assert_equal [count_log_message 0 "ASSERTION FAILED"] 1 | ||
| 933 | } | ||
| 934 | } | ||
| 935 | |||
| 936 | test {corrupt payload: zset listpack encoded with invalid length causes zscan to hang} { | ||
| 937 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 938 | r config set sanitize-dump-payload no | ||
| 939 | assert_equal {OK} [r restore _zset 0 "\x11\x16\x16\x00\x00\x00\x1a\x00\x81\x61\x02\x01\x01\x81\x62\x02\x02\x01\x81\x63\x02\x03\x01\xff\x0c\x00\x81\xa7\xcd\x31\x22\x6c\xef\xf7" replace] | ||
| 940 | assert_encoding listpack _zset | ||
| 941 | catch { r ZSCAN _zset 0 } err | ||
| 942 | assert_equal [count_log_message 0 "crashed by signal"] 0 | ||
| 943 | assert_equal [count_log_message 0 "ASSERTION FAILED"] 1 | ||
| 944 | } | ||
| 945 | } | ||
| 946 | |||
| 947 | test {corrupt payload: hash listpack encoded with invalid length causes hscan to hang} { | ||
| 948 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 949 | r config set sanitize-dump-payload no | ||
| 950 | assert_equal {OK} [r restore _hash 0 "\x10\x17\x17\x00\x00\x00\x0e\x00\x82\x66\x31\x03\x82\x76\x31\x03\x82\x66\x32\x03\x82\x76\x32\x03\xff\x0c\x00\xf1\xc5\x36\x92\x29\x6a\x8c\xc5" replace] | ||
| 951 | assert_encoding listpack _hash | ||
| 952 | catch { r HSCAN _hash 0 } err | ||
| 953 | assert_equal [count_log_message 0 "crashed by signal"] 0 | ||
| 954 | assert_equal [count_log_message 0 "ASSERTION FAILED"] 1 | ||
| 955 | } | ||
| 956 | } | ||
| 957 | |||
| 958 | test {corrupt payload: fuzzer findings - vector sets with wrong encoding} { | ||
| 959 | start_server [list overrides [list loglevel verbose use-exit-on-panic yes crash-memcheck-enabled no] ] { | ||
| 960 | r config set sanitize-dump-payload yes | ||
| 961 | r debug set-skip-checksum-validation 1 | ||
| 962 | catch {r restore _key 0 "\x07\x81\xBD\xE7\x2D\xA2\xBB\x1E\xB4\x00\x02\x03\x02\x03\x02\x50\x8F\x02\x00\x05\xC0\x02\x05\x03\x7F\x7F\x7F\x02\x07\x02\x03\x02\x00\x02\x02\x02\x20\x02\x01\x02\x02\x02\x81\x3F\x13\xCD\x3A\x3F\xDD\xB3\xD7\x05\xC0\x01\x05\x03\x7F\x7F\x7F\x02\x0B\x02\x02\x02\x02\x02\x02\x02\x20\x02\x01\x02\x03\x02\x06\x02\x10\x02\x00\x02\x10\x02\x81\x3F\x13\xCD\x3A\x3F\xDD\xB3\xD7\x05\xC0\x00\x05\x03\x7F\x7F\x7F\x02\x07\x02\x01\x02\x00\x02\x02\x02\x20\x02\x02\x02\x03\x02\x81\x3F\x13\xCD\x3A\x3F\xDD\xB3\xD7\x00\x0C\x00\xC6\xA3\x70\x40\x02\x26\xE8\x9B"} err | ||
| 963 | assert_match "*Bad data format*" $err | ||
| 964 | r ping | ||
| 965 | } | ||
| 966 | } | ||
| 967 | |||
| 968 | |||
| 969 | } ;# tags | ||
| 970 | |||
