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