@@ -1678,7 +1678,7 @@ PHP_FUNCTION(socket_recvfrom)
16781678 zval obj ;
16791679 object_init_ex (& obj , ethpacket_ce );
16801680 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 );
16821682 zend_update_property_long (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("ethProtocol" ), protocol );
16831683
16841684 switch (protocol ) {
@@ -1688,7 +1688,7 @@ PHP_FUNCTION(socket_recvfrom)
16881688 size_t tlayer = ip -> ihl * 4 ;
16891689 size_t totalip = ntohs (ip -> tot_len );
16901690
1691- if (tlayer < sizeof (* ip ) || totalip < tlayer ) {
1691+ if (tlayer < sizeof (* ip ) || totalip < tlayer || totalip < slen ) {
16921692 ZVAL_NULL (& zpayload );
16931693 zend_update_property (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("payload" ), & zpayload );
16941694 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)
17021702 zend_value_error ("invalid transport header length" );
17031703 RETURN_THROWS ();
17041704 }
1705- unsigned char * ipdata = payload + ( ip -> ihl * 4 ) ;
1705+ unsigned char * ipdata = payload + tlayer ;
17061706 struct in_addr s , d ;
17071707 s .s_addr = ip -> saddr ;
17081708 d .s_addr = ip -> daddr ;
17091709 zval szpayload ;
17101710 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 );
17141714 zend_update_property (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("socket" ), arg1 );
17151715
17161716 switch (ip -> protocol ) {
@@ -1726,10 +1726,8 @@ PHP_FUNCTION(socket_recvfrom)
17261726 case IPPROTO_UDP : {
17271727 struct udphdr * udp = (struct udphdr * )ipdata ;
17281728 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 ));
17331731 zend_update_property_long (Z_OBJCE (szpayload ), Z_OBJ (szpayload ), ZEND_STRL ("headerSize" ), sizeof (* udp ));
17341732 zend_update_property (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("payload" ), & szpayload );
17351733 break ;
@@ -1752,13 +1750,15 @@ PHP_FUNCTION(socket_recvfrom)
17521750 case ETH_P_IPV6 : {
17531751 payload = ((unsigned char * )e + ETH_HLEN );
17541752 struct ipv6hdr * ip = (struct ipv6hdr * )payload ;
1753+ size_t totalip = sizeof (* ip ) + ip -> payload_len ;
17551754 char s [INET6_ADDRSTRLEN ], d [INET6_ADDRSTRLEN ];
17561755 inet_ntop (AF_INET6 , & ip -> saddr , s , sizeof (s ));
17571756 inet_ntop (AF_INET6 , & ip -> daddr , d , sizeof (d ));
17581757 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 );
17621762 // TODO completing
17631763 break ;
17641764 }
@@ -1767,9 +1767,9 @@ PHP_FUNCTION(socket_recvfrom)
17671767 zval innerp ;
17681768 ZVAL_NULL (& innerp );
17691769 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 );
17731773 zend_update_property (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("socket" ), arg1 );
17741774 zend_update_property (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("rawPacket" ), & innerp );
17751775 zend_update_property (Z_OBJCE (zpayload ), Z_OBJ (zpayload ), ZEND_STRL ("payload" ), & innerp );
@@ -1791,8 +1791,8 @@ PHP_FUNCTION(socket_recvfrom)
17911791 RETURN_THROWS ();
17921792 }
17931793
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 ));
17961796 zend_update_property (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("payload" ), & zpayload );
17971797 zend_update_property_string (Z_OBJCE (obj ), Z_OBJ (obj ), ZEND_STRL ("rawPacket" ), ZSTR_VAL (recv_buf ));
17981798 Z_DELREF (zpayload );
0 commit comments