@@ -579,7 +579,7 @@ static int php_sock_array_to_fd_set(uint32_t arg_num, zval *sock_array, fd_set *
579579 num ++ ;
580580 } ZEND_HASH_FOREACH_END ();
581581
582- return num ? 1 : 0 ;
582+ return num ;
583583}
584584/* }}} */
585585
@@ -630,7 +630,7 @@ PHP_FUNCTION(socket_select)
630630 struct timeval * tv_p = NULL ;
631631 fd_set rfds , wfds , efds ;
632632 PHP_SOCKET max_fd = 0 ;
633- int retval , sets = 0 ;
633+ int retval , max_set_count = 0 ;
634634 zend_long sec , usec = 0 ;
635635 bool sec_is_null = 0 ;
636636
@@ -648,30 +648,39 @@ PHP_FUNCTION(socket_select)
648648 FD_ZERO (& efds );
649649
650650 if (r_array != NULL ) {
651- sets += retval = php_sock_array_to_fd_set (1 , r_array , & rfds , & max_fd );
651+ retval = php_sock_array_to_fd_set (1 , r_array , & rfds , & max_fd );
652652 if (retval == -1 ) {
653653 RETURN_THROWS ();
654654 }
655+ if (retval > max_set_count ) {
656+ max_set_count = retval ;
657+ }
655658 }
656659 if (w_array != NULL ) {
657- sets += retval = php_sock_array_to_fd_set (2 , w_array , & wfds , & max_fd );
660+ retval = php_sock_array_to_fd_set (2 , w_array , & wfds , & max_fd );
658661 if (retval == -1 ) {
659662 RETURN_THROWS ();
660663 }
664+ if (retval > max_set_count ) {
665+ max_set_count = retval ;
666+ }
661667 }
662668 if (e_array != NULL ) {
663- sets += retval = php_sock_array_to_fd_set (3 , e_array , & efds , & max_fd );
669+ retval = php_sock_array_to_fd_set (3 , e_array , & efds , & max_fd );
664670 if (retval == -1 ) {
665671 RETURN_THROWS ();
666672 }
673+ if (retval > max_set_count ) {
674+ max_set_count = retval ;
675+ }
667676 }
668677
669- if (!sets ) {
678+ if (!max_set_count ) {
670679 zend_value_error ("socket_select(): At least one array argument must be passed" );
671680 RETURN_THROWS ();
672681 }
673682
674- if (!PHP_SAFE_MAX_FD (max_fd , 0 )) {
683+ if (!PHP_SAFE_MAX_FD (max_fd , max_set_count )) {
675684 RETURN_FALSE ;
676685 }
677686
0 commit comments