@@ -1439,14 +1439,6 @@ PHP_FUNCTION(socket_bind)
1439
1439
#define ETH_SUB_CHECKLENGTH (a , lyr ) \
1440
1440
do { \
1441
1441
if ((char *)ipdata + sizeof(a) < ZSTR_VAL(recv_buf) + slen) { \
1442
- zend_string_efree(recv_buf); \
1443
- Z_DELREF_P(zpayload); \
1444
- ZEND_TRY_ASSIGN_REF_VALUE(data, obj); \
1445
- ZEND_TRY_ASSIGN_REF_STRING(addr, ifrname); \
1446
- if (index) { \
1447
- ZEND_TRY_ASSIGN_REF_LONG(index, sll.sll_ifindex);\
1448
- } \
1449
- zend_value_error("invalid %s header", lyr); \
1450
1442
return FAILURE; \
1451
1443
} \
1452
1444
} while (0)
@@ -1464,7 +1456,8 @@ static zend_result php_socket_get_chunk(zend_string *dst, const zend_string *src
1464
1456
static zend_result php_socket_afpacket_add_tcp (unsigned char * ipdata , struct sockaddr_ll sll , char * ifrname , zend_string * recv_buf ,
1465
1457
size_t slen , zval * szpayload , zval * zpayload , zval * obj , zval * data , zval * addr , zval * index , size_t headersize ) {
1466
1458
struct tcphdr tcp ;
1467
- ETH_SUB_CHECKLENGTH (tcp , "TCP" );
1459
+ if ((char * )ipdata + sizeof (tcp ) < ZSTR_VAL (recv_buf ) + slen )
1460
+ return FAILURE ;
1468
1461
memcpy (& tcp , ipdata , sizeof (tcp ));
1469
1462
object_init_ex (szpayload , tcppacket_ce );
1470
1463
zend_update_property_long (Z_OBJCE_P (szpayload ), Z_OBJ_P (szpayload ), ZEND_STRL ("srcPort" ), ntohs (tcp .th_sport ));
@@ -1479,7 +1472,8 @@ static zend_result php_socket_afpacket_add_tcp(unsigned char *ipdata, struct soc
1479
1472
static zend_result php_socket_afpacket_add_udp (unsigned char * ipdata , struct sockaddr_ll sll , char * ifrname , zend_string * recv_buf ,
1480
1473
size_t slen , zval * szpayload , zval * zpayload , zval * obj , zval * data , zval * addr , zval * index , size_t headersize ) {
1481
1474
struct udphdr udp ;
1482
- ETH_SUB_CHECKLENGTH (udp , "UDP" );
1475
+ if ((char * )ipdata + sizeof (udp ) < ZSTR_VAL (recv_buf ) + slen )
1476
+ return FAILURE ;
1483
1477
memcpy (& udp , ipdata , sizeof (udp ));
1484
1478
object_init_ex (szpayload , udppacket_ce );
1485
1479
zend_update_property_long (Z_OBJCE_P (szpayload ), Z_OBJ_P (szpayload ), ZEND_STRL ("srcPort" ), ntohs (udp .uh_sport ));
@@ -1765,9 +1759,10 @@ PHP_FUNCTION(socket_recvfrom)
1765
1759
switch (protocol ) {
1766
1760
case ETH_P_IP : {
1767
1761
if (php_socket_get_chunk (dst_buf , recv_buf , ETH_HLEN , sizeof (struct iphdr )) == FAILURE ) {
1768
- zend_value_error ( "invalid ipv4 frame buffer length" );
1762
+ zval_ptr_dtor ( & obj );
1769
1763
zend_string_release (dst_buf );
1770
1764
zend_string_efree (recv_buf );
1765
+ zend_value_error ("invalid ipv4 frame buffer length" );
1771
1766
RETURN_THROWS ();
1772
1767
}
1773
1768
payload = ((unsigned char * )ZSTR_VAL (dst_buf ));
@@ -1777,17 +1772,9 @@ PHP_FUNCTION(socket_recvfrom)
1777
1772
size_t totalip = ntohs (ip .tot_len );
1778
1773
1779
1774
if (php_socket_get_chunk (dst_buf , recv_buf , tlayer , totalip )) {
1780
- ZVAL_NULL (& zpayload );
1781
- zend_update_property (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("payload" ), & zpayload );
1782
- zend_update_property_stringl (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("rawPacket" ), ZSTR_VAL (recv_buf ), ZSTR_LEN (recv_buf ));
1775
+ zval_ptr_dtor (& obj );
1783
1776
zend_string_release (dst_buf );
1784
1777
zend_string_efree (recv_buf );
1785
- ZEND_TRY_ASSIGN_REF_VALUE (data , & obj );
1786
- ZEND_TRY_ASSIGN_REF_STRING (addr , ifrname );
1787
-
1788
- if (index ) {
1789
- ZEND_TRY_ASSIGN_REF_LONG (index , sll .sll_ifindex );
1790
- }
1791
1778
zend_value_error ("invalid transport header length" );
1792
1779
RETURN_THROWS ();
1793
1780
}
@@ -1804,74 +1791,71 @@ PHP_FUNCTION(socket_recvfrom)
1804
1791
switch (ip .protocol ) {
1805
1792
case IPPROTO_TCP : {
1806
1793
if (php_socket_get_chunk (dst_buf , recv_buf , tlayer , sizeof (struct tcphdr )) == FAILURE ) {
1807
- zend_value_error ("invalid tcp frame buffer length" );
1794
+ zval_ptr_dtor (& zpayload );
1795
+ zval_ptr_dtor (& obj );
1808
1796
zend_string_release (dst_buf );
1809
1797
zend_string_efree (recv_buf );
1798
+ zend_value_error ("invalid tcp frame buffer length" );
1810
1799
RETURN_THROWS ();
1811
1800
}
1812
1801
unsigned char * ipdata = (unsigned char * )ZSTR_VAL (dst_buf );
1813
1802
if (php_socket_afpacket_add_tcp (ipdata , sll , ifrname , recv_buf , slen , & szpayload , & zpayload , & obj , data , addr , index , ZSTR_LEN (dst_buf )) == FAILURE ) {
1803
+ zval_ptr_dtor (& zpayload );
1804
+ zval_ptr_dtor (& obj );
1814
1805
zend_string_release (dst_buf );
1815
1806
zend_string_efree (recv_buf );
1807
+ zend_value_error ("invalid tcp frame buffer length" );
1816
1808
RETURN_THROWS ();
1817
1809
}
1818
1810
break ;
1819
1811
}
1820
1812
case IPPROTO_UDP : {
1821
1813
if (php_socket_get_chunk (dst_buf , recv_buf , tlayer , sizeof (struct udphdr )) == FAILURE ) {
1822
- zend_value_error ("invalid udp frame buffer length" );
1814
+ zend_update_property (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("payload" ), & zpayload );
1815
+ zend_update_property_stringl (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("rawPacket" ), ZSTR_VAL (recv_buf ), ZSTR_LEN (recv_buf ));
1816
+ Z_DELREF_P (& zpayload );
1823
1817
zend_string_release (dst_buf );
1824
1818
zend_string_efree (recv_buf );
1819
+ zend_value_error ("invalid udp frame buffer length" );
1825
1820
RETURN_THROWS ();
1826
1821
}
1827
1822
unsigned char * ipdata = (unsigned char * )ZSTR_VAL (dst_buf );
1828
1823
if (php_socket_afpacket_add_udp (ipdata , sll , ifrname , recv_buf , slen , & szpayload , & zpayload , & obj , data , addr , index , ZSTR_LEN (dst_buf )) == FAILURE ) {
1824
+ zval_ptr_dtor (& zpayload );
1825
+ zval_ptr_dtor (& obj );
1829
1826
zend_string_release (dst_buf );
1830
1827
zend_string_efree (recv_buf );
1828
+ zend_value_error ("invalid udp frame buffer length" );
1831
1829
RETURN_THROWS ();
1832
1830
}
1833
1831
break ;
1834
1832
}
1835
1833
default :
1836
- zend_update_property (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("payload" ), & zpayload );
1837
- zend_update_property_stringl (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("rawPacket" ), ZSTR_VAL (recv_buf ), ZSTR_LEN (recv_buf ));
1838
- zend_string_efree (recv_buf );
1834
+ zval_ptr_dtor (& zpayload );
1835
+ zval_ptr_dtor (& obj );
1839
1836
zend_string_release (dst_buf );
1840
- Z_DELREF (zpayload );
1841
- ZEND_TRY_ASSIGN_REF_VALUE (data , & obj );
1842
- ZEND_TRY_ASSIGN_REF_STRING (addr , ifrname );
1843
-
1844
- if (index ) {
1845
- ZEND_TRY_ASSIGN_REF_LONG (index , sll .sll_ifindex );
1846
- }
1837
+ zend_string_efree (recv_buf );
1847
1838
zend_value_error ("unsupported ip header protocol" );
1848
1839
RETURN_THROWS ();
1849
1840
}
1850
1841
break ;
1851
1842
}
1852
1843
case ETH_P_IPV6 : {
1853
1844
if (php_socket_get_chunk (dst_buf , recv_buf , ETH_HLEN , sizeof (struct iphdr )) == FAILURE ) {
1854
- zend_value_error ( "invalid ipv4 frame buffer length" );
1845
+ zval_ptr_dtor ( & obj );
1855
1846
zend_string_release (dst_buf );
1856
1847
zend_string_efree (recv_buf );
1848
+ zend_value_error ("invalid ipv4 frame buffer length" );
1857
1849
RETURN_THROWS ();
1858
1850
}
1859
1851
payload = ((unsigned char * )ZSTR_VAL (dst_buf ));
1860
1852
struct ipv6hdr ip ;
1861
1853
memcpy (& ip , payload , sizeof (ip ));
1862
1854
size_t totalip = sizeof (ip ) + ip .payload_len ;
1863
1855
if (totalip < slen ) {
1864
- ZVAL_NULL (& zpayload );
1865
- zend_update_property (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("payload" ), & zpayload );
1866
- zend_update_property_string (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("rawPacket" ), ZSTR_VAL (recv_buf ));
1867
- zend_string_efree (recv_buf );
1856
+ zval_ptr_dtor (& obj );
1868
1857
zend_string_release (dst_buf );
1869
- ZEND_TRY_ASSIGN_REF_VALUE (data , & obj );
1870
- ZEND_TRY_ASSIGN_REF_STRING (addr , ifrname );
1871
-
1872
- if (index ) {
1873
- ZEND_TRY_ASSIGN_REF_LONG (index , sll .sll_ifindex );
1874
- }
1858
+ zend_string_efree (recv_buf );
1875
1859
zend_value_error ("invalid transport header length" );
1876
1860
RETURN_THROWS ();
1877
1861
}
@@ -1889,69 +1873,71 @@ PHP_FUNCTION(socket_recvfrom)
1889
1873
switch (ipprotocol ) {
1890
1874
case IPPROTO_TCP : {
1891
1875
if (php_socket_get_chunk (dst_buf , recv_buf , sizeof (ip ), sizeof (struct tcphdr )) == FAILURE ) {
1892
- zend_value_error ("invalid tcp frame buffer length" );
1876
+ zval_ptr_dtor (& zpayload );
1877
+ zval_ptr_dtor (& obj );
1893
1878
zend_string_release (dst_buf );
1894
1879
zend_string_efree (recv_buf );
1880
+ zend_value_error ("invalid tcp frame buffer length" );
1895
1881
RETURN_THROWS ();
1896
1882
}
1897
1883
unsigned char * ipdata = (unsigned char * )ZSTR_VAL (dst_buf );
1898
1884
if (php_socket_afpacket_add_tcp (ipdata , sll , ifrname , recv_buf , slen , & szpayload , & zpayload , & obj , data , addr , index , ZSTR_LEN (dst_buf )) == FAILURE ) {
1885
+ zval_ptr_dtor (& zpayload );
1886
+ zval_ptr_dtor (& obj );
1899
1887
zend_string_release (dst_buf );
1900
1888
zend_string_efree (recv_buf );
1889
+ zend_value_error ("invalid tcp frame buffer length" );
1901
1890
RETURN_THROWS ();
1902
1891
}
1903
1892
break ;
1904
1893
}
1905
1894
case IPPROTO_UDP : {
1906
1895
if (php_socket_get_chunk (dst_buf , recv_buf , sizeof (ip ), sizeof (struct udphdr )) == FAILURE ) {
1907
- zend_value_error ("invalid udp frame buffer length" );
1896
+ zval_ptr_dtor (& zpayload );
1897
+ zval_ptr_dtor (& obj );
1908
1898
zend_string_release (dst_buf );
1909
1899
zend_string_efree (recv_buf );
1900
+ zend_value_error ("invalid udp frame buffer length" );
1910
1901
RETURN_THROWS ();
1911
1902
}
1912
1903
unsigned char * ipdata = (unsigned char * )ZSTR_VAL (dst_buf );
1913
1904
if (php_socket_afpacket_add_udp (ipdata , sll , ifrname , recv_buf , slen , & szpayload , & zpayload , & obj , data , addr , data , ZSTR_LEN (dst_buf )) == FAILURE ) {
1905
+ zval_ptr_dtor (& zpayload );
1906
+ zval_ptr_dtor (& obj );
1914
1907
zend_string_release (dst_buf );
1915
1908
zend_string_efree (recv_buf );
1909
+ zend_value_error ("invalid udp frame buffer length" );
1916
1910
RETURN_THROWS ();
1917
1911
}
1918
1912
break ;
1919
1913
}
1920
1914
// TODO IPPROTO_ICMPV6 support
1921
1915
default :
1922
- zend_update_property ( Z_OBJCE ( obj ), Z_OBJ ( obj ), ZEND_STRL ( "payload" ), & zpayload );
1923
- zend_update_property_stringl ( Z_OBJCE ( obj ), Z_OBJ ( obj ), ZEND_STRL ( "rawPacket" ), ZSTR_VAL ( recv_buf ), ZSTR_LEN ( recv_buf ) );
1916
+ zval_ptr_dtor ( & zpayload );
1917
+ zval_ptr_dtor ( & obj );
1924
1918
zend_string_efree (recv_buf );
1925
1919
zend_string_release (dst_buf );
1926
- Z_DELREF (zpayload );
1927
- ZEND_TRY_ASSIGN_REF_VALUE (data , & obj );
1928
- ZEND_TRY_ASSIGN_REF_STRING (addr , ifrname );
1929
-
1930
- if (index ) {
1931
- ZEND_TRY_ASSIGN_REF_LONG (index , sll .sll_ifindex );
1932
- }
1933
1920
zend_value_error ("unsupported ipv6 header protocol" );
1934
1921
RETURN_THROWS ();
1935
1922
}
1936
1923
break ;
1937
1924
}
1938
1925
case ETH_P_LOOP : {
1939
1926
if (php_socket_get_chunk (dst_buf , recv_buf , ETH_HLEN , ETH_HLEN ) == FAILURE ) {
1940
- zend_value_error ("invalid ethernet frame buffer length" );
1927
+ zval_ptr_dtor (& zpayload );
1928
+ zval_ptr_dtor (& obj );
1941
1929
zend_string_efree (recv_buf );
1942
1930
zend_string_release (dst_buf );
1931
+ zend_value_error ("invalid ethernet frame buffer length" );
1943
1932
RETURN_THROWS ();
1944
1933
}
1945
1934
struct ethhdr innere ;
1946
1935
payload = (unsigned char * )ZSTR_VAL (dst_buf );
1947
1936
if ((char * )payload + sizeof (innere ) < ZSTR_VAL (recv_buf ) + slen ) {
1948
- zend_string_efree (recv_buf );
1937
+ zval_ptr_dtor (& zpayload );
1938
+ zval_ptr_dtor (& obj );
1949
1939
zend_string_release (dst_buf );
1950
- ZEND_TRY_ASSIGN_REF_VALUE (data , & obj );
1951
- ZEND_TRY_ASSIGN_REF_STRING (addr , ifrname );
1952
- if (index ) {
1953
- ZEND_TRY_ASSIGN_REF_LONG (index , sll .sll_ifindex );
1954
- }
1940
+ zend_string_efree (recv_buf );
1955
1941
zend_value_error ("invalid ethernet loop header" );
1956
1942
RETURN_THROWS ();
1957
1943
}
@@ -1969,18 +1955,10 @@ PHP_FUNCTION(socket_recvfrom)
1969
1955
break ;
1970
1956
}
1971
1957
default :
1972
- ZVAL_NULL (& zpayload );
1973
- zend_update_property (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("payload" ), & zpayload );
1974
- zend_update_property_string (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("rawPacket" ), ZSTR_VAL (recv_buf ));
1975
- zend_string_efree (recv_buf );
1958
+ zval_ptr_dtor (& zpayload );
1959
+ zval_ptr_dtor (& obj );
1976
1960
zend_string_release (dst_buf );
1977
-
1978
- ZEND_TRY_ASSIGN_REF_VALUE (data , & obj );
1979
- ZEND_TRY_ASSIGN_REF_STRING (addr , ifrname );
1980
-
1981
- if (index ) {
1982
- ZEND_TRY_ASSIGN_REF_LONG (index , sll .sll_ifindex );
1983
- }
1961
+ zend_string_efree (recv_buf );
1984
1962
zend_value_error ("unsupported ethernet protocol" );
1985
1963
RETURN_THROWS ();
1986
1964
}
@@ -1990,8 +1968,8 @@ PHP_FUNCTION(socket_recvfrom)
1990
1968
zend_update_property (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("payload" ), & zpayload );
1991
1969
zend_update_property_stringl (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("rawPacket" ), ZSTR_VAL (recv_buf ), ZSTR_LEN (recv_buf ));
1992
1970
Z_DELREF (zpayload );
1971
+ zend_string_release (dst_buf );
1993
1972
zend_string_efree (recv_buf );
1994
- zend_string_free (dst_buf );
1995
1973
1996
1974
ZEND_TRY_ASSIGN_REF_VALUE (data , & obj );
1997
1975
ZEND_TRY_ASSIGN_REF_STRING (addr , ifrname );
@@ -2062,7 +2040,7 @@ PHP_FUNCTION(socket_sendto)
2062
2040
// ether header + payload
2063
2041
// TODO dealing with SOCK_DGRAM
2064
2042
if (php_sock -> type == AF_PACKET && len < 60 ) {
2065
- zend_argument_value_error (3 , "must be at least 64 for AF_PACKET" );
2043
+ zend_argument_value_error (3 , "must be at least 60 for AF_PACKET" );
2066
2044
RETURN_THROWS ();
2067
2045
}
2068
2046
#endif
0 commit comments