@@ -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. */
21292123PHP_REDIS_API int
21302124redis_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
21732168PHP_METHOD (Redis , pipeline )
0 commit comments