17
17
#include "php_memcached.h"
18
18
#include "php_memcached_private.h"
19
19
#include "php_memcached_server.h"
20
+ #include "php_network.h"
20
21
21
22
#include <event2/listener.h>
22
23
23
- #undef NDEBUG
24
- #undef _NDEBUG
25
24
#include <assert.h>
26
25
26
+ #if HAVE_ARPA_INET_H
27
+ # include <arpa/inet.h>
28
+ #endif
29
+
27
30
#define MEMC_GET_CB (cb_type ) (MEMC_SERVER_G(callbacks)[cb_type])
28
31
#define MEMC_HAS_CB (cb_type ) (MEMC_GET_CB(cb_type).fci.size > 0)
29
32
@@ -58,9 +61,9 @@ typedef struct {
58
61
static
59
62
long s_invoke_php_callback (php_memc_server_cb_t * cb , zval * params , ssize_t param_count )
60
63
{
61
- zval * retval = NULL ;
64
+ zval retval ;
62
65
63
- cb -> fci .retval = retval ;
66
+ cb -> fci .retval = & retval ;
64
67
cb -> fci .params = params ;
65
68
cb -> fci .param_count = param_count ;
66
69
#if PHP_VERSION_ID < 80000
@@ -73,7 +76,7 @@ long s_invoke_php_callback (php_memc_server_cb_t *cb, zval *params, ssize_t para
73
76
efree (buf );
74
77
}
75
78
76
- return retval == NULL ? PROTOCOL_BINARY_RESPONSE_UNKNOWN_COMMAND : zval_get_long (retval );
79
+ return Z_ISUNDEF ( retval ) ? PROTOCOL_BINARY_RESPONSE_UNKNOWN_COMMAND : zval_get_long (& retval );
77
80
}
78
81
79
82
// memcached protocol callbacks
@@ -96,6 +99,7 @@ protocol_binary_response_status s_add_handler(const void *cookie, const void *ke
96
99
ZVAL_LONG (& zflags , flags );
97
100
ZVAL_LONG (& zexptime , exptime );
98
101
ZVAL_NULL (& zresult_cas );
102
+ ZVAL_MAKE_REF (& zresult_cas );
99
103
100
104
ZVAL_COPY (& params [0 ], & zcookie );
101
105
ZVAL_COPY (& params [1 ], & zkey );
@@ -142,6 +146,7 @@ protocol_binary_response_status s_append_prepend_handler (php_memc_event_t event
142
146
ZVAL_STRINGL (& zvalue , data , data_len );
143
147
ZVAL_DOUBLE (& zcas , cas );
144
148
ZVAL_NULL (& zresult_cas );
149
+ ZVAL_MAKE_REF (& zresult_cas );
145
150
146
151
ZVAL_COPY (& params [0 ], & zcookie );
147
152
ZVAL_COPY (& params [1 ], & zkey );
@@ -198,11 +203,13 @@ protocol_binary_response_status s_incr_decr_handler (php_memc_event_t event, con
198
203
MEMC_MAKE_ZVAL_COOKIE (zcookie , cookie );
199
204
200
205
ZVAL_STRINGL (& zkey , key , key_len );
201
- ZVAL_LONG (& zdelta , (long ) delta );
202
- ZVAL_LONG (& zinital , (long ) initial );
203
- ZVAL_LONG (& zexpiration , (long ) expiration );
206
+ ZVAL_LONG (& zdelta , (zend_long ) delta );
207
+ ZVAL_LONG (& zinital , (zend_long ) initial );
208
+ ZVAL_LONG (& zexpiration , (zend_long ) expiration );
204
209
ZVAL_LONG (& zresult , 0 );
210
+ ZVAL_MAKE_REF (& zresult );
205
211
ZVAL_NULL (& zresult_cas );
212
+ ZVAL_MAKE_REF (& zresult_cas );
206
213
207
214
ZVAL_COPY (& params [0 ], & zcookie );
208
215
ZVAL_COPY (& params [1 ], & zkey );
@@ -322,6 +329,13 @@ protocol_binary_response_status s_get_handler (const void *cookie, const void *k
322
329
}
323
330
324
331
MEMC_MAKE_ZVAL_COOKIE (zcookie , cookie );
332
+ ZVAL_STRINGL (& zkey , key , key_len );
333
+ ZVAL_NULL (& zvalue );
334
+ ZVAL_MAKE_REF (& zvalue );
335
+ ZVAL_NULL (& zflags );
336
+ ZVAL_MAKE_REF (& zflags );
337
+ ZVAL_NULL (& zresult_cas );
338
+ ZVAL_MAKE_REF (& zresult_cas );
325
339
326
340
ZVAL_COPY (& params [0 ], & zcookie );
327
341
ZVAL_COPY (& params [1 ], & zkey );
@@ -436,11 +450,12 @@ protocol_binary_response_status s_set_replace_handler (php_memc_event_t event, c
436
450
MEMC_MAKE_ZVAL_COOKIE (zcookie , cookie );
437
451
438
452
ZVAL_STRINGL (& zkey , key , key_len );
439
- ZVAL_STRINGL (& zdata , (( char * ) data ), ( int ) data_len );
440
- ZVAL_LONG (& zflags , (long ) flags );
441
- ZVAL_LONG (& zexpiration , (long ) expiration );
453
+ ZVAL_STRINGL (& zdata , data , data_len );
454
+ ZVAL_LONG (& zflags , (zend_long ) flags );
455
+ ZVAL_LONG (& zexpiration , (zend_long ) expiration );
442
456
ZVAL_DOUBLE (& zcas , (double ) cas );
443
457
ZVAL_NULL (& zresult_cas );
458
+ ZVAL_MAKE_REF (& zresult_cas );
444
459
445
460
ZVAL_COPY (& params [0 ], & zcookie );
446
461
ZVAL_COPY (& params [1 ], & zkey );
@@ -504,6 +519,7 @@ protocol_binary_response_status s_stat_handler (const void *cookie, const void *
504
519
505
520
ZVAL_STRINGL (& zkey , key , key_len );
506
521
ZVAL_NULL (& zbody );
522
+ ZVAL_MAKE_REF (& zbody );
507
523
508
524
ZVAL_COPY (& params [0 ], & zcookie );
509
525
ZVAL_COPY (& params [1 ], & zkey );
@@ -584,17 +600,27 @@ void s_handle_memcached_event (evutil_socket_t fd, short what, void *arg)
584
600
zval zremoteip , zremoteport ;
585
601
zval params [2 ];
586
602
protocol_binary_response_status retval ;
587
-
588
- struct sockaddr_in addr_in ;
589
- socklen_t addr_in_len = sizeof (addr_in );
590
-
591
- if (getpeername (fd , (struct sockaddr * ) & addr_in , & addr_in_len ) == 0 ) {
592
- ZVAL_STRING (& zremoteip , inet_ntoa (addr_in .sin_addr ));
593
- ZVAL_LONG (& zremoteport , ntohs (addr_in .sin_port ));
603
+ struct sockaddr_storage ss ;
604
+ socklen_t ss_len = sizeof (ss );
605
+
606
+ ZVAL_NULL (& zremoteip );
607
+ ZVAL_NULL (& zremoteport );
608
+
609
+ if (getpeername (fd , (struct sockaddr * ) & ss , & ss_len ) == 0 ) {
610
+ char addr_buf [0x100 ];
611
+
612
+ switch (ss .ss_family ) {
613
+ case AF_INET6 :
614
+ ZVAL_STRING (& zremoteip , inet_ntop (ss .ss_family , & ((struct sockaddr_in6 * ) & ss )-> sin6_addr , addr_buf , sizeof (addr_buf )));
615
+ ZVAL_LONG (& zremoteport , ntohs (((struct sockaddr_in6 * ) & ss )-> sin6_port ));
616
+ break ;
617
+ case AF_INET :
618
+ ZVAL_STRING (& zremoteip , inet_ntop (ss .ss_family , & ((struct sockaddr_in * ) & ss )-> sin_addr , addr_buf , sizeof (addr_buf )));
619
+ ZVAL_LONG (& zremoteport , ntohs (((struct sockaddr_in * ) & ss )-> sin_port ));
620
+ break ;
621
+ }
594
622
} else {
595
623
php_error_docref (NULL , E_WARNING , "getpeername failed: %s" , strerror (errno ));
596
- ZVAL_NULL (& zremoteip );
597
- ZVAL_NULL (& zremoteport );
598
624
}
599
625
600
626
ZVAL_COPY (& params [0 ], & zremoteip );
@@ -714,22 +740,20 @@ php_memc_proto_handler_t *php_memc_proto_handler_new ()
714
740
}
715
741
716
742
static
717
- evutil_socket_t s_create_listening_socket (const char * spec )
743
+ evutil_socket_t s_create_listening_socket (const zend_string * spec )
718
744
{
719
745
evutil_socket_t sock ;
720
746
struct sockaddr_storage addr ;
721
- int addr_len ;
722
-
747
+ socklen_t addr_len ;
723
748
int rc ;
724
749
725
750
addr_len = sizeof (struct sockaddr );
726
- rc = evutil_parse_sockaddr_port (spec , (struct sockaddr * ) & addr , & addr_len );
727
- if (rc != 0 ) {
728
- php_error_docref (NULL , E_WARNING , "Failed to parse bind address" );
751
+ if (SUCCESS != php_network_parse_network_address_with_port (spec -> val , spec -> len , (struct sockaddr * ) & addr , & addr_len )) {
752
+ php_error_docref (NULL , E_WARNING , "Failed to parse bind address: %s" , spec -> val );
729
753
return -1 ;
730
754
}
731
755
732
- sock = socket (AF_INET , SOCK_STREAM , 0 );
756
+ sock = socket (addr . ss_family , SOCK_STREAM , 0 );
733
757
if (sock < 0 ) {
734
758
php_error_docref (NULL , E_WARNING , "socket failed: %s" , strerror (errno ));
735
759
return -1 ;
@@ -770,7 +794,7 @@ evutil_socket_t s_create_listening_socket (const char *spec)
770
794
zend_bool php_memc_proto_handler_run (php_memc_proto_handler_t * handler , zend_string * address )
771
795
{
772
796
struct event * accept_event ;
773
- evutil_socket_t sock = s_create_listening_socket (address -> val );
797
+ evutil_socket_t sock = s_create_listening_socket (address );
774
798
775
799
if (sock == -1 ) {
776
800
return 0 ;
0 commit comments