summaryrefslogtreecommitdiff
path: root/ext/sockets/sockets.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/sockets/sockets.c')
-rw-r--r--ext/sockets/sockets.c40
1 files changed, 24 insertions, 16 deletions
diff --git a/ext/sockets/sockets.c b/ext/sockets/sockets.c
index 9e06b2871..dab8e3840 100644
--- a/ext/sockets/sockets.c
+++ b/ext/sockets/sockets.c
@@ -19,7 +19,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: sockets.c 306939 2011-01-01 02:19:59Z felipe $ */
+/* $Id: sockets.c 313665 2011-07-25 11:42:53Z felipe $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -300,7 +300,7 @@ const zend_function_entry sockets_functions[] = {
PHP_FALIAS(socket_getopt, socket_get_option, arginfo_socket_get_option)
PHP_FALIAS(socket_setopt, socket_set_option, arginfo_socket_set_option)
- {NULL, NULL, NULL}
+ PHP_FE_END
};
/* }}} */
@@ -394,16 +394,13 @@ static int php_open_listen_sock(php_socket **php_sock, int port, int backlog TSR
}
/* }}} */
-static int php_accept_connect(php_socket *in_sock, php_socket **new_sock, struct sockaddr *la TSRMLS_DC) /* {{{ */
+static int php_accept_connect(php_socket *in_sock, php_socket **new_sock, struct sockaddr *la, socklen_t *la_len TSRMLS_DC) /* {{{ */
{
- socklen_t salen;
php_socket *out_sock = (php_socket*)emalloc(sizeof(php_socket));
*new_sock = out_sock;
- salen = sizeof(*la);
- out_sock->blocking = 1;
- out_sock->bsd_socket = accept(in_sock->bsd_socket, la, &salen);
+ out_sock->bsd_socket = accept(in_sock->bsd_socket, la, la_len);
if (IS_INVALID_SOCKET(out_sock)) {
PHP_SOCKET_ERROR(out_sock, "unable to accept incoming connection", errno);
@@ -411,6 +408,10 @@ static int php_accept_connect(php_socket *in_sock, php_socket **new_sock, struct
return 0;
}
+ out_sock->error = 0;
+ out_sock->blocking = 1;
+ out_sock->type = la->sa_family;
+
return 1;
}
/* }}} */
@@ -880,9 +881,10 @@ PHP_FUNCTION(socket_create_listen)
Accepts a connection on the listening socket fd */
PHP_FUNCTION(socket_accept)
{
- zval *arg1;
- php_socket *php_sock, *new_sock;
- struct sockaddr_in sa;
+ zval *arg1;
+ php_socket *php_sock, *new_sock;
+ php_sockaddr_storage sa;
+ socklen_t sa_len = sizeof(sa);
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &arg1) == FAILURE) {
return;
@@ -890,13 +892,10 @@ PHP_FUNCTION(socket_accept)
ZEND_FETCH_RESOURCE(php_sock, php_socket *, &arg1, -1, le_socket_name, le_socket);
- if (!php_accept_connect(php_sock, &new_sock, (struct sockaddr *) &sa TSRMLS_CC)) {
+ if (!php_accept_connect(php_sock, &new_sock, (struct sockaddr*)&sa, &sa_len TSRMLS_CC)) {
RETURN_FALSE;
}
- new_sock->error = 0;
- new_sock->blocking = 1;
-
ZEND_REGISTER_RESOURCE(return_value, new_sock, le_socket);
}
/* }}} */
@@ -917,8 +916,10 @@ PHP_FUNCTION(socket_set_nonblock)
if (php_set_sock_blocking(php_sock->bsd_socket, 0 TSRMLS_CC) == SUCCESS) {
php_sock->blocking = 0;
RETURN_TRUE;
+ } else {
+ PHP_SOCKET_ERROR(php_sock, "unable to set nonblocking mode", errno);
+ RETURN_FALSE;
}
- RETURN_FALSE;
}
/* }}} */
@@ -938,8 +939,10 @@ PHP_FUNCTION(socket_set_block)
if (php_set_sock_blocking(php_sock->bsd_socket, 1 TSRMLS_CC) == SUCCESS) {
php_sock->blocking = 1;
RETURN_TRUE;
+ } else {
+ PHP_SOCKET_ERROR(php_sock, "unable to set blocking mode", errno);
+ RETURN_FALSE;
}
- RETURN_FALSE;
}
/* }}} */
@@ -1333,6 +1336,11 @@ PHP_FUNCTION(socket_connect)
break;
case AF_UNIX:
+ if (addr_len >= sizeof(s_un.sun_path)) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Path too long");
+ RETURN_FALSE;
+ }
+
memset(&s_un, 0, sizeof(struct sockaddr_un));
s_un.sun_family = AF_UNIX;