Skip to content

Commit b9a16b5

Browse files
committed
revert previous, and better fix for memory corruption (STR_FREE available since 5.0)
1 parent d74b0d2 commit b9a16b5

File tree

2 files changed

+24
-28
lines changed

2 files changed

+24
-28
lines changed

library.c

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1562,11 +1562,6 @@ redis_serialize(RedisSock *redis_sock, zval *z, char **val, int *val_len TSRMLS_
15621562
ZVAL_STRINGL(z_copy, "Array", 5, 1);
15631563
break;
15641564

1565-
case IS_NULL:
1566-
MAKE_STD_ZVAL(z_copy);
1567-
ZVAL_STRINGL(z_copy, "", 0, 1);
1568-
break;
1569-
15701565
default: /* copy */
15711566
MAKE_STD_ZVAL(z_copy);
15721567
*z_copy = *z;

redis.c

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -990,7 +990,7 @@ PHP_METHOD(Redis, set) {
990990

991991
/* Free our key or value if we prefixed/serialized */
992992
if(key_free) efree(key);
993-
if(val_free) efree(val);
993+
if(val_free) STR_FREE(val);
994994

995995
/* Kick off the command */
996996
REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len);
@@ -1023,7 +1023,7 @@ PHPAPI void redis_generic_setex(INTERNAL_FUNCTION_PARAMETERS, char *keyword) {
10231023
val_free = redis_serialize(redis_sock, z_value, &val, &val_len TSRMLS_CC);
10241024
key_free = redis_key_prefix(redis_sock, &key, &key_len TSRMLS_CC);
10251025
cmd_len = redis_cmd_format_static(&cmd, keyword, "sls", key, key_len, expire, val, val_len);
1026-
if(val_free) efree(val);
1026+
if(val_free) STR_FREE(val);
10271027
if(key_free) efree(key);
10281028

10291029
REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len);
@@ -1072,7 +1072,7 @@ PHP_METHOD(Redis, setnx)
10721072
val_free = redis_serialize(redis_sock, z_value, &val, &val_len TSRMLS_CC);
10731073
key_free = redis_key_prefix(redis_sock, &key, &key_len TSRMLS_CC);
10741074
cmd_len = redis_cmd_format_static(&cmd, "SETNX", "ss", key, key_len, val, val_len);
1075-
if(val_free) efree(val);
1075+
if(val_free) STR_FREE(val);
10761076
if(key_free) efree(key);
10771077

10781078
REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len);
@@ -1110,7 +1110,7 @@ PHP_METHOD(Redis, getSet)
11101110
val_free = redis_serialize(redis_sock, z_value, &val, &val_len TSRMLS_CC);
11111111
key_free = redis_key_prefix(redis_sock, &key, &key_len TSRMLS_CC);
11121112
cmd_len = redis_cmd_format_static(&cmd, "GETSET", "ss", key, key_len, val, val_len);
1113-
if(val_free) efree(val);
1113+
if(val_free) STR_FREE(val);
11141114
if(key_free) efree(key);
11151115

11161116
REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len);
@@ -1928,7 +1928,7 @@ generic_push_function(INTERNAL_FUNCTION_PARAMETERS, char *keyword, int keyword_l
19281928
val_free = redis_serialize(redis_sock, z_value, &val, &val_len TSRMLS_CC);
19291929
key_free = redis_key_prefix(redis_sock, &key, &key_len TSRMLS_CC);
19301930
cmd_len = redis_cmd_format_static(&cmd, keyword, "ss", key, key_len, val, val_len);
1931-
if(val_free) efree(val);
1931+
if(val_free) STR_FREE(val);
19321932
if(key_free) efree(key);
19331933

19341934
REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len);
@@ -2004,9 +2004,9 @@ PHP_METHOD(Redis, lInsert)
20042004
val_free = redis_serialize(redis_sock, z_value, &val, &val_len TSRMLS_CC);
20052005
pivot_free = redis_serialize(redis_sock, z_pivot, &pivot, &pivot_len TSRMLS_CC);
20062006
cmd_len = redis_cmd_format_static(&cmd, "LINSERT", "ssss", key, key_len, position, position_len, pivot, pivot_len, val, val_len);
2007-
if(val_free) efree(val);
2007+
if(val_free) STR_FREE(val);
20082008
if(key_free) efree(key);
2009-
if(pivot_free) efree(pivot);
2009+
if(pivot_free) STR_FREE(pivot);
20102010

20112011
REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len);
20122012
IF_ATOMIC() {
@@ -2178,7 +2178,7 @@ PHP_METHOD(Redis, lRemove)
21782178
val_free = redis_serialize(redis_sock, z_value, &val, &val_len TSRMLS_CC);
21792179
key_free = redis_key_prefix(redis_sock, &key, &key_len TSRMLS_CC);
21802180
cmd_len = redis_cmd_format_static(&cmd, "LREM", "sds", key, key_len, count, val, val_len);
2181-
if(val_free) efree(val);
2181+
if(val_free) STR_FREE(val);
21822182
if(key_free) efree(key);
21832183

21842184
REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len);
@@ -2382,7 +2382,7 @@ PHP_METHOD(Redis, sMove)
23822382
src_free = redis_key_prefix(redis_sock, &src, &src_len TSRMLS_CC);
23832383
dst_free = redis_key_prefix(redis_sock, &dst, &dst_len TSRMLS_CC);
23842384
cmd_len = redis_cmd_format_static(&cmd, "SMOVE", "sss", src, src_len, dst, dst_len, val, val_len);
2385-
if(val_free) efree(val);
2385+
if(val_free) STR_FREE(val);
23862386
if(src_free) efree(src);
23872387
if(dst_free) efree(dst);
23882388

@@ -2488,7 +2488,7 @@ PHP_METHOD(Redis, sContains)
24882488
val_free = redis_serialize(redis_sock, z_value, &val, &val_len TSRMLS_CC);
24892489
key_free = redis_key_prefix(redis_sock, &key, &key_len TSRMLS_CC);
24902490
cmd_len = redis_cmd_format_static(&cmd, "SISMEMBER", "ss", key, key_len, val, val_len);
2491-
if(val_free) efree(val);
2491+
if(val_free) STR_FREE(val);
24922492
if(key_free) efree(key);
24932493

24942494
REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len);
@@ -2716,7 +2716,7 @@ PHPAPI int generic_multiple_args_cmd(INTERNAL_FUNCTION_PARAMETERS, char *keyword
27162716
/* cleanup prefixed keys. */
27172717
for(i = 0; i < real_argc + (has_timeout?-1:0); ++i) {
27182718
if(keys_to_free[i])
2719-
efree(keys[i]);
2719+
STR_FREE(keys[i]);
27202720
}
27212721
if(single_array && has_timeout) { /* cleanup string created to contain timeout value */
27222722
efree(keys[real_argc-1]);
@@ -3362,7 +3362,7 @@ PHP_METHOD(Redis, lSet) {
33623362
val_free = redis_serialize(redis_sock, z_value, &val, &val_len TSRMLS_CC);
33633363
key_free = redis_key_prefix(redis_sock, &key, &key_len TSRMLS_CC);
33643364
cmd_len = redis_cmd_format_static(&cmd, "LSET", "sds", key, key_len, index, val, val_len);
3365-
if(val_free) efree(val);
3365+
if(val_free) STR_FREE(val);
33663366
if(key_free) efree(key);
33673367

33683368
REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len);
@@ -3782,7 +3782,7 @@ generic_mset(INTERNAL_FUNCTION_PARAMETERS, char *kw, void (*fun)(INTERNAL_FUNCTI
37823782
memcpy(p, _NL, 2); p += 2;
37833783
}
37843784

3785-
if(val_free) efree(val);
3785+
if(val_free) STR_FREE(val);
37863786
if(key_free) efree(key);
37873787
}
37883788
}
@@ -3964,7 +3964,7 @@ PHP_METHOD(Redis, zAdd) {
39643964
smart_str_appendl(&buf, val, val_len);
39653965
smart_str_appendl(&buf, _NL, sizeof(_NL) - 1);
39663966

3967-
if(val_free) efree(val);
3967+
if(val_free) STR_FREE(val);
39683968
}
39693969

39703970
/* end string */
@@ -4361,7 +4361,7 @@ PHP_METHOD(Redis, zScore)
43614361
val_free = redis_serialize(redis_sock, z_value, &val, &val_len TSRMLS_CC);
43624362
key_free = redis_key_prefix(redis_sock, &key, &key_len TSRMLS_CC);
43634363
cmd_len = redis_cmd_format_static(&cmd, "ZSCORE", "ss", key, key_len, val, val_len);
4364-
if(val_free) efree(val);
4364+
if(val_free) STR_FREE(val);
43654365
if(key_free) efree(key);
43664366

43674367
REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len);
@@ -4394,7 +4394,7 @@ PHPAPI void generic_rank_method(INTERNAL_FUNCTION_PARAMETERS, char *keyword, int
43944394
val_free = redis_serialize(redis_sock, z_value, &val, &val_len TSRMLS_CC);
43954395
key_free = redis_key_prefix(redis_sock, &key, &key_len TSRMLS_CC);
43964396
cmd_len = redis_cmd_format_static(&cmd, keyword, "ss", key, key_len, val, val_len);
4397-
if(val_free) efree(val);
4397+
if(val_free) STR_FREE(val);
43984398
if(key_free) efree(key);
43994399

44004400
REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len);
@@ -4444,7 +4444,7 @@ PHPAPI void generic_incrby_method(INTERNAL_FUNCTION_PARAMETERS, char *keyword, i
44444444
val_free = redis_serialize(redis_sock, z_value, &val, &val_len TSRMLS_CC);
44454445
key_free = redis_key_prefix(redis_sock, &key, &key_len TSRMLS_CC);
44464446
cmd_len = redis_cmd_format_static(&cmd, keyword, "sfs", key, key_len, add, val, val_len);
4447-
if(val_free) efree(val);
4447+
if(val_free) STR_FREE(val);
44484448
if(key_free) efree(key);
44494449

44504450
REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len);
@@ -4659,7 +4659,7 @@ generic_hset(INTERNAL_FUNCTION_PARAMETERS, char *kw, void (*fun)(INTERNAL_FUNCTI
46594659
val_free = redis_serialize(redis_sock, z_value, &val, &val_len TSRMLS_CC);
46604660
key_free = redis_key_prefix(redis_sock, &key, &key_len TSRMLS_CC);
46614661
cmd_len = redis_cmd_format_static(&cmd, kw, "sss", key, key_len, member, member_len, val, val_len);
4662-
if(val_free) efree(val);
4662+
if(val_free) STR_FREE(val);
46634663
if(key_free) efree(key);
46644664

46654665
REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len);
@@ -5179,7 +5179,7 @@ PHP_METHOD(Redis, hMset)
51795179
redis_cmd_append_sstr(&set_cmds, hkey, hkey_len - 1);
51805180
redis_cmd_append_sstr(&set_cmds, hval, hval_len);
51815181

5182-
if(hval_free) efree(hval);
5182+
if(hval_free) STR_FREE(hval);
51835183
}
51845184

51855185
// Now construct the entire command
@@ -6685,7 +6685,7 @@ PHP_METHOD(Redis, _serialize) {
66856685
RedisSock *redis_sock;
66866686
zval *z_val;
66876687
char *val;
6688-
int val_free, val_len;
6688+
int val_len;
66896689

66906690
// Parse arguments
66916691
if(zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oz",
@@ -6700,10 +6700,11 @@ PHP_METHOD(Redis, _serialize) {
67006700
}
67016701

67026702
// Serialize, which will return a value even if no serializer is set
6703-
val_free = redis_serialize(redis_sock, z_val, &val, &val_len TSRMLS_CC);
6703+
redis_serialize(redis_sock, z_val, &val, &val_len TSRMLS_CC);
67046704

6705-
// Return serialized value. Tell PHP to make a copy if redis_serialize didn't.
6706-
RETURN_STRINGL(val, val_len, !val_free);
6705+
// Return serialized value. Tell PHP to make a copy as some can be interned.
6706+
RETVAL_STRINGL(val, val_len, 1);
6707+
STR_FREE(val);
67076708
}
67086709

67096710
/*

0 commit comments

Comments
 (0)