Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/phpredis/phpredis.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormichael-grunder <michael.grunder@gmail.com>2013-03-16 03:34:05 +0400
committermichael-grunder <michael.grunder@gmail.com>2013-03-16 03:34:05 +0400
commita4627bb94bdf84fec158c6a8b628f2dbe70399d8 (patch)
treef3de177252e0bd21cff66de4e9a0e7752a8d5bf7 /library.c
parent5e5fa7895f1483e9b3577f2107e10698e225a485 (diff)
Fixes a memory leak, and possible undefined behavior if we have
a serialization failure and just return the raw contents of a key. Addresses issue #315
Diffstat (limited to 'library.c')
-rw-r--r--library.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/library.c b/library.c
index 5018a365..856a8055 100644
--- a/library.c
+++ b/library.c
@@ -808,7 +808,7 @@ PHPAPI void redis_string_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis
}
} else {
if(redis_unserialize(redis_sock, response, response_len, &return_value TSRMLS_CC) == 0) {
- RETURN_STRINGL(response, response_len, 0);
+ RETURN_STRINGL(response, response_len, 0);
} else {
efree(response);
}
@@ -1367,7 +1367,7 @@ PHPAPI int
redis_unserialize(RedisSock *redis_sock, const char *val, int val_len, zval **return_value TSRMLS_DC) {
php_unserialize_data_t var_hash;
- int ret;
+ int ret, rv_free = 0;
switch(redis_sock->serializer) {
case REDIS_SERIALIZER_NONE:
@@ -1376,6 +1376,7 @@ redis_unserialize(RedisSock *redis_sock, const char *val, int val_len, zval **re
case REDIS_SERIALIZER_PHP:
if(!*return_value) {
MAKE_STD_ZVAL(*return_value);
+ rv_free = 1;
}
#if ZEND_MODULE_API_NO >= 20100000
PHP_VAR_UNSERIALIZE_INIT(var_hash);
@@ -1384,7 +1385,7 @@ redis_unserialize(RedisSock *redis_sock, const char *val, int val_len, zval **re
#endif
if(!php_var_unserialize(return_value, (const unsigned char**)&val,
(const unsigned char*)val + val_len, &var_hash TSRMLS_CC)) {
- efree(*return_value);
+ if(rv_free==1) efree(*return_value);
ret = 0;
} else {
ret = 1;