diff options
author | michael-grunder <michael.grunder@gmail.com> | 2013-03-16 03:34:05 +0400 |
---|---|---|
committer | michael-grunder <michael.grunder@gmail.com> | 2013-03-16 03:34:05 +0400 |
commit | a4627bb94bdf84fec158c6a8b628f2dbe70399d8 (patch) | |
tree | f3de177252e0bd21cff66de4e9a0e7752a8d5bf7 /library.c | |
parent | 5e5fa7895f1483e9b3577f2107e10698e225a485 (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.c | 7 |
1 files changed, 4 insertions, 3 deletions
@@ -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; |