@@ -830,6 +830,7 @@ zend_bool s_compress_value (php_memc_compression_type compression_type, zend_str
830
830
/* status */
831
831
zend_bool compress_status = 0 ;
832
832
zend_string * payload = * payload_in ;
833
+ uint32_t compression_type_flag = 0 ;
833
834
834
835
/* Additional 5% for the data */
835
836
size_t buffer_size = (size_t ) (((double ) ZSTR_LEN (payload ) * 1.05 ) + 1.0 );
@@ -847,7 +848,7 @@ zend_bool s_compress_value (php_memc_compression_type compression_type, zend_str
847
848
848
849
if (compressed_size > 0 ) {
849
850
compress_status = 1 ;
850
- MEMC_VAL_SET_FLAG ( * flags , MEMC_VAL_COMPRESSION_FASTLZ ) ;
851
+ compression_type_flag = MEMC_VAL_COMPRESSION_FASTLZ ;
851
852
}
852
853
}
853
854
break ;
@@ -859,7 +860,7 @@ zend_bool s_compress_value (php_memc_compression_type compression_type, zend_str
859
860
860
861
if (status == Z_OK ) {
861
862
compress_status = 1 ;
862
- MEMC_VAL_SET_FLAG ( * flags , MEMC_VAL_COMPRESSION_ZLIB ) ;
863
+ compression_type_flag = MEMC_VAL_COMPRESSION_ZLIB ;
863
864
}
864
865
}
865
866
break ;
@@ -869,31 +870,29 @@ zend_bool s_compress_value (php_memc_compression_type compression_type, zend_str
869
870
break ;
870
871
}
871
872
872
- if (!compress_status ) {
873
- php_error_docref (NULL , E_WARNING , "could not compress value" );
874
- efree (buffer );
875
- return 0 ;
876
- }
877
-
878
- /* This means the value was too small to be compressed, still a success */
873
+ /* This means the value was too small to be compressed and ended up larger */
879
874
if (ZSTR_LEN (payload ) <= (compressed_size * MEMC_G (compression_factor ))) {
880
- MEMC_VAL_DEL_FLAG (* flags , MEMC_VAL_COMPRESSION_FASTLZ | MEMC_VAL_COMPRESSION_ZLIB );
881
- efree (buffer );
882
- return 1 ;
875
+ compress_status = 0 ;
883
876
}
884
877
885
- MEMC_VAL_SET_FLAG (* flags , MEMC_VAL_COMPRESSED );
878
+ /* Replace the payload with the compressed copy */
879
+ if (compress_status ) {
880
+ MEMC_VAL_SET_FLAG (* flags , MEMC_VAL_COMPRESSED | compression_type_flag );
881
+ payload = zend_string_realloc (payload , compressed_size + sizeof (uint32_t ), 0 );
886
882
887
- payload = zend_string_realloc (payload , compressed_size + sizeof (uint32_t ), 0 );
883
+ /* Copy the uin32_t at the beginning */
884
+ memcpy (ZSTR_VAL (payload ), & original_size , sizeof (uint32_t ));
885
+ memcpy (ZSTR_VAL (payload ) + sizeof (uint32_t ), buffer , compressed_size );
886
+ efree (buffer );
888
887
889
- /* Copy the uin32_t at the beginning */
890
- memcpy (ZSTR_VAL (payload ), & original_size , sizeof (uint32_t ));
891
- memcpy (ZSTR_VAL (payload ) + sizeof (uint32_t ), buffer , compressed_size );
892
- efree (buffer );
888
+ zend_string_forget_hash_val (payload );
889
+ * payload_in = payload ;
893
890
894
- zend_string_forget_hash_val (payload );
895
- * payload_in = payload ;
896
- return 1 ;
891
+ return 1 ;
892
+ }
893
+
894
+ /* Original payload was not modified */
895
+ return 0 ;
897
896
}
898
897
899
898
static
@@ -1043,11 +1042,13 @@ zend_string *s_zval_to_payload(php_memc_object_t *intern, zval *value, uint32_t
1043
1042
1044
1043
/* If we have compression flag, compress the value */
1045
1044
if (should_compress ) {
1046
- /* status */
1047
- if (!s_compress_value (memc_user_data -> compression_type , & payload , flags )) {
1048
- zend_string_release (payload );
1049
- return NULL ;
1050
- }
1045
+ /* s_compress_value() will always leave a valid payload, even if that payload
1046
+ * did not actually get compressed. The flags will be set according to the
1047
+ * to the compression type or no compression.
1048
+ *
1049
+ * No need to check the return value because the payload is always valid.
1050
+ */
1051
+ (void )s_compress_value (memc_user_data -> compression_type , & payload , flags );
1051
1052
}
1052
1053
1053
1054
if (memc_user_data -> set_udf_flags >= 0 ) {
0 commit comments