Skip to content

Commit f7409d9

Browse files
committed
add ipv4 test and fix UBSAN alignment issues.
1 parent e1b8154 commit f7409d9

File tree

2 files changed

+46
-5
lines changed

2 files changed

+46
-5
lines changed

ext/sockets/sockets.c

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1684,7 +1684,10 @@ PHP_FUNCTION(socket_recvfrom)
16841684
switch (protocol) {
16851685
case ETH_P_IP: {
16861686
payload = ((unsigned char *)e + ETH_HLEN);
1687-
struct iphdr *ip = (struct iphdr *)payload;
1687+
struct iphdr a;
1688+
memcpy(&a, payload, sizeof(a));
1689+
//struct iphdr *ip = (struct iphdr *)payload;
1690+
struct iphdr *ip = &a;
16881691
size_t tlayer = ip->ihl * 4;
16891692
size_t totalip = ntohs(ip->tot_len);
16901693

@@ -1715,21 +1718,27 @@ PHP_FUNCTION(socket_recvfrom)
17151718

17161719
switch (ip->protocol) {
17171720
case IPPROTO_TCP: {
1718-
struct tcphdr *tcp = (struct tcphdr *)ipdata;
1721+
struct tcphdr a;
1722+
memcpy(&a, ipdata, sizeof(a));
1723+
struct tcphdr *tcp = &a;
17191724
object_init_ex(&szpayload, tcppacket_ce);
17201725
zend_update_property_long(Z_OBJCE(szpayload), Z_OBJ(szpayload), ZEND_STRL("srcPort"), ntohs(tcp->th_sport));
17211726
zend_update_property_long(Z_OBJCE(szpayload), Z_OBJ(szpayload), ZEND_STRL("dstPort"), ntohs(tcp->th_dport));
17221727
zend_update_property_long(Z_OBJCE(szpayload), Z_OBJ(szpayload), ZEND_STRL("headerSize"), sizeof(*tcp));
17231728
zend_update_property(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("payload"), &szpayload);
1729+
Z_DELREF(szpayload);
17241730
break;
17251731
}
17261732
case IPPROTO_UDP: {
1727-
struct udphdr *udp = (struct udphdr *)ipdata;
1733+
struct udphdr a;
1734+
memcpy(&a, ipdata, sizeof(a));
1735+
struct udphdr *udp = &a;
17281736
object_init_ex(&szpayload, udppacket_ce);
17291737
zend_update_property_long(Z_OBJCE(szpayload), Z_OBJ(szpayload), ZEND_STRL("srcPort"), ntohs(udp->uh_sport));
17301738
zend_update_property_long(Z_OBJCE(szpayload), Z_OBJ(szpayload), ZEND_STRL("dstPort"), ntohs(udp->uh_dport));
17311739
zend_update_property_long(Z_OBJCE(szpayload), Z_OBJ(szpayload), ZEND_STRL("headerSize"), sizeof(*udp));
17321740
zend_update_property(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("payload"), &szpayload);
1741+
Z_DELREF(szpayload);
17331742
break;
17341743
}
17351744
default:
@@ -1749,7 +1758,9 @@ PHP_FUNCTION(socket_recvfrom)
17491758
}
17501759
case ETH_P_IPV6: {
17511760
payload = ((unsigned char *)e + ETH_HLEN);
1752-
struct ipv6hdr *ip = (struct ipv6hdr *)payload;
1761+
struct ipv6hdr a;
1762+
memcpy(&a, payload, sizeof(a));
1763+
struct ipv6hdr *ip = &a;
17531764
size_t totalip = sizeof(*ip) + ip->payload_len;
17541765
char s[INET6_ADDRSTRLEN], d[INET6_ADDRSTRLEN];
17551766
inet_ntop(AF_INET6, &ip->saddr, s, sizeof(s));

ext/sockets/tests/socket_afpacket.phpt

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,40 @@ if (!function_exists("posix_getuid") || posix_getuid() != 0) {
5151
try {
5252
socket_recvfrom($s_c, $rsp2, strlen($buf), 0, $addr2);
5353
} catch (\ValueError $e) {
54-
echo $e->getMessage();
54+
echo $e->getMessage(), PHP_EOL;
5555
}
5656

5757
socket_close($s_c);
58+
59+
$s_c = socket_create(AF_PACKET, SOCK_RAW, ETH_P_ALL);
60+
$s_bind = socket_bind($s_c, 'lo');
61+
62+
$s_s = socket_create(AF_PACKET, SOCK_RAW, ETH_P_IP);
63+
$v_bind = socket_bind($s_s, 'lo');
64+
65+
$ip = hex2bin(
66+
"4500" .
67+
"0028" .
68+
"0000" .
69+
"4000" .
70+
"4006" .
71+
"0000" .
72+
"7f000001" .
73+
"7f000001"
74+
);
75+
$p = str_repeat("A", 20); // Total payload 20 + 20 = 40 bytes
76+
77+
$buf = pack("H12H12n", "ffffffffffff", "000000000000", ETH_P_IP);
78+
$buf .= $ip . $p;
79+
80+
$min_frame_size = 60;
81+
$buf .= str_repeat("\x00", max(0, $min_frame_size - strlen($buf)));
82+
83+
var_dump(socket_sendto($s_s, $buf, strlen($buf), 0, "lo", 1));
84+
var_dump(socket_recvfrom($s_c, $rsp, strlen($buf), 0, $addr));
85+
86+
var_dump($addr);
87+
var_dump($rsp);
5888
?>
5989
--EXPECTF--
6090
bool(true)

0 commit comments

Comments
 (0)