@@ -1684,7 +1684,10 @@ PHP_FUNCTION(socket_recvfrom)
1684
1684
switch (protocol ) {
1685
1685
case ETH_P_IP : {
1686
1686
payload = ((unsigned char * )e + ETH_HLEN );
1687
- struct iphdr * ip = (struct iphdr * )payload ;
1687
+ struct iphdr a ;
1688
+ memcpy (& a , payload , sizeof (a ));
1689
+ //struct iphdr *ip = (struct iphdr *)payload;
1690
+ struct iphdr * ip = & a ;
1688
1691
size_t tlayer = ip -> ihl * 4 ;
1689
1692
size_t totalip = ntohs (ip -> tot_len );
1690
1693
@@ -1715,21 +1718,27 @@ PHP_FUNCTION(socket_recvfrom)
1715
1718
1716
1719
switch (ip -> protocol ) {
1717
1720
case IPPROTO_TCP : {
1718
- struct tcphdr * tcp = (struct tcphdr * )ipdata ;
1721
+ struct tcphdr a ;
1722
+ memcpy (& a , ipdata , sizeof (a ));
1723
+ struct tcphdr * tcp = & a ;
1719
1724
object_init_ex (& szpayload , tcppacket_ce );
1720
1725
zend_update_property_long (Z_OBJCE (szpayload ), Z_OBJ (szpayload ), ZEND_STRL ("srcPort" ), ntohs (tcp -> th_sport ));
1721
1726
zend_update_property_long (Z_OBJCE (szpayload ), Z_OBJ (szpayload ), ZEND_STRL ("dstPort" ), ntohs (tcp -> th_dport ));
1722
1727
zend_update_property_long (Z_OBJCE (szpayload ), Z_OBJ (szpayload ), ZEND_STRL ("headerSize" ), sizeof (* tcp ));
1723
1728
zend_update_property (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("payload" ), & szpayload );
1729
+ Z_DELREF (szpayload );
1724
1730
break ;
1725
1731
}
1726
1732
case IPPROTO_UDP : {
1727
- struct udphdr * udp = (struct udphdr * )ipdata ;
1733
+ struct udphdr a ;
1734
+ memcpy (& a , ipdata , sizeof (a ));
1735
+ struct udphdr * udp = & a ;
1728
1736
object_init_ex (& szpayload , udppacket_ce );
1729
1737
zend_update_property_long (Z_OBJCE (szpayload ), Z_OBJ (szpayload ), ZEND_STRL ("srcPort" ), ntohs (udp -> uh_sport ));
1730
1738
zend_update_property_long (Z_OBJCE (szpayload ), Z_OBJ (szpayload ), ZEND_STRL ("dstPort" ), ntohs (udp -> uh_dport ));
1731
1739
zend_update_property_long (Z_OBJCE (szpayload ), Z_OBJ (szpayload ), ZEND_STRL ("headerSize" ), sizeof (* udp ));
1732
1740
zend_update_property (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("payload" ), & szpayload );
1741
+ Z_DELREF (szpayload );
1733
1742
break ;
1734
1743
}
1735
1744
default :
@@ -1749,7 +1758,9 @@ PHP_FUNCTION(socket_recvfrom)
1749
1758
}
1750
1759
case ETH_P_IPV6 : {
1751
1760
payload = ((unsigned char * )e + ETH_HLEN );
1752
- struct ipv6hdr * ip = (struct ipv6hdr * )payload ;
1761
+ struct ipv6hdr a ;
1762
+ memcpy (& a , payload , sizeof (a ));
1763
+ struct ipv6hdr * ip = & a ;
1753
1764
size_t totalip = sizeof (* ip ) + ip -> payload_len ;
1754
1765
char s [INET6_ADDRSTRLEN ], d [INET6_ADDRSTRLEN ];
1755
1766
inet_ntop (AF_INET6 , & ip -> saddr , s , sizeof (s ));
0 commit comments