ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(sock_array), element) {
ZVAL_DEREF(element);
php_sock = (php_socket*) zend_fetch_resource_ex(element, le_socket_name, le_socket);
- if (!php_sock) continue; /* If element is not a resource, skip it */
+ if (!php_sock) return -1; /* If element is not a resource, bail out */
PHP_SAFE_FD_SET(php_sock->bsd_socket, fds);
if (php_sock->bsd_socket > *max_fd) {
ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(sock_array), num_key, key, element) {
ZVAL_DEREF(element);
php_sock = (php_socket*) zend_fetch_resource_ex(element, le_socket_name, le_socket);
- if (!php_sock) continue; /* If element is not a resource, skip it */
+ ZEND_ASSERT(php_sock); /* element is supposed to be resource */
if (PHP_SAFE_FD_ISSET(php_sock->bsd_socket, fds)) {
/* Add fd to new array */
FD_ZERO(&wfds);
FD_ZERO(&efds);
- if (r_array != NULL) sets += php_sock_array_to_fd_set(r_array, &rfds, &max_fd);
- if (w_array != NULL) sets += php_sock_array_to_fd_set(w_array, &wfds, &max_fd);
- if (e_array != NULL) sets += php_sock_array_to_fd_set(e_array, &efds, &max_fd);
+ if (r_array != NULL) {
+ sets += retval = php_sock_array_to_fd_set(r_array, &rfds, &max_fd);
+ if (retval == -1) {
+ return;
+ }
+ }
+ if (w_array != NULL) {
+ sets += retval = php_sock_array_to_fd_set(w_array, &wfds, &max_fd);
+ if (retval == -1) {
+ return;
+ }
+ }
+ if (e_array != NULL) {
+ sets += retval = php_sock_array_to_fd_set(e_array, &efds, &max_fd);
+ if (retval == -1) {
+ return;
+ }
+ }
if (!sets) {
php_error_docref(NULL, E_WARNING, "no resource arrays were passed to select");
--- /dev/null
+--TEST--
+socket_select() error conditions
+--SKIPIF--
+<?php
+if (!extension_loaded('sockets')) die('skip socket extension not available');
+?>
+--FILE--
+<?php
+$r = $w = $e = ['no resource'];
+try {
+ socket_select($r, $w, $e, 1);
+} catch (TypeError $ex) {
+ echo $ex->getMessage(), PHP_EOL;
+}
+?>
+--EXPECT--
+socket_select(): supplied argument is not a valid Socket resource