@@ -1654,14 +1654,15 @@ PHP_FUNCTION(socket_recvfrom)
1654
1654
1655
1655
struct ethhdr * e = (struct ethhdr * )ZSTR_VAL (recv_buf );
1656
1656
unsigned short protocol = ntohs (e -> h_proto );
1657
- unsigned char * payload = (( unsigned char * ) e + sizeof ( struct ethhdr )) ;
1657
+ unsigned char * payload ;
1658
1658
1659
1659
zval obj ;
1660
1660
object_init_ex (& obj , socket_ethinfo_ce );
1661
1661
array_init (& zpayload );
1662
1662
1663
1663
switch (protocol ) {
1664
1664
case ETH_P_IP : {
1665
+ payload = ((unsigned char * )e + sizeof (struct ethhdr ));
1665
1666
struct iphdr * ip = (struct iphdr * )payload ;
1666
1667
unsigned char * ipdata = payload + (ip -> ihl * 4 );
1667
1668
struct in_addr s , d ;
@@ -1693,6 +1694,7 @@ PHP_FUNCTION(socket_recvfrom)
1693
1694
break ;
1694
1695
}
1695
1696
case ETH_P_IPV6 : {
1697
+ payload = ((unsigned char * )e + sizeof (struct ethhdr ));
1696
1698
struct ipv6hdr * ip = (struct ipv6hdr * )payload ;
1697
1699
char s [INET6_ADDRSTRLEN ], d [INET6_ADDRSTRLEN ];
1698
1700
inet_ntop (AF_INET6 , & ip -> saddr , s , sizeof (s ));
@@ -1702,12 +1704,6 @@ PHP_FUNCTION(socket_recvfrom)
1702
1704
break ;
1703
1705
}
1704
1706
case ETH_P_LOOP : {
1705
- struct iphdr * ip = (struct iphdr * )payload ;
1706
- struct in_addr s , d ;
1707
- s .s_addr = ip -> saddr ;
1708
- d .s_addr = ip -> daddr ;
1709
- add_assoc_string (& zpayload , "ipsrc" , inet_ntoa (s ));
1710
- add_assoc_string (& zpayload , "ipdst" , inet_ntoa (d ));
1711
1707
break ;
1712
1708
}
1713
1709
default :
@@ -1718,14 +1714,15 @@ PHP_FUNCTION(socket_recvfrom)
1718
1714
RETURN_THROWS ();
1719
1715
}
1720
1716
1717
+ Z_DELREF (zpayload );
1721
1718
zend_update_property (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("socket" ), arg1 );
1722
1719
zend_update_property_string (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("macsrc" ), ether_ntoa ((struct ether_addr * )e -> h_source ));
1723
1720
zend_update_property_string (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("macdst" ), ether_ntoa ((struct ether_addr * )e -> h_dest ));
1724
1721
zend_update_property_long (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("ethprotocol" ), protocol );
1725
1722
zend_update_property (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("payload" ), & zpayload );
1726
1723
// TODO fix leaks
1727
1724
1728
- ZEND_TRY_ASSIGN_REF_COPY (arg2 , & obj );
1725
+ ZEND_TRY_ASSIGN_REF_VALUE (arg2 , & obj );
1729
1726
ZEND_TRY_ASSIGN_REF_STRING (arg5 , ifrname );
1730
1727
1731
1728
if (arg6 ) {
0 commit comments