Skip to content

Commit 49d0237

Browse files
committed
applying one of the @arnaud-lb suggestions.
1 parent 483a404 commit 49d0237

File tree

4 files changed

+34
-21
lines changed

4 files changed

+34
-21
lines changed

ext/sockets/sockets.c

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1667,7 +1667,7 @@ PHP_FUNCTION(socket_recvfrom)
16671667

16681668
zval obj;
16691669
object_init_ex(&obj, socket_ethinfo_ce);
1670-
array_init(&zpayload);
1670+
object_init(&zpayload);
16711671

16721672
switch (protocol) {
16731673
case ETH_P_IP: {
@@ -1677,26 +1677,28 @@ PHP_FUNCTION(socket_recvfrom)
16771677
struct in_addr s, d;
16781678
s.s_addr = ip->saddr;
16791679
d.s_addr = ip->daddr;
1680-
add_assoc_string(&zpayload, "ipsrc", inet_ntoa(s));
1681-
add_assoc_string(&zpayload, "ipdst", inet_ntoa(d));
1680+
zend_update_property_string(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("ipsrc"), inet_ntoa(s));
1681+
zend_update_property_string(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("ipdst"), inet_ntoa(d));
16821682

16831683
switch (ip->protocol) {
16841684
case IPPROTO_TCP: {
16851685
struct tcphdr *tcp = (struct tcphdr *)ipdata;
1686-
add_assoc_long(&zpayload, "portsrc", ntohs(tcp->th_sport));
1687-
add_assoc_long(&zpayload, "portdst", ntohs(tcp->th_dport));
1686+
zend_update_property_long(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("portsrc"), ntohs(tcp->th_sport));
1687+
zend_update_property_long(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("portdst"), ntohs(tcp->th_dport));
16881688
break;
16891689
}
16901690
case IPPROTO_UDP: {
16911691
struct udphdr *udp = (struct udphdr *)ipdata;
1692-
add_assoc_long(&zpayload, "portsrc", ntohs(udp->uh_sport));
1693-
add_assoc_long(&zpayload, "portdst", ntohs(udp->uh_dport));
1692+
zend_update_property_long(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("portsrc"), ntohs(udp->uh_sport));
1693+
zend_update_property_long(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("portdst"), ntohs(udp->uh_dport));
16941694
break;
16951695
}
16961696
default:
1697+
ZVAL_NULL(&zpayload);
1698+
zend_update_property(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("payload"), &zpayload);
1699+
zend_update_property_string(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("rawpayload"), ZSTR_VAL(recv_buf));
1700+
Z_DELREF(zpayload);
16971701
zend_string_efree(recv_buf);
1698-
zval_ptr_dtor(&zpayload);
1699-
zval_ptr_dtor(&obj);
17001702
zend_value_error("unsupported ip header protocol");
17011703
RETURN_THROWS();
17021704
}
@@ -1708,31 +1710,34 @@ PHP_FUNCTION(socket_recvfrom)
17081710
char s[INET6_ADDRSTRLEN], d[INET6_ADDRSTRLEN];
17091711
inet_ntop(AF_INET6, &ip->saddr, s, sizeof(s));
17101712
inet_ntop(AF_INET6, &ip->daddr, d, sizeof(d));
1711-
add_assoc_string(&zpayload, "ipsrc", s);
1712-
add_assoc_string(&zpayload, "ipdst", d);
1713+
zend_update_property_string(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("ipsrc"), s);
1714+
zend_update_property_string(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("ipdst"), d);
17131715
break;
17141716
}
17151717
case ETH_P_LOOP: {
17161718
struct ethhdr *innere = (struct ethhdr *)((unsigned char *)e + ETH_HLEN);
1717-
add_assoc_string(&zpayload, "macsrc", ether_ntoa((struct ether_addr *)innere->h_source));
1718-
add_assoc_string(&zpayload, "macdst", ether_ntoa((struct ether_addr *)innere->h_dest));
1719+
zend_update_property_string(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("macsrc"), ether_ntoa((struct ether_addr *)innere->h_source));
1720+
zend_update_property_string(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("macdst"), ether_ntoa((struct ether_addr *)innere->h_dest));
17191721
break;
17201722
}
17211723
default:
1724+
ZVAL_NULL(&zpayload);
1725+
zend_update_property(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("payload"), &zpayload);
1726+
zend_update_property_string(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("rawpayload"), ZSTR_VAL(recv_buf));
1727+
Z_DELREF(zpayload);
17221728
zend_string_efree(recv_buf);
1723-
zval_ptr_dtor(&zpayload);
1724-
zval_ptr_dtor(&obj);
17251729
zend_value_error("unsupported ethernet protocol");
17261730
RETURN_THROWS();
17271731
}
17281732

1729-
Z_DELREF(zpayload);
1730-
zend_string_efree(recv_buf);
17311733
zend_update_property(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("socket"), arg1);
17321734
zend_update_property_string(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("macsrc"), ether_ntoa((struct ether_addr *)e->h_source));
17331735
zend_update_property_string(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("macdst"), ether_ntoa((struct ether_addr *)e->h_dest));
17341736
zend_update_property_long(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("ethprotocol"), protocol);
17351737
zend_update_property(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("payload"), &zpayload);
1738+
zend_update_property_string(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("rawpayload"), ZSTR_VAL(recv_buf));
1739+
Z_DELREF(zpayload);
1740+
zend_string_efree(recv_buf);
17361741

17371742
ZEND_TRY_ASSIGN_REF_VALUE(arg2, &obj);
17381743
ZEND_TRY_ASSIGN_REF_STRING(arg5, ifrname);

ext/sockets/sockets.stub.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2174,6 +2174,8 @@ final class SocketEthernetInfo
21742174
/** @readonly **/
21752175
public string $macdst;
21762176
/** @readonly **/
2177-
public array $payload;
2177+
public string $rawpayload;
2178+
/** @readonly **/
2179+
public object $payload;
21782180
}
21792181
#endif

ext/sockets/sockets_arginfo.h

Lines changed: 8 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ext/sockets/tests/socket_afpacket.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ object(SocketEthernetInfo)#3 (%d) {
5858
["ethprotocol"]=>
5959
int(%i)
6060
["macsrc"]=>
61-
string(11) "0:0:0:0:0:0"
61+
string(%d) "%s:%s:%s:%s:%s:%s"
6262
["macdst"]=>
6363
string(%d) "%s:%s:%s:%s:%s:%s"
6464
["payload"]=>

0 commit comments

Comments
 (0)