8000 Fix ZSTD decompression on bad data. · phpredis/phpredis@c48b3a2 · GitHub
[go: up one dir, main page]

Skip to content

Commit c48b3a2

Browse files
Fix ZSTD decompression on bad data.
ZSTD uses two defined error numbers to inform the caller when the compressed data is invalid (e.g. wrong magic number) or the size is unknown. We should always know the size so abort if ZSTD returns either to us. Fixes: #1936
1 parent edc724e commit c48b3a2

File tree

2 files changed

+10
-1
lines changed

2 files changed

+10
-1
lines changed

library.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2877,7 +2877,8 @@ redis_unpack(RedisSock *redis_sock, const char *val, int val_len, zval *z_ret)
28772877
size_t len;
28782878

28792879
len = ZSTD_getFrameContentSize(val, val_len);
2880-
if (len >= 0) {
2880+
2881+
if (len != ZSTD_CONTENTSIZE_ERROR && len != ZSTD_CONTENTSIZE_UNKNOWN) {
28812882
data = emalloc(len);
28822883
len = ZSTD_decompress(data, len, val, val_len);
28832884
if (ZSTD_isError(len)) {

tests/RedisTest.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4573,6 +4573,14 @@ public function testCompressionZSTD()
45734573
if (!defined('Redis::COMPRESSION_ZSTD')) {
45744574
$this->markTestSkipped();
45754575
}
4576+
4577+
/* Issue 1936 regression. Make sure we don't overflow on bad data */
4578+
$this->redis->del('badzstd');
4579+
$this->redis->set('badzstd', '123');
4580+
$this->redis->setOption(Redis::OPT_COMPRESSION, Redis::COMPRESSION_ZSTD);
4581+
$this->assertEquals('123', $this->redis->get('badzstd'));
4582+
$this->redis->setOption(Redis::OPT_COMPRESSION, Redis::COMPRESSION_NONE);
4583+
45764584
$this->checkCompression(Redis::COMPRESSION_ZSTD, 0);
45774585
$this->checkCompression(Redis::COMPRESSION_ZSTD, 9);
45784586
}

0 commit comments

Comments
 (0)
0