Skip to content

Commit b9f1484

Browse files
committed
fix ethernet frame loop case.
1 parent 850626a commit b9f1484

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
@@ -1656,14 +1656,15 @@ PHP_FUNCTION(socket_recvfrom)
16561656

16571657
struct ethhdr *e = (struct ethhdr *)ZSTR_VAL(recv_buf);
16581658
unsigned short protocol = ntohs(e->h_proto);
1659-
unsigned char *payload = ((unsigned char *)e + sizeof(struct ethhdr));
1659+
unsigned char *payload;
16601660

16611661
zval obj;
16621662
object_init_ex(&obj, socket_ethinfo_ce);
16631663
array_init(&zpayload);
16641664

16651665
switch (protocol) {
16661666
case ETH_P_IP: {
1667+
payload = ((unsigned char *)e + sizeof(struct ethhdr));
16671668
struct iphdr *ip = (struct iphdr *)payload;
16681669
unsigned char *ipdata = payload + (ip->ihl * 4);
16691670
struct in_addr s, d;
@@ -1695,6 +1696,7 @@ PHP_FUNCTION(socket_recvfrom)
16951696
break;
16961697
}
16971698
case ETH_P_IPV6: {
1699+
payload = ((unsigned char *)e + sizeof(struct ethhdr));
16981700
struct ipv6hdr *ip = (struct ipv6hdr *)payload;
16991701
char s[INET6_ADDRSTRLEN], d[INET6_ADDRSTRLEN];
17001702
inet_ntop(AF_INET6, &ip->saddr, s, sizeof(s));
@@ -1704,12 +1706,6 @@ PHP_FUNCTION(socket_recvfrom)
17041706
break;
17051707
}
17061708
case ETH_P_LOOP: {
1707-
struct iphdr *ip = (struct iphdr *)payload;
1708-
struct in_addr s, d;
1709-
s.s_addr = ip->saddr;
1710-
d.s_addr = ip->daddr;
1711-
add_assoc_string(&zpayload, "ipsrc", inet_ntoa(s));
1712-
add_assoc_string(&zpayload, "ipdst", inet_ntoa(d));
17131709
break;
17141710
}
17151711
default:
@@ -1720,14 +1716,15 @@ PHP_FUNCTION(socket_recvfrom)
17201716
RETURN_THROWS();
17211717
}
17221718

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

1730-
ZEND_TRY_ASSIGN_REF_COPY(arg2, &obj);
1727+
ZEND_TRY_ASSIGN_REF_VALUE(arg2, &obj);
17311728
ZEND_TRY_ASSIGN_REF_STRING(arg5, ifrname);
17321729

17331730
if (arg6) {

0 commit comments

Comments
 (0)