Skip to content

Commit 2096982

Browse files
committed
1 parent c8f9376 commit 2096982

File tree

3 files changed

+56
-29
lines changed

3 files changed

+56
-29
lines changed

php_memcached.c

+3
Original file line numberDiff line numberDiff line change
@@ -3502,6 +3502,8 @@ static
35023502
void php_memc_server_free_storage(zend_object *object)
35033503
{
35043504
php_memc_server_t *intern = php_memc_server_fetch_object(object);
3505+
3506+
php_memc_proto_handler_destroy(&intern->handler);
35053507
zend_object_std_dtor(&intern->zo);
35063508
}
35073509

@@ -3515,6 +3517,7 @@ zend_object *php_memc_server_new(zend_class_entry *ce)
35153517
object_properties_init(&intern->zo, ce);
35163518

35173519
intern->zo.handlers = &memcached_server_object_handlers;
3520+
intern->handler = php_memc_proto_handler_new();
35183521

35193522
return &intern->zo;
35203523
}

php_memcached_server.c

+52-28
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,16 @@
1717
#include "php_memcached.h"
1818
#include "php_memcached_private.h"
1919
#include "php_memcached_server.h"
20+
#include "php_network.h"
2021

2122
#include <event2/listener.h>
2223

23-
#undef NDEBUG
24-
#undef _NDEBUG
2524
#include <assert.h>
2625

26+
#if HAVE_ARPA_INET_H
27+
# include <arpa/inet.h>
28+
#endif
29+
2730
#define MEMC_GET_CB(cb_type) (MEMC_SERVER_G(callbacks)[cb_type])
2831
#define MEMC_HAS_CB(cb_type) (MEMC_GET_CB(cb_type).fci.size > 0)
2932

@@ -58,9 +61,9 @@ typedef struct {
5861
static
5962
long s_invoke_php_callback (php_memc_server_cb_t *cb, zval *params, ssize_t param_count)
6063
{
61-
zval *retval = NULL;
64+
zval retval;
6265

63-
cb->fci.retval = retval;
66+
cb->fci.retval = &retval;
6467
cb->fci.params = params;
6568
cb->fci.param_count = param_count;
6669
#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
7376
efree (buf);
7477
}
7578

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);
7780
}
7881

7982
// memcached protocol callbacks
@@ -96,6 +99,7 @@ protocol_binary_response_status s_add_handler(const void *cookie, const void *ke
9699
ZVAL_LONG(&zflags, flags);
97100
ZVAL_LONG(&zexptime, exptime);
98101
ZVAL_NULL(&zresult_cas);
102+
ZVAL_MAKE_REF(&zresult_cas);
99103

100104
ZVAL_COPY(&params[0], &zcookie);
101105
ZVAL_COPY(&params[1], &zkey);
@@ -142,6 +146,7 @@ protocol_binary_response_status s_append_prepend_handler (php_memc_event_t event
142146
ZVAL_STRINGL(&zvalue, data, data_len);
143147
ZVAL_DOUBLE(&zcas, cas);
144148
ZVAL_NULL(&zresult_cas);
149+
ZVAL_MAKE_REF(&zresult_cas);
145150

146151
ZVAL_COPY(&params[0], &zcookie);
147152
ZVAL_COPY(&params[1], &zkey);
@@ -198,11 +203,13 @@ protocol_binary_response_status s_incr_decr_handler (php_memc_event_t event, con
198203
MEMC_MAKE_ZVAL_COOKIE(zcookie, cookie);
199204

200205
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);
204209
ZVAL_LONG(&zresult, 0);
210+
ZVAL_MAKE_REF(&zresult);
205211
ZVAL_NULL(&zresult_cas);
212+
ZVAL_MAKE_REF(&zresult_cas);
206213

207214
ZVAL_COPY(&params[0], &zcookie);
208215
ZVAL_COPY(&params[1], &zkey);
@@ -322,6 +329,13 @@ protocol_binary_response_status s_get_handler (const void *cookie, const void *k
322329
}
323330

324331
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);
325339

326340
ZVAL_COPY(&params[0], &zcookie);
327341
ZVAL_COPY(&params[1], &zkey);
@@ -436,11 +450,12 @@ protocol_binary_response_status s_set_replace_handler (php_memc_event_t event, c
436450
MEMC_MAKE_ZVAL_COOKIE(zcookie, cookie);
437451

438452
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);
442456
ZVAL_DOUBLE(&zcas, (double) cas);
443457
ZVAL_NULL(&zresult_cas);
458+
ZVAL_MAKE_REF(&zresult_cas);
444459

445460
ZVAL_COPY(&params[0], &zcookie);
446461
ZVAL_COPY(&params[1], &zkey);
@@ -504,6 +519,7 @@ protocol_binary_response_status s_stat_handler (const void *cookie, const void *
504519

505520
ZVAL_STRINGL(&zkey, key, key_len);
506521
ZVAL_NULL(&zbody);
522+
ZVAL_MAKE_REF(&zbody);
507523

508524
ZVAL_COPY(&params[0], &zcookie);
509525
ZVAL_COPY(&params[1], &zkey);
@@ -584,17 +600,27 @@ void s_handle_memcached_event (evutil_socket_t fd, short what, void *arg)
584600
zval zremoteip, zremoteport;
585601
zval params[2];
586602
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+
}
594622
} else {
595623
php_error_docref(NULL, E_WARNING, "getpeername failed: %s", strerror (errno));
596-
ZVAL_NULL(&zremoteip);
597-
ZVAL_NULL(&zremoteport);
598624
}
599625

600626
ZVAL_COPY(&params[0], &zremoteip);
@@ -714,22 +740,20 @@ php_memc_proto_handler_t *php_memc_proto_handler_new ()
714740
}
715741

716742
static
717-
evutil_socket_t s_create_listening_socket (const char *spec)
743+
evutil_socket_t s_create_listening_socket (const zend_string *spec)
718744
{
719745
evutil_socket_t sock;
720746
struct sockaddr_storage addr;
721-
int addr_len;
722-
747+
socklen_t addr_len;
723748
int rc;
724749

725750
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);
729753
return -1;
730754
}
731755

732-
sock = socket (AF_INET, SOCK_STREAM, 0);
756+
sock = socket (addr.ss_family, SOCK_STREAM, 0);
733757
if (sock < 0) {
734758
php_error_docref(NULL, E_WARNING, "socket failed: %s", strerror (errno));
735759
return -1;
@@ -770,7 +794,7 @@ evutil_socket_t s_create_listening_socket (const char *spec)
770794
zend_bool php_memc_proto_handler_run (php_memc_proto_handler_t *handler, zend_string *address)
771795
{
772796
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);
774798

775799
if (sock == -1) {
776800
return 0;

server-example/run-server.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -89,4 +89,4 @@ function ($client_id) {
8989
return Memcached::RESPONSE_SUCCESS;
9090
});
9191

92-
$server->run ("127.0.0.1:3434");
92+
$server->run ("127.0.0.1:3434");

0 commit comments

Comments
 (0)