Skip to content

Commit 8924e3d

Browse files
dictcpsodabrew
authored andcommitted
fix: compression edge case (#255)
* correct the compression_factor calculation * send uncompress value and proper set compressed flags when compression saving is too small
1 parent e1932dc commit 8924e3d

File tree

1 file changed

+6
-5
lines changed

1 file changed

+6
-5
lines changed

php_memcached.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -108,10 +108,10 @@ static int php_memc_list_entry(void) {
108108
#define MEMC_VAL_COMPRESSION_ZLIB (1<<1)
109109
#define MEMC_VAL_COMPRESSION_FASTLZ (1<<2)
110110

111-
#define MEMC_VAL_GET_FLAGS(internal_flags) ((internal_flags & MEMC_MASK_INTERNAL) >> 4)
112-
#define MEMC_VAL_SET_FLAG(internal_flags, internal_flag) ((internal_flags) |= ((internal_flag << 4) & MEMC_MASK_INTERNAL))
113-
#define MEMC_VAL_HAS_FLAG(internal_flags, internal_flag) ((MEMC_VAL_GET_FLAGS(internal_flags) & internal_flag) == internal_flag)
114-
#define MEMC_VAL_DEL_FLAG(internal_flags, internal_flag) internal_flags &= ~((internal_flag << 4) & MEMC_MASK_INTERNAL)
111+
#define MEMC_VAL_GET_FLAGS(internal_flags) (((internal_flags) & MEMC_MASK_INTERNAL) >> 4)
112+
#define MEMC_VAL_SET_FLAG(internal_flags, internal_flag) ((internal_flags) |= (((internal_flag) << 4) & MEMC_MASK_INTERNAL))
113+
#define MEMC_VAL_HAS_FLAG(internal_flags, internal_flag) ((MEMC_VAL_GET_FLAGS(internal_flags) & (internal_flag)) == (internal_flag))
114+
#define MEMC_VAL_DEL_FLAG(internal_flags, internal_flag) (internal_flags &= (~(((internal_flag) << 4) & MEMC_MASK_INTERNAL)))
115115

116116
/****************************************
117117
User-defined flags
@@ -876,7 +876,8 @@ zend_bool s_compress_value (php_memc_compression_type compression_type, zend_str
876876
}
877877

878878
/* This means the value was too small to be compressed, still a success */
879-
if (compressed_size > (ZSTR_LEN(payload) * MEMC_G(compression_factor))) {
879+
if (ZSTR_LEN(payload) <= (compressed_size * MEMC_G(compression_factor))) {
880+
MEMC_VAL_DEL_FLAG(*flags, MEMC_VAL_COMPRESSION_FASTLZ | MEMC_VAL_COMPRESSION_ZLIB);
880881
efree (buffer);
881882
return 1;
882883
}

0 commit comments

Comments
 (0)