@@ -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