Skip to content

Commit cc7a177

Browse files
committed
refactor: zstd_uncompress_dict()
1 parent cdc42be commit cc7a177

1 file changed

Lines changed: 42 additions & 21 deletions

File tree

zstd.c

Lines changed: 42 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -345,51 +345,72 @@ ZEND_FUNCTION(zstd_uncompress_dict)
345345
{
346346
char *input, *dict;
347347
size_t input_len, dict_len;
348+
uint8_t streaming = 0;
348349
zend_string *output;
350+
size_t result;
351+
unsigned long long size;
352+
ZSTD_DDict *ddict;
353+
ZSTD_DCtx *dctx;
349354

350355
ZEND_PARSE_PARAMETERS_START(2, 2)
351356
Z_PARAM_STRING(input, input_len)
352357
Z_PARAM_STRING(dict, dict_len)
353358
ZEND_PARSE_PARAMETERS_END();
354359

355-
unsigned long long const rSize = ZSTD_getFrameContentSize(input,
356-
input_len);
357-
358-
if (rSize == 0 || rSize == ZSTD_CONTENTSIZE_ERROR) {
360+
size = ZSTD_getFrameContentSize(input, input_len);
361+
if (size == 0) {
362+
RETURN_EMPTY_STRING();
363+
} else if (size == ZSTD_CONTENTSIZE_ERROR) {
359364
ZSTD_WARNING("it was not compressed by zstd");
360365
RETURN_FALSE;
366+
} else if (size == ZSTD_CONTENTSIZE_UNKNOWN) {
367+
streaming = 1;
368+
size = input_len + ZSTD_DStreamOutSize();
361369
}
362370

363-
ZSTD_DCtx* const dctx = ZSTD_createDCtx();
364-
if (dctx == NULL) {
365-
ZSTD_WARNING("ZSTD_createDCtx() error");
366-
RETURN_FALSE;
367-
}
368-
ZSTD_DDict* const ddict = ZSTD_createDDict(dict,
369-
dict_len);
371+
ddict = ZSTD_createDDict(dict, dict_len);
370372
if (!ddict) {
371-
ZSTD_freeDStream(dctx);
372373
ZSTD_WARNING("ZSTD_createDDict() error");
373374
RETURN_FALSE;
374375
}
375376

376-
output = zend_string_alloc(rSize, 0);
377+
output = zend_string_alloc(size, 0);
377378

378-
size_t const dSize = ZSTD_decompress_usingDDict(dctx, ZSTR_VAL(output), rSize,
379-
input,
380-
input_len,
381-
ddict);
382-
if (dSize != rSize) {
383-
ZSTD_freeDStream(dctx);
379+
dctx = ZSTD_createDCtx();
380+
if (dctx == NULL) {
381+
zend_string_efree(output);
384382
ZSTD_freeDDict(ddict);
383+
ZSTD_WARNING("ZSTD_createDCtx() error");
384+
RETURN_FALSE;
385+
}
386+
387+
if (!streaming) {
388+
result = ZSTD_decompress_usingDDict(dctx, ZSTR_VAL(output), size,
389+
input, input_len, ddict);
390+
if (ZSTD_IS_ERROR(result)) {
391+
zend_string_efree(output);
392+
ZSTD_freeDCtx(dctx);
393+
ZSTD_freeDDict(ddict);
394+
ZSTD_WARNING("%s", ZSTD_getErrorName(result));
395+
RETURN_FALSE;
396+
} else if (result != size) {
397+
zend_string_efree(output);
398+
ZSTD_freeDCtx(dctx);
399+
ZSTD_freeDDict(ddict);
400+
ZSTD_WARNING("failed to decompress");
401+
RETURN_FALSE;
402+
}
403+
} else {
385404
zend_string_efree(output);
386-
ZSTD_WARNING("%s", ZSTD_getErrorName(dSize));
405+
ZSTD_freeDDict(ddict);
406+
ZSTD_WARNING("can not decompress stream");
387407
RETURN_FALSE;
388408
}
409+
389410
ZSTD_freeDCtx(dctx);
390411
ZSTD_freeDDict(ddict);
391412

392-
output = zstd_string_output_truncate(output, dSize);
413+
output = zstd_string_output_truncate(output, result);
393414
RETVAL_NEW_STR(output);
394415
}
395416

0 commit comments

Comments
 (0)