8000 Normalize Redis callback prototypes and stop typecasting. · phpredis/phpredis@e0796d4 · GitHub
[go: up one dir, main page]

Skip to content

Commit e0796d4

Browse files
Normalize Redis callback prototypes and stop typecasting.
Convert every single Redis callback function to the form: int callback(INTERNAL_FUNCTION_PARAMETERS, RedisSock*, zval*, void*); Additionally, stop typcasting the callback to void* which was suppressing warnings and exposing a segfault on Apple silicon (#1917).
1 parent 656dd5f commit e0796d4

File tree

7 files changed

+109
-79
lines changed

7 files changed

+109
-79
lines changed

common.h

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ typedef enum {
139139

140140
#define REDIS_SAVE_CALLBACK(callback, closure_context) do { \
141141
fold_item *fi = malloc(sizeof(fold_item)); \
142-
fi->fun = (void *)callback; \
142+
fi->fun = callback; \
143143
fi->ctx = closure_context; \
144144
fi->next = NULL; \
145145
if (redis_sock->current) { \
@@ -194,7 +194,7 @@ typedef enum {
194194
REDIS_PROCESS_RESPONSE_CLOSURE(resp_func, ctx) \
195195
}
196196

197-
/* Process a command but with a specific command building function
197+
/* Process a command but with a specific command building function
198198
* and keyword which is passed to us*/
199199
#define REDIS_PROCESS_KW_CMD(kw, cmdfunc, resp_func) \
200200
RedisSock *redis_sock; char *cmd; int cmd_len; void *ctx=NULL; \
@@ -255,12 +255,6 @@ typedef enum {
255255
#endif
256256
#endif
257257

258-
typedef struct fold_item {
259-
zval * (*fun)(INTERNAL_FUNCTION_PARAMETERS, void *, ...);
260-
void *ctx;
261-
struct fold_item *next;
262-
} fold_item;
263-
264258
/* {{{ struct RedisSock */
265259
typedef struct {
266260
php_stream *stream;
@@ -285,8 +279,8 @@ typedef struct {
285279
zend_string *prefix;
286280

287281
short mode;
288-
fold_item *head;
289-
fold_item *current;
282+
struct fold_item *head;
283+
struct fold_item *current;
290284

291285
zend_string *pipeline_cmd;
292286

@@ -301,6 +295,16 @@ typedef struct {
301295
} RedisSock;
302296
/* }}} */
303297

298+
/* Redis response handler function callback prototype */
299+
typedef void (*ResultCallback)(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
300+
typedef int (*FailableResultCallback)(INTERNAL_FUNCTION_PARAMETERS, RedisSock*, zval*, void*);
301+
302+
typedef struct fold_item {
303+
FailableResultCallback fun;
304+
void *ctx;
305+
struct fold_item *next;
306+
} fold_item;
307+
304308
typedef struct {
305309
zend_llist list;
306310
int nb_active;

library.c

Lines changed: 64 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1013,40 +1013,44 @@ int redis_cmd_append_sstr_arrkey(smart_string *cmd, zend_string *kstr, zend_ulon
10131013
return redis_cmd_append_sstr(cmd, arg, len);
10141014
}
10151015

1016-
PHP_REDIS_API void redis_bulk_double_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx) {
1016+
PHP_REDIS_API int
1017+
redis_bulk_double_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx) {
10171018

10181019
char *response;
10191020
int response_len;
10201021
double ret;
10211022

10221023
if ((response = redis_sock_read(redis_sock, &response_len)) == NULL) {
10231024
if (IS_ATOMIC(redis_sock)) {
1024-
RETURN_FALSE;
1025+
RETVAL_FALSE;
1026+
} else {
1027+
add_next_index_bool(z_tab, 0);
10251028
}
1026-
add_next_index_bool(z_tab, 0);
1027-
return;
1029+
return FAILURE;
10281030
}
10291031

10301032
ret = atof(response);
10311033
efree(response);
10321034
if (IS_ATOMIC(redis_sock)) {
1033-
RETURN_DOUBLE(ret);
1035+
RETVAL_DOUBLE(ret);
10341036
} else {
10351037
add_next_index_double(z_tab, ret);
10361038
}
1039+
1040+
return SUCCESS;
10371041
}
10381042

1039-
PHP_REDIS_API void redis_type_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx) {
1043+
PHP_REDIS_API int redis_type_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx) {
10401044
char *response;
10411045
int response_len;
10421046
long l;
10431047

10441048
if ((response = redis_sock_read(redis_sock, &response_len)) == NULL) {
10451049
if (IS_ATOMIC(redis_sock)) {
1046-
RETURN_FALSE;
1050+
RETVAL_FALSE;
10471051
}
10481052
add_next_index_bool(z_tab, 0);
1049-
return;
1053+
return FAILURE;
10501054
}
10511055

10521056
if (strncmp(response, "+string", 7) == 0) {
@@ -1067,20 +1071,23 @@ PHP_REDIS_API void redis_type_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *
10671071

10681072
efree(response);
10691073
if (IS_ATOMIC(redis_sock)) {
1070-
RETURN_LONG(l);
1074+
RETVAL_LONG(l);
10711075
} else {
10721076
add_next_index_long(z_tab, l);
10731077
}
1078+
1079+
return SUCCESS;
10741080
}
10751081

1076-
PHP_REDIS_API void redis_info_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx) {
1082+
PHP_REDIS_API int redis_info_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx) {
10771083
char *response;
10781084
int response_len;
10791085
zval z_ret;
10801086

10811087
/* Read bulk response */
10821088
if ((response = redis_sock_read(redis_sock, &response_len)) == NULL) {
1083-
RETURN_FALSE;
1089+
RETVAL_FALSE;
1090+
return FAILURE;
10841091
}
10851092

10861093
/* Parse it into a zval array */
@@ -1095,6 +1102,8 @@ PHP_REDIS_API void redis_info_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *
10951102
} else {
10961103
add_next_index_zval(z_tab, &z_ret);
10971104
}
1105+
1106+
return SUCCESS;
10981107
}
10991108

11001109
PHP_REDIS_API void
@@ -1151,14 +1160,16 @@ redis_parse_info_response(char *response, zval *z_ret)
11511160
* Specialized handling of the CLIENT LIST output so it comes out in a simple way for PHP userland code
11521161
* to handle.
11531162
*/
1154-
PHP_REDIS_API void redis_client_list_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab) {
1163+
PHP_REDIS_API int
1164+
redis_client_list_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx) {
11551165
char *resp;
11561166
int resp_len;
11571167
zval z_ret;
11581168

11591169
/* Make sure we can read the bulk response from Redis */
11601170
if ((resp = redis_sock_read(redis_sock, &resp_len)) == NULL) {
1161-
RETURN_FALSE;
1171+
RETVAL_FALSE;
1172+
return FAILURE;
11621173
}
11631174

11641175
/* Parse it out */
@@ -1173,6 +1184,8 @@ PHP_REDIS_API void redis_client_list_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSo
11731184
} else {
11741185
add_next_index_zval(z_tab, &z_ret);
11751186
}
1187+
1188+
return SUCCESS;
11761189
}
11771190

11781191
PHP_REDIS_API void
@@ -1270,7 +1283,7 @@ redis_parse_client_list_response(char *response, zval *z_ret)
12701283
}
12711284
}
12721285

1273-
PHP_REDIS_API void
1286+
PHP_REDIS_API int
12741287
redis_boolean_response_impl(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
12751288
zval *z_tab, void *ctx,
12761289
SuccessCallback success_callback)
@@ -1289,36 +1302,38 @@ redis_boolean_response_impl(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
12891302
success_callback(redis_sock);
12901303
}
12911304
if (IS_ATOMIC(redis_sock)) {
1292-
RETURN_BOOL(ret);
1305+
RETVAL_BOOL(ret);
12931306
} else {
12941307
add_next_index_bool(z_tab, ret);
12951308
}
1309+
1310+
return ret ? SUCCESS : FAILURE;
12961311
}
12971312

1298-
PHP_REDIS_API void redis_boolean_response(INTERNAL_FUNCTION_PARAMETERS,
1313+
PHP_REDIS_API int redis_boolean_response(INTERNAL_FUNCTION_PARAMETERS,
12991314
RedisSock *redis_sock, zval *z_tab,
13001315
void *ctx)
13011316
{
1302-
redis_boolean_response_impl(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock,
1303-
z_tab, ctx, NULL);
1317+
return redis_boolean_response_impl(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock,
1318+
z_tab, ctx, NULL);
13041319
}
13051320

1306-
PHP_REDIS_API void redis_long_response(INTERNAL_FUNCTION_PARAMETERS,
1307-
RedisSock *redis_sock, zval * z_tab,
1308-
void *ctx)
1321+
PHP_REDIS_API int redis_long_response(INTERNAL_FUNCTION_PARAMETERS,
1322+
RedisSock *redis_sock, zval * z_tab,
1323+
void *ctx)
13091324
{
13101325

13111326
char *response;
13121327
int response_len;
13131328

1314-
if ((response = redis_sock_read(redis_sock, &response_len))
1315-
== NULL)
1316-
{
1329+
if ((response = redis_sock_read(redis_sock, &response_len)) == NULL) {
13171330
if (IS_ATOMIC(redis_sock)) {
1318-
RETURN_FALSE;
1331+
RETVAL_FALSE;
1332+
} else {
1333+
add_next_index_bool(z_tab, 0);
13191334
}
1320-
add_next_index_bool(z_tab, 0);
1321-
return;
1335+
1336+
return FAILURE;
13221337
}
13231338

13241339
if(response[0] == ':') {
@@ -1343,8 +1358,12 @@ PHP_REDIS_API void redis_long_response(INTERNAL_FUNCTION_PARAMETERS,
13431358
} else {
13441359
add_next_index_null(z_tab);
13451360
}
1361+
efree(response);
1362+
return FAILURE;
13461363
}
1364+
13471365
efree(response);
1366+
return SUCCESS;
13481367
}
13491368

13501369
/* Helper method to convert [key, value, key, value] into [key => value,
@@ -1925,7 +1944,7 @@ PHP_REDIS_API int redis_mbulk_reply_zipped_vals(INTERNAL_FUNCTION_PARAMETERS, Re
19251944
z_tab, UNSERIALIZE_VALS, SCORE_DECODE_NONE);
19261945
}
19271946

1928-
PHP_REDIS_API void
1947+
PHP_REDIS_API int
19291948
redis_1_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx)
19301949
{
19311950
char *response;
@@ -1938,13 +1957,15 @@ redis_1_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_ta
19381957
}
19391958

19401959
if (IS_ATOMIC(redis_sock)) {
1941-
RETURN_BOOL(ret);
1960+
RETVAL_BOOL(ret);
19421961
} else {
19431962
add_next_index_bool(z_tab, ret);
19441963
}
1964+
1965+
return ret ? SUCCESS : FAILURE;
19451966
}
19461967

1947-
PHP_REDIS_API void redis_string_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx) {
1968+
PHP_REDIS_API int redis_string_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx) {
19481969

19491970
char *response;
19501971
int response_len;
@@ -1953,10 +1974,11 @@ PHP_REDIS_API void redis_string_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock
19531974
== NULL)
19541975
{
19551976
if (IS_ATOMIC(redis_sock)) {
1956-
RETURN_FALSE;
1977+
RETVAL_FALSE;
1978+
} else {
1979+
add_next_index_bool(z_tab, 0);
19571980
}
1958-
add_next_index_bool(z_tab, 0);
1959-
return;
1981+
return FAILURE;
19601982
}
19611983
if (IS_ATOMIC(redis_sock)) {
19621984
if (!redis_unpack(redis_sock, response, response_len, return_value)) {
@@ -1970,7 +1992,9 @@ PHP_REDIS_API void redis_string_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock
19701992
add_next_index_stringl(z_tab, response, response_len);
19711993
}
19721994
}
1995+
19731996
efree(response);
1997+
return SUCCESS;
19741998
}
19751999

19762000
PHP_REDIS_API
@@ -1998,7 +2022,7 @@ void redis_single_line_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock
19982022
}
19992023

20002024
/* like string response, but never unserialized. */
2001-
PHP_REDIS_API void
2025+
PHP_REDIS_API int
20022026
redis_ping_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
20032027
zval *z_tab, void *ctx)
20042028
{
@@ -2010,17 +2034,20 @@ redis_ping_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
20102034
== NULL)
20112035
{
20122036
if (IS_ATOMIC(redis_sock)) {
2013-
RETURN_FALSE;
2037+
RETVAL_FALSE;
2038+
} else {
2039+
add_next_index_bool(z_tab, 0);
20142040
}
2015-
add_next_index_bool(z_tab, 0);
2016-
return;
2041+
return FAILURE;
20172042
}
20182043
if (IS_ATOMIC(redis_sock)) {
20192044
RETVAL_STRINGL(response, response_len);
20202045
} else {
20212046
add_next_index_stringl(z_tab, response, response_len);
20222047
}
2048+
20232049
efree(response);
2050+
return SUCCESS;
20242051
}
20252052

20262053
/* Response for DEBUG object which is a formatted single line reply */

library.h

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -49,20 +49,20 @@ PHP_REDIS_API zend_string *redis_pool_spprintf(RedisSock *redis_sock, char *fmt,
4949

5050
PHP_REDIS_API char *redis_sock_read(RedisSock *redis_sock, int *buf_len);
5151
PHP_REDIS_API int redis_sock_gets(RedisSock *redis_sock, char *buf, int buf_size, size_t* line_len);
52-
PHP_REDIS_API void redis_1_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
53-
PHP_REDIS_API void redis_long_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval* z_tab, void *ctx);
52+
PHP_REDIS_API int redis_1_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
53+
PHP_REDIS_API int redis_long_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval* z_tab, void *ctx);
5454
typedef void (*SuccessCallback)(RedisSock *redis_sock);
55-
PHP_REDIS_API void redis_boolean_response_impl(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx, SuccessCallback success_callback);
56-
PHP_REDIS_API void redis_boolean_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
57-
PHP_REDIS_API void redis_bulk_double_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
58-
PHP_REDIS_API void redis_string_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
55+
PHP_REDIS_API int redis_boolean_response_impl(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx, SuccessCallback success_callback);
56+
PHP_REDIS_API int redis_boolean_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
57+
PHP_REDIS_API int redis_bulk_double_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
58+
PHP_REDIS_API int redis_string_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
5959
PHP_REDIS_API void redis_single_line_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
6060
zval *z_tab, void *ctx);
61-
PHP_REDIS_API void redis_ping_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
62-
PHP_REDIS_API void redis_info_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
61+
PHP_REDIS_API int redis_ping_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
62+
PHP_REDIS_API int redis_info_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
6363
PHP_REDIS_API void redis_parse_info_response(char *response, zval *z_ret);
6464
PHP_REDIS_API void redis_parse_client_list_response(char *response, zval *z_ret);
65-
PHP_REDIS_API void redis_type_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
65+
PHP_REDIS_API int redis_type_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
6666
PHP_REDIS_API RedisSock* redis_sock_create(char *host, int host_len, int port, double timeout, double read_timeout, int persistent, char *persistent_id, long retry_interval);
6767
PHP_REDIS_API int redis_sock_connect(RedisSock *redis_sock);
6868
PHP_REDIS_API int redis_sock_server_open(RedisSock *redis_sock);
@@ -149,7 +149,7 @@ PHP_REDIS_API int redis_read_multibulk_recursive(RedisSock *redis_sock, long lon
149149
PHP_REDIS_API int redis_read_variant_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
150150
PHP_REDIS_API int redis_read_raw_variant_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
151151
PHP_REDIS_API int redis_read_variant_reply_strings(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
152-
PHP_REDIS_API void redis_client_list_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab);
152+
PHP_REDIS_API int redis_client_list_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
153153

154154
/* Helper methods to get configuration values from a HashTable. */
155155

php_redis.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -276,11 +276,6 @@ PHP_MINIT_FUNCTION(redis);
276276
PHP_MSHUTDOWN_FUNCTION(redis);
277277
PHP_MINFO_FUNCTION(redis);
278278

279-
/* Redis response handler function callback prototype */
280-
typedef void (*ResultCallback)(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
281-
282-
typedef int (*FailableResultCallback)(INTERNAL_FUNCTION_PARAMETERS, RedisSock*, zval*, void*);
283-
284279
PHP_REDIS_API int redis_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent);
285280

286281
PHP_REDIS_API int redis_response_enqueued(RedisSock *redis_sock);

0 commit comments

Comments
 (0)
0