Skip to content

Commit fe00896

Browse files
committed
fix ethernet frame loop case.
1 parent df81dda commit fe00896

File tree

1 file changed

+5
-8
lines changed

1 file changed

+5
-8
lines changed

ext/sockets/sockets.c

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1654,14 +1654,15 @@ PHP_FUNCTION(socket_recvfrom)
16541654

16551655
struct ethhdr *e = (struct ethhdr *)ZSTR_VAL(recv_buf);
16561656
unsigned short protocol = ntohs(e->h_proto);
1657-
unsigned char *payload = ((unsigned char *)e + sizeof(struct ethhdr));
1657+
unsigned char *payload;
16581658

16591659
zval obj;
16601660
object_init_ex(&obj, socket_ethinfo_ce);
16611661
array_init(&zpayload);
16621662

16631663
switch (protocol) {
16641664
case ETH_P_IP: {
1665+
payload = ((unsigned char *)e + sizeof(struct ethhdr));
16651666
struct iphdr *ip = (struct iphdr *)payload;
16661667
unsigned char *ipdata = payload + (ip->ihl * 4);
16671668
struct in_addr s, d;
@@ -1693,6 +1694,7 @@ PHP_FUNCTION(socket_recvfrom)
16931694
break;
16941695
}
16951696
case ETH_P_IPV6: {
1697+
payload = ((unsigned char *)e + sizeof(struct ethhdr));
16961698
struct ipv6hdr *ip = (struct ipv6hdr *)payload;
16971699
char s[INET6_ADDRSTRLEN], d[INET6_ADDRSTRLEN];
16981700
inet_ntop(AF_INET6, &ip->saddr, s, sizeof(s));
@@ -1702,12 +1704,6 @@ PHP_FUNCTION(socket_recvfrom)
17021704
break;
17031705
}
17041706
case ETH_P_LOOP: {
1705-
struct iphdr *ip = (struct iphdr *)payload;
1706-
struct in_addr s, d;
1707-
s.s_addr = ip->saddr;
1708-
d.s_addr = ip->daddr;
1709-
add_assoc_string(&zpayload, "ipsrc", inet_ntoa(s));
1710-
add_assoc_string(&zpayload, "ipdst", inet_ntoa(d));
17111707
break;
17121708
}
17131709
default:
@@ -1718,14 +1714,15 @@ PHP_FUNCTION(socket_recvfrom)
17181714
RETURN_THROWS();
17191715
}
17201716

1717+
Z_DELREF(zpayload);
17211718
zend_update_property(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("socket"), arg1);
17221719
zend_update_property_string(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("macsrc"), ether_ntoa((struct ether_addr *)e->h_source));
17231720
zend_update_property_string(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("macdst"), ether_ntoa((struct ether_addr *)e->h_dest));
17241721
zend_update_property_long(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("ethprotocol"), protocol);
17251722
zend_update_property(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("payload"), &zpayload);
17261723
// TODO fix leaks
17271724

1728-
ZEND_TRY_ASSIGN_REF_COPY(arg2, &obj);
1725+
ZEND_TRY_ASSIGN_REF_VALUE(arg2, &obj);
17291726
ZEND_TRY_ASSIGN_REF_STRING(arg5, ifrname);
17301727

17311728
if (arg6) {

0 commit comments

Comments
 (0)