51
51
# include <fcntl.h>
52
52
# include <signal.h>
53
53
# include <sys/uio.h>
54
- # define IS_INVALID_SOCKET (a ) (a->bsd_socket < 0)
55
54
# define set_errno (a ) (errno = a)
56
55
# include "php_sockets.h"
57
56
# if HAVE_IF_NAMETOINDEX
@@ -659,6 +658,10 @@ static int php_sock_array_to_fd_set(uint32_t arg_num, zval *sock_array, fd_set *
659
658
}
660
659
661
660
php_sock = Z_SOCKET_P (element );
661
+ if (IS_INVALID_SOCKET (php_sock )) {
662
+ zend_argument_type_error (arg_num , "contains a closed socket" );
663
+ return -1 ;
664
+ }
662
665
663
666
PHP_SAFE_FD_SET (php_sock -> bsd_socket , fds );
664
667
if (php_sock -> bsd_socket > * max_fd ) {
@@ -689,6 +692,7 @@ static int php_sock_array_from_fd_set(zval *sock_array, fd_set *fds) /* {{{ */
689
692
690
693
php_sock = Z_SOCKET_P (element );
691
694
ZEND_ASSERT (php_sock ); /* element is supposed to be Socket object */
695
+ ZEND_ASSERT (!IS_INVALID_SOCKET (php_sock ));
692
696
693
697
if (PHP_SAFE_FD_ISSET (php_sock -> bsd_socket , fds )) {
694
698
/* Add fd to new array */
@@ -825,6 +829,7 @@ PHP_FUNCTION(socket_accept)
825
829
}
826
830
827
831
php_sock = Z_SOCKET_P (arg1 );
832
+ ENSURE_SOCKET_VALID (php_sock );
828
833
829
834
object_init_ex (return_value , socket_ce );
830
835
new_sock = Z_SOCKET_P (return_value );
@@ -847,6 +852,7 @@ PHP_FUNCTION(socket_set_nonblock)
847
852
}
848
853
849
854
php_sock = Z_SOCKET_P (arg1 );
855
+ ENSURE_SOCKET_VALID (php_sock );
850
856
851
857
if (!Z_ISUNDEF (php_sock -> zstream )) {
852
858
php_stream * stream ;
@@ -882,6 +888,7 @@ PHP_FUNCTION(socket_set_block)
882
888
}
883
889
884
890
php_sock = Z_SOCKET_P (arg1 );
891
+ ENSURE_SOCKET_VALID (php_sock );
885
892
886
893
/* if socket was created from a stream, give the stream a chance to take
887
894
* care of the operation itself, thereby allowing it to update its internal
@@ -920,6 +927,7 @@ PHP_FUNCTION(socket_listen)
920
927
}
921
928
922
929
php_sock = Z_SOCKET_P (arg1 );
930
+ ENSURE_SOCKET_VALID (php_sock );
923
931
924
932
if (listen (php_sock -> bsd_socket , backlog ) != 0 ) {
925
933
PHP_SOCKET_ERROR (php_sock , "unable to listen on socket" , errno );
@@ -940,6 +948,7 @@ PHP_FUNCTION(socket_close)
940
948
}
941
949
942
950
php_socket = Z_SOCKET_P (arg1 );
951
+ ENSURE_SOCKET_VALID (php_socket );
943
952
944
953
if (!Z_ISUNDEF (php_socket -> zstream )) {
945
954
php_stream * stream = NULL ;
@@ -978,6 +987,7 @@ PHP_FUNCTION(socket_write)
978
987
}
979
988
980
989
php_sock = Z_SOCKET_P (arg1 );
990
+ ENSURE_SOCKET_VALID (php_sock );
981
991
982
992
if (length < 0 ) {
983
993
zend_argument_value_error (3 , "must be greater than or equal to 0" );
@@ -1017,6 +1027,7 @@ PHP_FUNCTION(socket_read)
1017
1027
}
1018
1028
1019
1029
php_sock = Z_SOCKET_P (arg1 );
1030
+ ENSURE_SOCKET_VALID (php_sock );
1020
1031
1021
1032
/* overflow check */
1022
1033
if ((length + 1 ) < 2 ) {
@@ -1081,6 +1092,7 @@ PHP_FUNCTION(socket_getsockname)
1081
1092
}
1082
1093
1083
1094
php_sock = Z_SOCKET_P (arg1 );
1095
+ ENSURE_SOCKET_VALID (php_sock );
1084
1096
1085
1097
sa = (struct sockaddr * ) & sa_storage ;
1086
1098
@@ -1152,6 +1164,7 @@ PHP_FUNCTION(socket_getpeername)
1152
1164
}
1153
1165
1154
1166
php_sock = Z_SOCKET_P (arg1 );
1167
+ ENSURE_SOCKET_VALID (php_sock );
1155
1168
1156
1169
sa = (struct sockaddr * ) & sa_storage ;
1157
1170
@@ -1264,6 +1277,7 @@ PHP_FUNCTION(socket_connect)
1264
1277
}
1265
1278
1266
1279
php_sock = Z_SOCKET_P (resource_socket );
1280
+ ENSURE_SOCKET_VALID (php_sock );
1267
1281
1268
1282
switch (php_sock -> type ) {
1269
1283
#if HAVE_IPV6
@@ -1366,6 +1380,7 @@ PHP_FUNCTION(socket_bind)
1366
1380
}
1367
1381
1368
1382
php_sock = Z_SOCKET_P (arg1 );
1383
+ ENSURE_SOCKET_VALID (php_sock );
1369
1384
1370
1385
switch (php_sock -> type ) {
1371
1386
case AF_UNIX :
@@ -1443,6 +1458,7 @@ PHP_FUNCTION(socket_recv)
1443
1458
}
1444
1459
1445
1460
php_sock = Z_SOCKET_P (php_sock_res );
1461
+ ENSURE_SOCKET_VALID (php_sock );
1446
1462
1447
1463
/* overflow check */
1448
1464
if ((len + 1 ) < 2 ) {
@@ -1482,13 +1498,14 @@ PHP_FUNCTION(socket_send)
1482
1498
RETURN_THROWS ();
1483
1499
}
1484
1500
1501
+ php_sock = Z_SOCKET_P (arg1 );
1502
+ ENSURE_SOCKET_VALID (php_sock );
1503
+
1485
1504
if (len < 0 ) {
1486
1505
zend_argument_value_error (3 , "must be greater than or equal to 0" );
1487
1506
RETURN_THROWS ();
1488
1507
}
1489
1508
1490
- php_sock = Z_SOCKET_P (arg1 );
1491
-
1492
1509
retval = send (php_sock -> bsd_socket , buf , (buf_len < (size_t )len ? buf_len : (size_t )len ), flags );
1493
1510
1494
1511
if (retval == (size_t )-1 ) {
@@ -1522,6 +1539,7 @@ PHP_FUNCTION(socket_recvfrom)
1522
1539
}
1523
1540
1524
1541
php_sock = Z_SOCKET_P (arg1 );
1542
+ ENSURE_SOCKET_VALID (php_sock );
1525
1543
1526
1544
/* overflow check */
1527
1545
/* Shouldthrow ? */
@@ -1635,13 +1653,14 @@ PHP_FUNCTION(socket_sendto)
1635
1653
RETURN_THROWS ();
1636
1654
}
1637
1655
1656
+ php_sock = Z_SOCKET_P (arg1 );
1657
+ ENSURE_SOCKET_VALID (php_sock );
1658
+
1638
1659
if (len < 0 ) {
1639
1660
zend_argument_value_error (3 , "must be greater than or equal to 0" );
1640
1661
RETURN_THROWS ();
1641
1662
}
1642
1663
1643
- php_sock = Z_SOCKET_P (arg1 );
1644
-
1645
1664
switch (php_sock -> type ) {
1646
1665
case AF_UNIX :
1647
1666
memset (& s_un , 0 , sizeof (s_un ));
@@ -1718,6 +1737,7 @@ PHP_FUNCTION(socket_get_option)
1718
1737
}
1719
1738
1720
1739
php_sock = Z_SOCKET_P (arg1 );
1740
+ ENSURE_SOCKET_VALID (php_sock );
1721
1741
1722
1742
if (level == IPPROTO_IP ) {
1723
1743
switch (optname ) {
@@ -1830,6 +1850,7 @@ PHP_FUNCTION(socket_set_option)
1830
1850
}
1831
1851
1832
1852
php_sock = Z_SOCKET_P (arg1 );
1853
+ ENSURE_SOCKET_VALID (php_sock );
1833
1854
1834
1855
set_errno (0 );
1835
1856
@@ -2027,6 +2048,7 @@ PHP_FUNCTION(socket_shutdown)
2027
2048
}
2028
2049
2029
2050
php_sock = Z_SOCKET_P (arg1 );
2051
+ ENSURE_SOCKET_VALID (php_sock );
2030
2052
2031
2053
if (shutdown (php_sock -> bsd_socket , how_shutdown ) != 0 ) {
2032
2054
PHP_SOCKET_ERROR (php_sock , "Unable to shutdown socket" , errno );
@@ -2050,6 +2072,8 @@ PHP_FUNCTION(socket_last_error)
2050
2072
2051
2073
if (arg1 ) {
2052
2074
php_sock = Z_SOCKET_P (arg1 );
2075
+ ENSURE_SOCKET_VALID (php_sock );
2076
+
2053
2077
RETVAL_LONG (php_sock -> error );
2054
2078
} else {
2055
2079
RETVAL_LONG (SOCKETS_G (last_error ));
@@ -2069,6 +2093,8 @@ PHP_FUNCTION(socket_clear_error)
2069
2093
2070
2094
if (arg1 ) {
2071
2095
php_sock = Z_SOCKET_P (arg1 );
2096
+ ENSURE_SOCKET_VALID (php_sock );
2097
+
2072
2098
php_sock -> error = 0 ;
2073
2099
} else {
2074
2100
SOCKETS_G (last_error ) = 0 ;
@@ -2179,6 +2205,7 @@ PHP_FUNCTION(socket_export_stream)
2179
2205
}
2180
2206
2181
2207
socket = Z_SOCKET_P (zsocket );
2208
+ ENSURE_SOCKET_VALID (socket );
2182
2209
2183
2210
/* Either we already exported a stream or the socket came from an import,
2184
2211
* just return the existing stream */
@@ -2520,6 +2547,7 @@ PHP_FUNCTION(socket_wsaprotocol_info_export)
2520
2547
}
2521
2548
2522
2549
socket = Z_SOCKET_P (arg1 );
2550
+ ENSURE_SOCKET_VALID (socket );
2523
2551
2524
2552
if (SOCKET_ERROR == WSADuplicateSocket (socket -> bsd_socket , (DWORD )target_pid , & wi )) {
2525
2553
DWORD err = WSAGetLastError ();
0 commit comments