Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit d9cb594

Browse files
committed
Fix redis_sock_read_multibulk_multi_reply_loop logic
1 parent e571a81 commit d9cb594

2 files changed

Lines changed: 22 additions & 28 deletions

File tree

php_redis.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,7 @@ PHP_REDIS_API int redis_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent);
5050
PHP_REDIS_API int redis_response_enqueued(RedisSock *redis_sock);
5151

5252
PHP_REDIS_API int redis_sock_read_multibulk_multi_reply_loop(
53-
INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab,
54-
int numElems);
53+
INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab);
5554

5655
extern zend_module_entry redis_module_entry;
5756

redis.c

Lines changed: 21 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2021,32 +2021,25 @@ PHP_METHOD(Redis, discard)
20212021
RETURN_FALSE;
20222022
}
20232023

2024-
/* redis_sock_read_multibulk_multi_reply */
2025-
PHP_REDIS_API int redis_sock_read_multibulk_multi_reply(INTERNAL_FUNCTION_PARAMETERS,
2024+
PHP_REDIS_API int
2025+
redis_sock_read_multibulk_multi_reply(INTERNAL_FUNCTION_PARAMETERS,
20262026
RedisSock *redis_sock)
20272027
{
20282028

20292029
char inbuf[4096];
20302030
int numElems;
20312031
size_t len;
20322032

2033-
if (redis_sock_gets(redis_sock, inbuf, sizeof(inbuf) - 1, &len) < 0) {
2034-
return - 1;
2035-
}
2036-
2037-
/* number of responses */
2038-
numElems = atoi(inbuf+1);
2039-
2040-
if(numElems < 0) {
2041-
return -1;
2033+
if (redis_sock_gets(redis_sock, inbuf, sizeof(inbuf) - 1, &len) < 0 ||
2034+
*inbuf != TYPE_MULTIBULK || atoi(inbuf + 1) < 0
2035+
) {
2036+
return FAILURE;
20422037
}
20432038

20442039
array_init(return_value);
20452040

2046-
redis_sock_read_multibulk_multi_reply_loop(INTERNAL_FUNCTION_PARAM_PASSTHRU,
2047-
redis_sock, return_value, numElems);
2048-
2049-
return 0;
2041+
return redis_sock_read_multibulk_multi_reply_loop(INTERNAL_FUNCTION_PARAM_PASSTHRU,
2042+
redis_sock, return_value);
20502043
}
20512044

20522045

@@ -2098,8 +2091,11 @@ PHP_METHOD(Redis, exec)
20982091
ZVAL_FALSE(return_value);
20992092
} else {
21002093
array_init(return_value);
2101-
redis_sock_read_multibulk_multi_reply_loop(
2102-
INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, return_value, 0);
2094+
if (redis_sock_read_multibulk_multi_reply_loop(
2095+
INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, return_value) != SUCCESS) {
2096+
zval_dtor(return_value);
2097+
RETVAL_FALSE;
2098+
}
21032099
}
21042100
zend_string_release(redis_sock->pipeline_cmd);
21052101
redis_sock->pipeline_cmd = NULL;
@@ -2124,12 +2120,9 @@ redis_response_enqueued(RedisSock *redis_sock)
21242120
return ret;
21252121
}
21262122

2127-
/* TODO: Investigate/fix the odd logic going on in here. Looks like previous abort
2128-
* conditions that are now simply empty if { } { } blocks. */
21292123
PHP_REDIS_API int
21302124
redis_sock_read_multibulk_multi_reply_loop(INTERNAL_FUNCTION_PARAMETERS,
2131-
RedisSock *redis_sock, zval *z_tab,
2132-
int numElems)
2125+
RedisSock *redis_sock, zval *z_tab)
21332126
{
21342127
fold_item *fi;
21352128

@@ -2142,17 +2135,18 @@ redis_sock_read_multibulk_multi_reply_loop(INTERNAL_FUNCTION_PARAMETERS,
21422135
size_t len;
21432136
char inbuf[255];
21442137

2145-
if (redis_sock_gets(redis_sock, inbuf, sizeof(inbuf) - 1, &len) < 0) {
2146-
} else if (strncmp(inbuf, "+OK", 3) != 0) {
2138+
if (redis_sock_gets(redis_sock, inbuf, sizeof(inbuf) - 1, &len) < 0 || strncmp(inbuf, "+OK", 3) != 0) {
2139+
return FAILURE;
21472140
}
21482141

21492142
while ((fi = fi->next) && fi->fun) {
2150-
if (redis_response_enqueued(redis_sock) == SUCCESS) {
2151-
} else {
2143+
if (redis_response_enqueued(redis_sock) != SUCCESS) {
2144+
return FAILURE;
21522145
}
21532146
}
21542147

21552148
if (redis_sock_gets(redis_sock, inbuf, sizeof(inbuf) - 1, &len) < 0) {
2149+
return FAILURE;
21562150
}
21572151

21582152
zval z_ret;
@@ -2162,12 +2156,13 @@ redis_sock_read_multibulk_multi_reply_loop(INTERNAL_FUNCTION_PARAMETERS,
21622156
int num = atol(inbuf + 1);
21632157

21642158
if (num > 0 && redis_read_multibulk_recursive(redis_sock, num, 0, &z_ret) < 0) {
2159+
return FAILURE;
21652160
}
21662161

21672162
if (fi) fi = fi->next;
21682163
}
21692164
redis_sock->current = fi;
2170-
return 0;
2165+
return SUCCESS;
21712166
}
21722167

21732168
PHP_METHOD(Redis, pipeline)

0 commit comments

Comments
 (0)