Skip to content

Commit ceb2f97

Browse files
committed
fix nullable payload
1 parent b2c08a1 commit ceb2f97

File tree

4 files changed

+12
-42
lines changed

4 files changed

+12
-42
lines changed

ext/sockets/sockets.c

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

16681668
zval obj;
16691669
object_init_ex(&obj, socket_ethinfo_ce);
1670-
object_init(&zpayload);
16711670

16721671
switch (protocol) {
16731672
case ETH_P_IP: {
@@ -1677,18 +1676,22 @@ PHP_FUNCTION(socket_recvfrom)
16771676
struct in_addr s, d;
16781677
s.s_addr = ip->saddr;
16791678
d.s_addr = ip->daddr;
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));
16821679

16831680
switch (ip->protocol) {
16841681
case IPPROTO_TCP: {
16851682
struct tcphdr *tcp = (struct tcphdr *)ipdata;
1683+
object_init(&zpayload);
1684+
zend_update_property_string(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("ipsrc"), inet_ntoa(s));
1685+
zend_update_property_string(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("ipdst"), inet_ntoa(d));
16861686
zend_update_property_long(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("portsrc"), ntohs(tcp->th_sport));
16871687
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+
object_init(&zpayload);
1693+
zend_update_property_string(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("ipsrc"), inet_ntoa(s));
1694+
zend_update_property_string(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("ipdst"), inet_ntoa(d));
16921695
zend_update_property_long(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("portsrc"), ntohs(udp->uh_sport));
16931696
zend_update_property_long(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("portdst"), ntohs(udp->uh_dport));
16941697
break;
@@ -1697,7 +1700,6 @@ PHP_FUNCTION(socket_recvfrom)
16971700
ZVAL_NULL(&zpayload);
16981701
zend_update_property(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("payload"), &zpayload);
16991702
zend_update_property_string(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("rawpayload"), ZSTR_VAL(recv_buf));
1700-
Z_DELREF(zpayload);
17011703
zend_string_efree(recv_buf);
17021704
zend_value_error("unsupported ip header protocol");
17031705
RETURN_THROWS();
@@ -1710,12 +1712,14 @@ PHP_FUNCTION(socket_recvfrom)
17101712
char s[INET6_ADDRSTRLEN], d[INET6_ADDRSTRLEN];
17111713
inet_ntop(AF_INET6, &ip->saddr, s, sizeof(s));
17121714
inet_ntop(AF_INET6, &ip->daddr, d, sizeof(d));
1715+
object_init(&zpayload);
17131716
zend_update_property_string(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("ipsrc"), s);
17141717
zend_update_property_string(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("ipdst"), d);
17151718
break;
17161719
}
17171720
case ETH_P_LOOP: {
17181721
struct ethhdr *innere = (struct ethhdr *)((unsigned char *)e + ETH_HLEN);
1722+
object_init(&zpayload);
17191723
zend_update_property_string(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("macsrc"), ether_ntoa((struct ether_addr *)innere->h_source));
17201724
zend_update_property_string(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("macdst"), ether_ntoa((struct ether_addr *)innere->h_dest));
17211725
break;
@@ -1724,7 +1728,6 @@ PHP_FUNCTION(socket_recvfrom)
17241728
ZVAL_NULL(&zpayload);
17251729
zend_update_property(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("payload"), &zpayload);
17261730
zend_update_property_string(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("rawpayload"), ZSTR_VAL(recv_buf));
1727-
Z_DELREF(zpayload);
17281731
zend_string_efree(recv_buf);
17291732
zend_value_error("unsupported ethernet protocol");
17301733
RETURN_THROWS();

ext/sockets/sockets.stub.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2176,6 +2176,6 @@ final class SocketEthernetInfo
21762176
/** @readonly **/
21772177
public string $rawpayload;
21782178
/** @readonly **/
2179-
public object $payload;
2179+
public ?object $payload;
21802180
}
21812181
#endif

ext/sockets/sockets_arginfo.h

Lines changed: 2 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 & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ if (!function_exists("posix_getuid") || posix_getuid() != 0) {
1515
?>
1616
--FILE--
1717
<?php
18-
$s_c = socket_create(AF_PACKET, SOCK_RAW, ETH_P_ALL);
18+
$s_c = socket_create(AF_PACKET, SOCK_RAW, ETH_P_IP);
1919
$s_bind = socket_bind($s_c, 'lo');
2020
var_dump($s_bind);
2121

@@ -26,19 +26,6 @@ if (!function_exists("posix_getuid") || posix_getuid() != 0) {
2626
var_dump($iindex);
2727

2828
socket_getpeername($s_c, $istr2, $iindex2);
29-
30-
$s_s = socket_create(AF_PACKET, SOCK_RAW, ETH_P_LOOP);
31-
$v_bind = socket_bind($s_s, 'lo');
32-
33-
$buf = pack("H12H12n", "ffffffffffff", "000000000000", ETH_P_LOOP);
34-
$buf .= str_repeat("A", 46);
35-
36-
var_dump(socket_sendto($s_s, $buf, strlen($buf), 0, "lo", 1));
37-
var_dump(socket_recvfrom($s_c, $rsp, strlen($buf), 0, $addr));
38-
39-
var_dump($addr);
40-
var_dump($rsp);
41-
4229
socket_close($s_c);
4330
?>
4431
--EXPECTF--
@@ -48,23 +35,3 @@ string(2) "lo"
4835
int(%i)
4936

5037
Warning: socket_getpeername(): unable to retrieve peer name [95]: %sot supported in %s on line %d
51-
int(60)
52-
int(60)
53-
string(2) "lo"
54-
object(SocketEthernetInfo)#3 (%d) {
55-
["socket"]=>
56-
object(Socket)#1 (0) {
57-
}
58-
["ethprotocol"]=>
59-
int(%i)
60-
["macsrc"]=>
61-
string(%d) "%s:%s:%s:%s:%s:%s"
62-
["macdst"]=>
63-
string(%d) "%s:%s:%s:%s:%s:%s"
64-
["rawpayload"]=>
65-
string(%d) "%s"
66-
["payload"]=>
67-
object(stdClass)#4 (%d) {
68-
%a
69-
}
70-
}

0 commit comments

Comments
 (0)