@@ -1678,7 +1678,7 @@ PHP_FUNCTION(socket_recvfrom)
1678
1678
zval obj ;
1679
1679
object_init_ex (& obj , ethpacket_ce );
1680
1680
zend_update_property (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("socket" ), arg1 );
1681
- zend_update_property_long (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("headerSize" ), sizeof ( * e ) );
1681
+ zend_update_property_long (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("headerSize" ), ETH_HLEN );
1682
1682
zend_update_property_long (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("ethProtocol" ), protocol );
1683
1683
1684
1684
switch (protocol ) {
@@ -1688,7 +1688,7 @@ PHP_FUNCTION(socket_recvfrom)
1688
1688
size_t tlayer = ip -> ihl * 4 ;
1689
1689
size_t totalip = ntohs (ip -> tot_len );
1690
1690
1691
- if (tlayer < sizeof (* ip ) || totalip < tlayer ) {
1691
+ if (tlayer < sizeof (* ip ) || totalip < tlayer || totalip < slen ) {
1692
1692
ZVAL_NULL (& zpayload );
1693
1693
zend_update_property (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("payload" ), & zpayload );
1694
1694
zend_update_property_string (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("rawPacket" ), ZSTR_VAL (recv_buf ));
@@ -1702,15 +1702,15 @@ PHP_FUNCTION(socket_recvfrom)
1702
1702
zend_value_error ("invalid transport header length" );
1703
1703
RETURN_THROWS ();
1704
1704
}
1705
- unsigned char * ipdata = payload + ( ip -> ihl * 4 ) ;
1705
+ unsigned char * ipdata = payload + tlayer ;
1706
1706
struct in_addr s , d ;
1707
1707
s .s_addr = ip -> saddr ;
1708
1708
d .s_addr = ip -> daddr ;
1709
1709
zval szpayload ;
1710
1710
object_init_ex (& zpayload , ipv4packet_ce );
1711
- zend_update_property_string (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("ipSrc " ), inet_ntoa (s ));
1712
- zend_update_property_string (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("ipDst " ), inet_ntoa (d ));
1713
- zend_update_property_long (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("headerSize" ), sizeof ( * ip ) );
1711
+ zend_update_property_string (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("srcAddr " ), inet_ntoa (s ));
1712
+ zend_update_property_string (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("dstAddr " ), inet_ntoa (d ));
1713
+ zend_update_property_long (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("headerSize" ), totalip );
1714
1714
zend_update_property (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("socket" ), arg1 );
1715
1715
1716
1716
switch (ip -> protocol ) {
@@ -1726,10 +1726,8 @@ PHP_FUNCTION(socket_recvfrom)
1726
1726
case IPPROTO_UDP : {
1727
1727
struct udphdr * udp = (struct udphdr * )ipdata ;
1728
1728
object_init_ex (& szpayload , udppacket_ce );
1729
- zend_update_property_string (Z_OBJCE (szpayload ), Z_OBJ (szpayload ), ZEND_STRL ("ipSrc" ), inet_ntoa (s ));
1730
- zend_update_property_string (Z_OBJCE (szpayload ), Z_OBJ (szpayload ), ZEND_STRL ("ipDst" ), inet_ntoa (d ));
1731
- zend_update_property_long (Z_OBJCE (szpayload ), Z_OBJ (szpayload ), ZEND_STRL ("srcport" ), ntohs (udp -> uh_sport ));
1732
- zend_update_property_long (Z_OBJCE (szpayload ), Z_OBJ (szpayload ), ZEND_STRL ("dstport" ), ntohs (udp -> uh_dport ));
1729
+ zend_update_property_long (Z_OBJCE (szpayload ), Z_OBJ (szpayload ), ZEND_STRL ("srcPort" ), ntohs (udp -> uh_sport ));
1730
+ zend_update_property_long (Z_OBJCE (szpayload ), Z_OBJ (szpayload ), ZEND_STRL ("dstPort" ), ntohs (udp -> uh_dport ));
1733
1731
zend_update_property_long (Z_OBJCE (szpayload ), Z_OBJ (szpayload ), ZEND_STRL ("headerSize" ), sizeof (* udp ));
1734
1732
zend_update_property (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("payload" ), & szpayload );
1735
1733
break ;
@@ -1752,13 +1750,15 @@ PHP_FUNCTION(socket_recvfrom)
1752
1750
case ETH_P_IPV6 : {
1753
1751
payload = ((unsigned char * )e + ETH_HLEN );
1754
1752
struct ipv6hdr * ip = (struct ipv6hdr * )payload ;
1753
+ size_t totalip = sizeof (* ip ) + ip -> payload_len ;
1755
1754
char s [INET6_ADDRSTRLEN ], d [INET6_ADDRSTRLEN ];
1756
1755
inet_ntop (AF_INET6 , & ip -> saddr , s , sizeof (s ));
1757
1756
inet_ntop (AF_INET6 , & ip -> daddr , d , sizeof (d ));
1758
1757
object_init_ex (& zpayload , ipv6packet_ce );
1759
- zend_update_property_string (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("ipSrc" ), s );
1760
- zend_update_property_string (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("ipDst" ), d );
1761
- zend_update_property_long (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("headerSize" ), sizeof (* ip ));
1758
+ zend_update_property_string (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("srcAddr" ), s );
1759
+ zend_update_property_string (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("dstAddr" ), d );
1760
+ zend_update_property_long (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("headerSize" ), totalip );
1761
+ zend_update_property (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("socket" ), arg1 );
1762
1762
// TODO completing
1763
1763
break ;
1764
1764
}
@@ -1767,9 +1767,9 @@ PHP_FUNCTION(socket_recvfrom)
1767
1767
zval innerp ;
1768
1768
ZVAL_NULL (& innerp );
1769
1769
object_init_ex (& zpayload , ethpacket_ce );
1770
- zend_update_property_string (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("macSrc " ), ether_ntoa ((struct ether_addr * )innere -> h_source ));
1771
- zend_update_property_string (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("macDst " ), ether_ntoa ((struct ether_addr * )innere -> h_dest ));
1772
- zend_update_property_long (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("headerSize" ), sizeof ( * innere ) );
1770
+ zend_update_property_string (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("srcMac " ), ether_ntoa ((struct ether_addr * )innere -> h_source ));
1771
+ zend_update_property_string (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("dstMac " ), ether_ntoa ((struct ether_addr * )innere -> h_dest ));
1772
+ zend_update_property_long (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("headerSize" ), ETH_HLEN );
1773
1773
zend_update_property (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("socket" ), arg1 );
1774
1774
zend_update_property (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("rawPacket" ), & innerp );
1775
1775
zend_update_property (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("payload" ), & innerp );
@@ -1791,8 +1791,8 @@ PHP_FUNCTION(socket_recvfrom)
1791
1791
RETURN_THROWS ();
1792
1792
}
1793
1793
1794
- zend_update_property_string (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("macSrc " ), ether_ntoa ((struct ether_addr * )e -> h_source ));
1795
- zend_update_property_string (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("macDst " ), ether_ntoa ((struct ether_addr * )e -> h_dest ));
1794
+ zend_update_property_string (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("srcMac " ), ether_ntoa ((struct ether_addr * )e -> h_source ));
1795
+ zend_update_property_string (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("dstMac " ), ether_ntoa ((struct ether_addr * )e -> h_dest ));
1796
1796
zend_update_property (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("payload" ), & zpayload );
1797
1797
zend_update_property_string (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("rawPacket" ), ZSTR_VAL (recv_buf ));
1798
1798
Z_DELREF (zpayload );
0 commit comments