@@ -1441,10 +1441,10 @@ PHP_FUNCTION(socket_bind)
14411441 if ((char *)ipdata + sizeof(a) < ZSTR_VAL(recv_buf) + slen) { \
14421442 zend_string_efree(recv_buf); \
14431443 Z_DELREF_P(zpayload); \
1444- ZEND_TRY_ASSIGN_REF_VALUE(arg2 , obj); \
1445- ZEND_TRY_ASSIGN_REF_STRING(arg5 , ifrname); \
1446- if (arg6 ) { \
1447- ZEND_TRY_ASSIGN_REF_LONG(arg6 , sll.sll_ifindex);\
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);\
14481448 } \
14491449 zend_value_error("invalid %s header", lyr); \
14501450 return FAILURE; \
@@ -1462,7 +1462,7 @@ static zend_result php_socket_get_chunk(zend_string *dst, const zend_string *src
14621462}
14631463
14641464static zend_result php_socket_afpacket_add_tcp (unsigned char * ipdata , struct sockaddr_ll sll , char * ifrname , zend_string * recv_buf ,
1465- size_t slen , zval * szpayload , zval * zpayload , zval * obj , zval * arg2 , zval * arg5 , zval * arg6 , size_t headersize ) {
1465+ size_t slen , zval * szpayload , zval * zpayload , zval * obj , zval * data , zval * addr , zval * index , size_t headersize ) {
14661466 struct tcphdr tcp ;
14671467 ETH_SUB_CHECKLENGTH (tcp , "TCP" );
14681468 memcpy (& tcp , ipdata , sizeof (tcp ));
@@ -1477,7 +1477,7 @@ static zend_result php_socket_afpacket_add_tcp(unsigned char *ipdata, struct soc
14771477}
14781478
14791479static zend_result php_socket_afpacket_add_udp (unsigned char * ipdata , struct sockaddr_ll sll , char * ifrname , zend_string * recv_buf ,
1480- size_t slen , zval * szpayload , zval * zpayload , zval * obj , zval * arg2 , zval * arg5 , zval * arg6 , size_t headersize ) {
1480+ size_t slen , zval * szpayload , zval * zpayload , zval * obj , zval * data , zval * addr , zval * index , size_t headersize ) {
14811481 struct udphdr udp ;
14821482 ETH_SUB_CHECKLENGTH (udp , "UDP" );
14831483 memcpy (& udp , ipdata , sizeof (udp ));
@@ -1700,7 +1700,13 @@ PHP_FUNCTION(socket_recvfrom)
17001700 break ;
17011701#endif
17021702#ifdef AF_PACKET
1703- case AF_PACKET :
1703+ case AF_PACKET : {
1704+ zval * socket = arg1 ;
1705+ zval * data = arg2 ;
1706+ size_t recv_len = (size_t )arg3 ;
1707+ int recv_flags = (int )arg4 ;
1708+ zval * addr = arg5 ;
1709+ zval * index = arg6 ;
17041710 getsockopt (php_sock -> bsd_socket , SOL_SOCKET , SO_TYPE , (char * ) & protoid , & protoidlen );
17051711
17061712 // TODO: SOCK_DGRAM support
@@ -1715,7 +1721,7 @@ PHP_FUNCTION(socket_recvfrom)
17151721 char ifrname [IFNAMSIZ ];
17161722 zval zpayload ;
17171723
1718- retval = recvfrom (php_sock -> bsd_socket , ZSTR_VAL (recv_buf ), arg3 , arg4 , (struct sockaddr * )& sll , (socklen_t * )& slen );
1724+ retval = recvfrom (php_sock -> bsd_socket , ZSTR_VAL (recv_buf ), recv_len , recv_flags , (struct sockaddr * )& sll , (socklen_t * )& slen );
17191725
17201726 if (retval < 0 ) {
17211727 PHP_SOCKET_ERROR (php_sock , "unable to recvfrom" , errno );
@@ -1735,7 +1741,7 @@ PHP_FUNCTION(socket_recvfrom)
17351741 RETURN_FALSE ;
17361742 }
17371743
1738- dst_buf = zend_string_alloc (arg3 , false);
1744+ dst_buf = zend_string_alloc (recv_len + 1 , false);
17391745
17401746 if (php_socket_get_chunk (dst_buf , recv_buf , 0 , ETH_HLEN ) == FAILURE ) {
17411747 zend_value_error ("invalid ethernet frame buffer length" );
@@ -1751,7 +1757,7 @@ PHP_FUNCTION(socket_recvfrom)
17511757
17521758 zval obj ;
17531759 object_init_ex (& obj , ethpacket_ce );
1754- zend_update_property (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("socket" ), arg1 );
1760+ zend_update_property (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("socket" ), socket );
17551761 zend_update_property_long (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("headerSize" ), ETH_HLEN );
17561762 zend_update_property_long (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("ethProtocol" ), protocol );
17571763
@@ -1776,11 +1782,11 @@ PHP_FUNCTION(socket_recvfrom)
17761782 zend_update_property_stringl (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("rawPacket" ), ZSTR_VAL (recv_buf ), ZSTR_LEN (recv_buf ));
17771783 zend_string_release (dst_buf );
17781784 zend_string_efree (recv_buf );
1779- ZEND_TRY_ASSIGN_REF_VALUE (arg2 , & obj );
1780- ZEND_TRY_ASSIGN_REF_STRING (arg5 , ifrname );
1785+ ZEND_TRY_ASSIGN_REF_VALUE (data , & obj );
1786+ ZEND_TRY_ASSIGN_REF_STRING (addr , ifrname );
17811787
1782- if (arg6 ) {
1783- ZEND_TRY_ASSIGN_REF_LONG (arg6 , sll .sll_ifindex );
1788+ if (index ) {
1789+ ZEND_TRY_ASSIGN_REF_LONG (index , sll .sll_ifindex );
17841790 }
17851791 zend_value_error ("invalid transport header length" );
17861792 RETURN_THROWS ();
@@ -1804,7 +1810,7 @@ PHP_FUNCTION(socket_recvfrom)
18041810 RETURN_THROWS ();
18051811 }
18061812 unsigned char * ipdata = (unsigned char * )ZSTR_VAL (dst_buf );
1807- if (php_socket_afpacket_add_tcp (ipdata , sll , ifrname , recv_buf , slen , & szpayload , & zpayload , & obj , arg2 , arg5 , arg6 , ZSTR_LEN (dst_buf )) == FAILURE ) {
1813+ if (php_socket_afpacket_add_tcp (ipdata , sll , ifrname , recv_buf , slen , & szpayload , & zpayload , & obj , data , addr , index , ZSTR_LEN (dst_buf )) == FAILURE ) {
18081814 zend_string_release (dst_buf );
18091815 zend_string_efree (recv_buf );
18101816 RETURN_THROWS ();
@@ -1819,7 +1825,7 @@ PHP_FUNCTION(socket_recvfrom)
18191825 RETURN_THROWS ();
18201826 }
18211827 unsigned char * ipdata = (unsigned char * )ZSTR_VAL (dst_buf );
1822- if (php_socket_afpacket_add_udp (ipdata , sll , ifrname , recv_buf , slen , & szpayload , & zpayload , & obj , arg2 , arg5 , arg6 , ZSTR_LEN (dst_buf )) == FAILURE ) {
1828+ if (php_socket_afpacket_add_udp (ipdata , sll , ifrname , recv_buf , slen , & szpayload , & zpayload , & obj , data , addr , index , ZSTR_LEN (dst_buf )) == FAILURE ) {
18231829 zend_string_release (dst_buf );
18241830 zend_string_efree (recv_buf );
18251831 RETURN_THROWS ();
@@ -1832,11 +1838,11 @@ PHP_FUNCTION(socket_recvfrom)
18321838 zend_string_efree (recv_buf );
18331839 zend_string_release (dst_buf );
18341840 Z_DELREF (zpayload );
1835- ZEND_TRY_ASSIGN_REF_VALUE (arg2 , & obj );
1836- ZEND_TRY_ASSIGN_REF_STRING (arg5 , ifrname );
1841+ ZEND_TRY_ASSIGN_REF_VALUE (data , & obj );
1842+ ZEND_TRY_ASSIGN_REF_STRING (addr , ifrname );
18371843
1838- if (arg6 ) {
1839- ZEND_TRY_ASSIGN_REF_LONG (arg6 , sll .sll_ifindex );
1844+ if (index ) {
1845+ ZEND_TRY_ASSIGN_REF_LONG (index , sll .sll_ifindex );
18401846 }
18411847 zend_value_error ("unsupported ip header protocol" );
18421848 RETURN_THROWS ();
@@ -1860,11 +1866,11 @@ PHP_FUNCTION(socket_recvfrom)
18601866 zend_update_property_string (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("rawPacket" ), ZSTR_VAL (recv_buf ));
18611867 zend_string_efree (recv_buf );
18621868 zend_string_release (dst_buf );
1863- ZEND_TRY_ASSIGN_REF_VALUE (arg2 , & obj );
1864- ZEND_TRY_ASSIGN_REF_STRING (arg5 , ifrname );
1869+ ZEND_TRY_ASSIGN_REF_VALUE (data , & obj );
1870+ ZEND_TRY_ASSIGN_REF_STRING (addr , ifrname );
18651871
1866- if (arg6 ) {
1867- ZEND_TRY_ASSIGN_REF_LONG (arg6 , sll .sll_ifindex );
1872+ if (index ) {
1873+ ZEND_TRY_ASSIGN_REF_LONG (index , sll .sll_ifindex );
18681874 }
18691875 zend_value_error ("invalid transport header length" );
18701876 RETURN_THROWS ();
@@ -1889,7 +1895,7 @@ PHP_FUNCTION(socket_recvfrom)
18891895 RETURN_THROWS ();
18901896 }
18911897 unsigned char * ipdata = (unsigned char * )ZSTR_VAL (dst_buf );
1892- if (php_socket_afpacket_add_tcp (ipdata , sll , ifrname , recv_buf , slen , & szpayload , & zpayload , & obj , arg2 , arg5 , arg6 , ZSTR_LEN (dst_buf )) == FAILURE ) {
1898+ if (php_socket_afpacket_add_tcp (ipdata , sll , ifrname , recv_buf , slen , & szpayload , & zpayload , & obj , data , addr , index , ZSTR_LEN (dst_buf )) == FAILURE ) {
18931899 zend_string_release (dst_buf );
18941900 zend_string_efree (recv_buf );
18951901 RETURN_THROWS ();
@@ -1904,7 +1910,7 @@ PHP_FUNCTION(socket_recvfrom)
19041910 RETURN_THROWS ();
19051911 }
19061912 unsigned char * ipdata = (unsigned char * )ZSTR_VAL (dst_buf );
1907- if (php_socket_afpacket_add_udp (ipdata , sll , ifrname , recv_buf , slen , & szpayload , & zpayload , & obj , arg2 , arg5 , arg6 , ZSTR_LEN (dst_buf )) == FAILURE ) {
1913+ if (php_socket_afpacket_add_udp (ipdata , sll , ifrname , recv_buf , slen , & szpayload , & zpayload , & obj , data , addr , data , ZSTR_LEN (dst_buf )) == FAILURE ) {
19081914 zend_string_release (dst_buf );
19091915 zend_string_efree (recv_buf );
19101916 RETURN_THROWS ();
@@ -1918,11 +1924,11 @@ PHP_FUNCTION(socket_recvfrom)
19181924 zend_string_efree (recv_buf );
19191925 zend_string_release (dst_buf );
19201926 Z_DELREF (zpayload );
1921- ZEND_TRY_ASSIGN_REF_VALUE (arg2 , & obj );
1922- ZEND_TRY_ASSIGN_REF_STRING (arg5 , ifrname );
1927+ ZEND_TRY_ASSIGN_REF_VALUE (data , & obj );
1928+ ZEND_TRY_ASSIGN_REF_STRING (addr , ifrname );
19231929
1924- if (arg6 ) {
1925- ZEND_TRY_ASSIGN_REF_LONG (arg6 , sll .sll_ifindex );
1930+ if (index ) {
1931+ ZEND_TRY_ASSIGN_REF_LONG (index , sll .sll_ifindex );
19261932 }
19271933 zend_value_error ("unsupported ipv6 header protocol" );
19281934 RETURN_THROWS ();
@@ -1941,10 +1947,10 @@ PHP_FUNCTION(socket_recvfrom)
19411947 if ((char * )payload + sizeof (innere ) < ZSTR_VAL (recv_buf ) + slen ) {
19421948 zend_string_efree (recv_buf );
19431949 zend_string_release (dst_buf );
1944- ZEND_TRY_ASSIGN_REF_VALUE (arg2 , & obj );
1945- ZEND_TRY_ASSIGN_REF_STRING (arg5 , ifrname );
1946- if (arg6 ) {
1947- ZEND_TRY_ASSIGN_REF_LONG (arg6 , sll .sll_ifindex );
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 );
19481954 }
19491955 zend_value_error ("invalid ethernet loop header" );
19501956 RETURN_THROWS ();
@@ -1956,7 +1962,7 @@ PHP_FUNCTION(socket_recvfrom)
19561962 zend_update_property_string (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("srcMac" ), ether_ntoa ((struct ether_addr * )innere .h_source ));
19571963 zend_update_property_string (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("dstMac" ), ether_ntoa ((struct ether_addr * )innere .h_dest ));
19581964 zend_update_property_long (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("headerSize" ), ETH_HLEN );
1959- zend_update_property (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("socket" ), arg1 );
1965+ zend_update_property (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("socket" ), socket );
19601966 zend_update_property (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("rawPacket" ), & innerp );
19611967 zend_update_property (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("payload" ), & innerp );
19621968 zend_update_property_long (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("ethProtocol" ), 0 );
@@ -1969,11 +1975,11 @@ PHP_FUNCTION(socket_recvfrom)
19691975 zend_string_efree (recv_buf );
19701976 zend_string_release (dst_buf );
19711977
1972- ZEND_TRY_ASSIGN_REF_VALUE (arg2 , & obj );
1973- ZEND_TRY_ASSIGN_REF_STRING (arg5 , ifrname );
1978+ ZEND_TRY_ASSIGN_REF_VALUE (data , & obj );
1979+ ZEND_TRY_ASSIGN_REF_STRING (addr , ifrname );
19741980
1975- if (arg6 ) {
1976- ZEND_TRY_ASSIGN_REF_LONG (arg6 , sll .sll_ifindex );
1981+ if (index ) {
1982+ ZEND_TRY_ASSIGN_REF_LONG (index , sll .sll_ifindex );
19771983 }
19781984 zend_value_error ("unsupported ethernet protocol" );
19791985 RETURN_THROWS ();
@@ -1987,13 +1993,14 @@ PHP_FUNCTION(socket_recvfrom)
19871993 zend_string_efree (recv_buf );
19881994 zend_string_free (dst_buf );
19891995
1990- ZEND_TRY_ASSIGN_REF_VALUE (arg2 , & obj );
1991- ZEND_TRY_ASSIGN_REF_STRING (arg5 , ifrname );
1996+ ZEND_TRY_ASSIGN_REF_VALUE (data , & obj );
1997+ ZEND_TRY_ASSIGN_REF_STRING (addr , ifrname );
19921998
1993- if (arg6 ) {
1994- ZEND_TRY_ASSIGN_REF_LONG (arg6 , sll .sll_ifindex );
1999+ if (index ) {
2000+ ZEND_TRY_ASSIGN_REF_LONG (index , sll .sll_ifindex );
19952001 }
19962002 break ;
2003+ }
19972004#endif
19982005 default :
19992006 zend_argument_value_error (1 , "must be one of AF_UNIX, AF_INET, or AF_INET6" );
0 commit comments