diff options
-rw-r--r-- | main/streams/xp_socket.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/main/streams/xp_socket.c b/main/streams/xp_socket.c index 7a21fbef44..bf7e98c56b 100644 --- a/main/streams/xp_socket.c +++ b/main/streams/xp_socket.c @@ -266,16 +266,26 @@ static inline int sock_recvfrom(php_netstream_data_t *sock, char *buf, size_t bu struct sockaddr **addr, socklen_t *addrlen ) { - php_sockaddr_storage sa; - socklen_t sl = sizeof(sa); int ret; int want_addr = textaddr || addr; if (want_addr) { + php_sockaddr_storage sa; + socklen_t sl = sizeof(sa); ret = recvfrom(sock->socket, buf, XP_SOCK_BUF_SIZE(buflen), flags, (struct sockaddr*)&sa, &sl); ret = (ret == SOCK_CONN_ERR) ? -1 : ret; - php_network_populate_name_from_sockaddr((struct sockaddr*)&sa, sl, - textaddr, addr, addrlen); + if (sl) { + php_network_populate_name_from_sockaddr((struct sockaddr*)&sa, sl, + textaddr, addr, addrlen); + } else { + if (textaddr) { + *textaddr = ZSTR_EMPTY_ALLOC(); + } + if (addr) { + *addr = NULL; + *addrlen = 0; + } + } } else { ret = recv(sock->socket, buf, XP_SOCK_BUF_SIZE(buflen), flags); ret = (ret == SOCK_CONN_ERR) ? -1 : ret; |