@@ -1657,9 +1657,6 @@ PHP_FUNCTION(socket_recvfrom)
1657
1657
1658
1658
zval obj ;
1659
1659
object_init_ex (& obj , socket_ethinfo_ce );
1660
- zend_update_property_string (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("macsrc" ), ether_ntoa ((struct ether_addr * )e -> h_source ));
1661
- zend_update_property_string (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("macdst" ), ether_ntoa ((struct ether_addr * )e -> h_dest ));
1662
- zend_update_property_long (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("ethprotocol" ), protocol );
1663
1660
array_init (& zpayload );
1664
1661
1665
1662
switch (protocol ) {
@@ -1710,10 +1707,16 @@ PHP_FUNCTION(socket_recvfrom)
1710
1707
break ;
1711
1708
}
1712
1709
default :
1710
+ zend_string_efree (recv_buf );
1711
+ zval_ptr_dtor (& zpayload );
1712
+ zval_ptr_dtor (& obj );
1713
1713
zend_value_error ("unsupported ethernet protocol" );
1714
1714
RETURN_THROWS ();
1715
1715
}
1716
1716
1717
+ zend_update_property_string (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("macsrc" ), ether_ntoa ((struct ether_addr * )e -> h_source ));
1718
+ zend_update_property_string (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("macdst" ), ether_ntoa ((struct ether_addr * )e -> h_dest ));
1719
+ zend_update_property_long (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("ethprotocol" ), protocol );
1717
1720
zend_update_property (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("payload" ), & zpayload );
1718
1721
1719
1722
ZEND_TRY_ASSIGN_REF_COPY (arg2 , & obj );
@@ -1745,6 +1748,7 @@ PHP_FUNCTION(socket_sendto)
1745
1748
#endif
1746
1749
#ifdef AF_PACKET
1747
1750
struct sockaddr_ll sll ;
1751
+ unsigned char halen ;
1748
1752
#endif
1749
1753
int retval ;
1750
1754
size_t buf_len , addr_len ;
@@ -1826,17 +1830,20 @@ PHP_FUNCTION(socket_sendto)
1826
1830
RETURN_THROWS ();
1827
1831
}
1828
1832
1833
+ halen = addr_len > ETH_ALEN ? ETH_ALEN : (unsigned char )addr_len ;
1834
+
1829
1835
memset (& sll , 0 , sizeof (sll ));
1836
+ memcpy (sll .sll_addr , addr , halen );
1830
1837
sll .sll_family = AF_PACKET ;
1831
1838
sll .sll_ifindex = port ;
1832
- sll .sll_halen = ETH_ALEN ;
1839
+ sll .sll_halen = halen ;
1833
1840
1834
1841
// TODO allows to use more user friendly type to replace raw buffer usage
1835
1842
retval = sendto (php_sock -> bsd_socket , buf , ((size_t )len > buf_len ) ? buf_len : (size_t )len , flags , (struct sockaddr * ) & sll , sizeof (sll ));
1836
1843
break ;
1837
1844
#endif
1838
1845
default :
1839
- zend_argument_value_error (1 , "must be one of AF_UNIX, AF_INET, or AF_INET6" );
1846
+ zend_argument_value_error (1 , "must be one of AF_UNIX, AF_INET, AF_PACKET or AF_INET6" );
1840
1847
RETURN_THROWS ();
1841
1848
}
1842
1849
0 commit comments