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