@@ -1697,7 +1697,7 @@ PHP_FUNCTION(socket_recvfrom)
1697
1697
zval * addr = arg5 ;
1698
1698
zval * index = arg6 ;
1699
1699
if (recv_flags > 0 && (recv_flags & ~(MSG_PEEK |MSG_DONTWAIT |MSG_ERRQUEUE ))) {
1700
- zend_argument_value_error (4 , "must set one the flags MSG_PEEK, MSG_DONTWAIT, MSG_ERRQUEUE" );
1700
+ zend_argument_value_error (4 , "must be 0 or more of MSG_PEEK, MSG_DONTWAIT, MSG_ERRQUEUE" );
1701
1701
zend_string_efree (recv_buf );
1702
1702
RETURN_THROWS ();
1703
1703
}
@@ -1768,10 +1768,12 @@ PHP_FUNCTION(socket_recvfrom)
1768
1768
}
1769
1769
struct iphdr ip ;
1770
1770
memcpy (& ip , ether_hdr_buf .buf , sizeof (ip ));
1771
+ struct php_socket_chunk ip_hdr_buf ;
1772
+ memcpy (& ip_hdr_buf , & ether_hdr_buf , sizeof (struct php_socket_chunk ));
1771
1773
size_t tlayer = ip .ihl * 4 ;
1772
1774
size_t totalip = ntohs (ip .tot_len );
1773
1775
1774
- if (php_socket_get_chunk (& ether_hdr_buf , & raw_buf , tlayer , totalip )) {
1776
+ if (php_socket_get_chunk (& ip_hdr_buf , & raw_buf , tlayer , totalip )) {
1775
1777
zval_ptr_dtor (& obj );
1776
1778
zend_string_efree (recv_buf );
1777
1779
zend_value_error ("invalid transport header length" );
@@ -1785,30 +1787,30 @@ PHP_FUNCTION(socket_recvfrom)
1785
1787
zend_update_property_string (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("srcAddr" ), inet_ntoa (s ));
1786
1788
zend_update_property_string (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("dstAddr" ), inet_ntoa (d ));
1787
1789
zend_update_property_long (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("headerSize" ), totalip );
1788
- zend_update_property_stringl (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("rawPacket" ), (char * )ether_hdr_buf .buf , ether_hdr_buf .chunk_len );
1790
+ zend_update_property_stringl (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("rawPacket" ), (char * )ether_hdr_buf .buf , ether_hdr_buf .buf_len );
1789
1791
1790
1792
switch (ip .protocol ) {
1791
1793
case IPPROTO_TCP : {
1792
- if (php_socket_get_chunk (& ether_hdr_buf , & raw_buf , tlayer , sizeof (struct tcphdr )) == FAILURE ) {
1794
+ if (php_socket_get_chunk (& ip_hdr_buf , & raw_buf , tlayer , sizeof (struct tcphdr )) == FAILURE ) {
1793
1795
zval_ptr_dtor (& zpayload );
1794
1796
zval_ptr_dtor (& obj );
1795
1797
zend_string_efree (recv_buf );
1796
1798
zend_value_error ("invalid tcp frame buffer length" );
1797
1799
RETURN_THROWS ();
1798
1800
}
1799
- php_socket_afpacket_add_tcp (ether_hdr_buf .buf , sll , ifrname , & szpayload , & zpayload );
1801
+ php_socket_afpacket_add_tcp (ip_hdr_buf .buf , sll , ifrname , & szpayload , & zpayload );
1800
1802
break ;
1801
1803
}
1802
1804
case IPPROTO_UDP : {
1803
- if (php_socket_get_chunk (& ether_hdr_buf , & raw_buf , tlayer , sizeof (struct udphdr )) == FAILURE ) {
1805
+ if (php_socket_get_chunk (& ip_hdr_buf , & raw_buf , tlayer , sizeof (struct udphdr )) == FAILURE ) {
1804
1806
zend_update_property (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("payload" ), & zpayload );
1805
1807
zend_update_property_stringl (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("rawPacket" ), ZSTR_VAL (recv_buf ), ZSTR_LEN (recv_buf ));
1806
1808
Z_DELREF_P (& zpayload );
1807
1809
zend_string_efree (recv_buf );
1808
1810
zend_value_error ("invalid udp frame buffer length" );
1809
1811
RETURN_THROWS ();
1810
1812
}
1811
- php_socket_afpacket_add_udp (ether_hdr_buf .buf , sll , ifrname , & szpayload , & zpayload );
1813
+ php_socket_afpacket_add_udp (ip_hdr_buf .buf , sll , ifrname , & szpayload , & zpayload );
1812
1814
break ;
1813
1815
}
1814
1816
default :
@@ -1821,7 +1823,9 @@ PHP_FUNCTION(socket_recvfrom)
1821
1823
break ;
1822
1824
}
1823
1825
case ETH_P_IPV6 : {
1824
- if (php_socket_get_chunk (& ether_hdr_buf , & raw_buf , ETH_HLEN , sizeof (struct ipv6hdr )) == FAILURE ) {
1826
+ struct php_socket_chunk ip_hdr_buf ;
1827
+ memcpy (& ip_hdr_buf , & ether_hdr_buf , sizeof (struct php_socket_chunk ));
1828
+ if (php_socket_get_chunk (& ip_hdr_buf , & raw_buf , ETH_HLEN , sizeof (struct ipv6hdr )) == FAILURE ) {
1825
1829
zval_ptr_dtor (& obj );
1826
1830
zend_string_efree (recv_buf );
1827
1831
zend_value_error ("invalid ipv6 frame buffer length" );
@@ -1830,10 +1834,10 @@ PHP_FUNCTION(socket_recvfrom)
1830
1834
struct ipv6hdr ip ;
1831
1835
memcpy (& ip , ether_hdr_buf .buf , sizeof (ip ));
1832
1836
size_t totalip = sizeof (ip ) + ip .payload_len ;
1833
- if (totalip < slen ) {
1837
+ if (totalip > ether_hdr_buf . buf_len ) {
1834
1838
zval_ptr_dtor (& obj );
<
10000
td data-grid-cell-id="diff-730277882c3c62cdfd15a1aef5ec7a1f2b7ca427deb89f432d44785c5869a311-1835-1839-0" data-selected="false" role="gridcell" style="background-color:var(--bgColor-default);text-align:center" tabindex="-1" valign="top" class="focusable-grid-cell diff-line-number position-relative diff-line-number-neutral left-side">1835
1839
zend_string_efree (recv_buf );
1836
- zend_value_error ("invalid transport header length" );
1840
+ zend_value_error ("invalid ipv6 payload length" );
1837
1841
RETURN_THROWS ();
1838
1842
}
1839
1843
char s [INET6_ADDRSTRLEN ], d [INET6_ADDRSTRLEN ];
@@ -1849,25 +1853,25 @@ PHP_FUNCTION(socket_recvfrom)
1849
1853
1850
1854
switch (ipprotocol ) {
1851
1855
case IPPROTO_TCP : {
1852
- if (php_socket_get_chunk (& ether_hdr_buf , & raw_buf , sizeof (ip ), sizeof (struct tcphdr )) == FAILURE ) {
1856
+ if (php_socket_get_chunk (& ip_hdr_buf , & raw_buf , sizeof (ip ), sizeof (struct tcphdr )) == FAILURE ) {
1853
1857
zval_ptr_dtor (& zpayload );
1854
1858
zval_ptr_dtor (& obj );
1855
1859
zend_string_efree (recv_buf );
1856
1860
zend_value_error ("invalid tcp frame buffer length" );
1857
1861
RETURN_THROWS ();
1858
1862
}
1859
- php_socket_afpacket_add_tcp (ether_hdr_buf .buf , sll , ifrname , & szpayload , & zpayload );
1863
+ php_socket_afpacket_add_tcp (ip_hdr_buf .buf , sll , ifrname , & szpayload , & zpayload );
1860
1864
break ;
1861
1865
}
1862
1866
case IPPROTO_UDP : {
1863
- if (php_socket_get_chunk (& ether_hdr_buf , & raw_buf , sizeof (ip ), sizeof (struct udphdr )) == FAILURE ) {
1867
+ if (php_socket_get_chunk (& ip_hdr_buf , & raw_buf , sizeof (ip ), sizeof (struct udphdr )) == FAILURE ) {
1864
1868
zval_ptr_dtor (& zpayload );
1865
1869
zval_ptr_dtor (& obj );
1866
1870
zend_string_efree (recv_buf );
1867
1871
zend_value_error ("invalid udp frame buffer length" );
1868
1872
RETURN_THROWS ();
1869
1873
}
1870
- php_socket_afpacket_add_udp (ether_hdr_buf .buf , sll , ifrname , & szpayload , & zpayload );
1874
+ php_socket_afpacket_add_udp (ip_hdr_buf .buf , sll , ifrname , & szpayload , & zpayload );
1871
1875
break ;
1872
1876
}
1873
1877
// TODO IPPROTO_ICMPV6 support
@@ -1889,7 +1893,9 @@ PHP_FUNCTION(socket_recvfrom)
1889
1893
RETURN_THROWS ();
1890
1894
}
1891
1895
struct ethhdr innere ;
1892
- if ((char * )ether_hdr_buf .buf + sizeof (innere ) < ZSTR_VAL (recv_buf ) + slen ) {
1896
+ struct php_socket_chunk eth_loop_hdr ;
1897
+ memcpy (& eth_loop_hdr , & ether_hdr_buf , sizeof (struct php_socket_chunk ));
1898
+ if ((char * )eth_loop_hdr .buf + sizeof (innere ) < ZSTR_VAL (recv_buf ) + slen ) {
1893
1899
zval_ptr_dtor (& zpayload );
1894
1900
zval_ptr_dtor (& obj );
1895
1901
zend_string_efree (recv_buf );
@@ -1904,7 +1910,7 @@ PHP_FUNCTION(socket_recvfrom)
1904
1910
zend_update_property_string (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("dstMac" ), ether_ntoa ((struct ether_addr * )innere .h_dest ));
1905
1911
zend_update_property_long (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("headerSize" ), ETH_HLEN );
1906
1912
zend_update_property (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("socket" ), socket );
1907
- zend_update_property_stringl (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("rawPacket" ), (char * )ether_hdr_buf .buf , ether_hdr_buf .chunk_len );
1913
+ zend_update_property_stringl (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("rawPacket" ), (char * )ether_hdr_buf .buf , ether_hdr_buf .buf_len );
1908
1914
zend_update_property (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("payload" ), & innerp );
1909
1915
zend_update_property_long (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("ethProtocol" ), 0 );
1910
1916
break ;
0 commit comments