From 43b5948cae31e521b21caf5522c05875d2452776 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Fri, 6 Mar 2026 21:25:29 +0000 Subject: [PATCH 1/5] ext/sockets: internal refactorings. remove redundant memsets and faster socket unix path copy. --- ext/sockets/sockets.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/ext/sockets/sockets.c b/ext/sockets/sockets.c index 838e99cdc1378..c50a785b43c70 100644 --- a/ext/sockets/sockets.c +++ b/ext/sockets/sockets.c @@ -1249,8 +1249,6 @@ PHP_FUNCTION(socket_connect) RETURN_THROWS(); } - memset(&sin6, 0, sizeof(struct sockaddr_in6)); - sin6.sin6_family = AF_INET6; sin6.sin6_port = htons((unsigned short int)port); @@ -1629,7 +1627,6 @@ PHP_FUNCTION(socket_recvfrom) ZSTR_LEN(recv_buf) = retval; ZSTR_VAL(recv_buf)[ZSTR_LEN(recv_buf)] = '\0'; - memset(addrbuf, 0, INET6_ADDRSTRLEN); inet_ntop(AF_INET6, &sin6.sin6_addr, addrbuf, sizeof(addrbuf)); ZEND_TRY_ASSIGN_REF_NEW_STR(arg2, recv_buf); @@ -1732,7 +1729,7 @@ PHP_FUNCTION(socket_sendto) } s_un.sun_family = AF_UNIX; - snprintf(s_un.sun_path, sizeof(s_un.sun_path), "%s", ZSTR_VAL(addr)); + memcpy(s_un.sun_path, ZSTR_VAL(addr), ZSTR_LEN(addr) + 1); retval = sendto(php_sock->bsd_socket, buf, ((size_t)len > buf_len) ? buf_len : (size_t)len, flags, (struct sockaddr *) &s_un, SUN_LEN(&s_un)); break; From db9523eb45abd55a1ee3a1a91cf75a2f8be5da91 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Fri, 6 Mar 2026 21:34:30 +0000 Subject: [PATCH 2/5] simplify php_open_listen_sock. use INADDR_ANY directly instead of resolving via gethostbyname. --- ext/sockets/sockets.c | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/ext/sockets/sockets.c b/ext/sockets/sockets.c index c50a785b43c70..464bd87d5d304 100644 --- a/ext/sockets/sockets.c +++ b/ext/sockets/sockets.c @@ -244,18 +244,9 @@ ZEND_GET_MODULE(sockets) static bool php_open_listen_sock(php_socket *sock, unsigned short port, int backlog) /* {{{ */ { struct sockaddr_in la = {0}; - struct hostent *hp; -#ifndef PHP_WIN32 - if ((hp = php_network_gethostbyname("0.0.0.0")) == NULL) { -#else - if ((hp = php_network_gethostbyname("localhost")) == NULL) { -#endif - return false; - } - - memcpy((char *) &la.sin_addr, hp->h_addr, hp->h_length); - la.sin_family = hp->h_addrtype; + la.sin_addr.s_addr = htonl(INADDR_ANY); + la.sin_family = AF_INET; la.sin_port = htons(port); sock->bsd_socket = socket(PF_INET, SOCK_STREAM, 0); From 3f21f7c21c7facd2737d133613dc6dc769d75c6d Mon Sep 17 00:00:00 2001 From: David Carlier Date: Fri, 6 Mar 2026 21:34:36 +0000 Subject: [PATCH 3/5] remove redundant memsets in conversions. inet_ntop already null terminates its output. --- ext/sockets/conversions.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/ext/sockets/conversions.c b/ext/sockets/conversions.c index b4a13f39cd9c7..a70d7fd0dab6c 100644 --- a/ext/sockets/conversions.c +++ b/ext/sockets/conversions.c @@ -571,7 +571,6 @@ static void to_zval_read_sin_addr(const char *data, zval *zv, res_context *ctx) const struct in_addr *addr = (const struct in_addr *)data; socklen_t size = INET_ADDRSTRLEN; zend_string *str = zend_string_alloc(size - 1, 0); - memset(ZSTR_VAL(str), '\0', size); ZVAL_NEW_STR(zv, str); @@ -622,8 +621,6 @@ static void to_zval_read_sin6_addr(const char *data, zval *zv, res_context *ctx) socklen_t size = INET6_ADDRSTRLEN; zend_string *str = zend_string_alloc(size - 1, 0); - memset(ZSTR_VAL(str), '\0', size); - ZVAL_NEW_STR(zv, str); if (inet_ntop(AF_INET6, addr, Z_STRVAL_P(zv), size) == NULL) { From fe7061dfc3de00291e4536a2daf12944749195da Mon Sep 17 00:00:00 2001 From: David Carlier Date: Fri, 6 Mar 2026 22:12:51 +0000 Subject: [PATCH 4/5] fix windows test, all pass on unixes. --- ext/sockets/tests/socket_create_listen-win32.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/sockets/tests/socket_create_listen-win32.phpt b/ext/sockets/tests/socket_create_listen-win32.phpt index 74e6d73212f10..bbdc3b1ee9de9 100644 --- a/ext/sockets/tests/socket_create_listen-win32.phpt +++ b/ext/sockets/tests/socket_create_listen-win32.phpt @@ -15,7 +15,7 @@ socket_getsockname($sock, $addr, $port); var_dump($addr, $port); ?> --EXPECT-- -string(9) "127.0.0.1" +string(7) "0.0.0.0" int(31338) --CREDITS-- Till Klampaeckel, till@php.net From 8c7545748dfb0d181457ec87f0df159f68d768e9 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Sat, 7 Mar 2026 04:24:33 +0000 Subject: [PATCH 5/5] feedback. --- ext/sockets/conversions.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/sockets/conversions.c b/ext/sockets/conversions.c index a70d7fd0dab6c..1c735ef5e6d8f 100644 --- a/ext/sockets/conversions.c +++ b/ext/sockets/conversions.c @@ -580,7 +580,7 @@ static void to_zval_read_sin_addr(const char *data, zval *zv, res_context *ctx) return; } - Z_STRLEN_P(zv) = strlen(Z_STRVAL_P(zv)); + Z_STR_P(zv) = zend_string_truncate(Z_STR_P(zv), strlen(Z_STRVAL_P(zv)), 0); } static const field_descriptor descriptors_sockaddr_in[] = { {"family", sizeof("family"), false, offsetof(struct sockaddr_in, sin_family), from_zval_write_sa_family, to_zval_read_sa_family}, @@ -629,7 +629,7 @@ static void to_zval_read_sin6_addr(const char *data, zval *zv, res_context *ctx) return; } - Z_STRLEN_P(zv) = strlen(Z_STRVAL_P(zv)); + Z_STR_P(zv) = zend_string_truncate(Z_STR_P(zv), strlen(Z_STRVAL_P(zv)), 0); } static const field_descriptor descriptors_sockaddr_in6[] = { {"family", sizeof("family"), false, offsetof(struct sockaddr_in6, sin6_family), from_zval_write_sa_family, to_zval_read_sa_family},