@@ -1684,7 +1684,10 @@ PHP_FUNCTION(socket_recvfrom)
16841684 switch (protocol ) {
16851685 case ETH_P_IP : {
16861686 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 ;
16881691 size_t tlayer = ip -> ihl * 4 ;
16891692 size_t totalip = ntohs (ip -> tot_len );
16901693
@@ -1715,21 +1718,27 @@ PHP_FUNCTION(socket_recvfrom)
17151718
17161719 switch (ip -> protocol ) {
17171720 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 ;
17191724 object_init_ex (& szpayload , tcppacket_ce );
17201725 zend_update_property_long (Z_OBJCE (szpayload ), Z_OBJ (szpayload ), ZEND_STRL ("srcPort" ), ntohs (tcp -> th_sport ));
17211726 zend_update_property_long (Z_OBJCE (szpayload ), Z_OBJ (szpayload ), ZEND_STRL ("dstPort" ), ntohs (tcp -> th_dport ));
17221727 zend_update_property_long (Z_OBJCE (szpayload ), Z_OBJ (szpayload ), ZEND_STRL ("headerSize" ), sizeof (* tcp ));
17231728 zend_update_property (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("payload" ), & szpayload );
1729+ Z_DELREF (szpayload );
17241730 break ;
17251731 }
17261732 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 ;
17281736 object_init_ex (& szpayload , udppacket_ce );
17291737 zend_update_property_long (Z_OBJCE (szpayload ), Z_OBJ (szpayload ), ZEND_STRL ("srcPort" ), ntohs (udp -> uh_sport ));
17301738 zend_update_property_long (Z_OBJCE (szpayload ), Z_OBJ (szpayload ), ZEND_STRL ("dstPort" ), ntohs (udp -> uh_dport ));
17311739 zend_update_property_long (Z_OBJCE (szpayload ), Z_OBJ (szpayload ), ZEND_STRL ("headerSize" ), sizeof (* udp ));
17321740 zend_update_property (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("payload" ), & szpayload );
1741+ Z_DELREF (szpayload );
17331742 break ;
17341743 }
17351744 default :
@@ -1749,7 +1758,9 @@ PHP_FUNCTION(socket_recvfrom)
17491758 }
17501759 case ETH_P_IPV6 : {
17511760 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 ;
17531764 size_t totalip = sizeof (* ip ) + ip -> payload_len ;
17541765 char s [INET6_ADDRSTRLEN ], d [INET6_ADDRSTRLEN ];
17551766 inet_ntop (AF_INET6 , & ip -> saddr , s , sizeof (s ));
0 commit comments