Skip to content

Commit f51eadb

Browse files
committed
fix leaks on failure
1 parent fd1c0f4 commit f51eadb

File tree

2 files changed

+13
-20
lines changed

2 files changed

+13
-20
lines changed

ext/sockets/sockets.c

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1657,9 +1657,6 @@ PHP_FUNCTION(socket_recvfrom)
16571657

16581658
zval obj;
16591659
object_init_ex(&obj, socket_ethinfo_ce);
1660-
zend_update_property_string(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("macsrc"), ether_ntoa((struct ether_addr *)e->h_source));
1661-
zend_update_property_string(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("macdst"), ether_ntoa((struct ether_addr *)e->h_dest));
1662-
zend_update_property_long(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("ethprotocol"), protocol);
16631660
array_init(&zpayload);
16641661

16651662
switch (protocol) {
@@ -1710,10 +1707,16 @@ PHP_FUNCTION(socket_recvfrom)
17101707
break;
17111708
}
17121709
default:
1710+
zend_string_efree(recv_buf);
1711+
zval_ptr_dtor(&zpayload);
1712+
zval_ptr_dtor(&obj);
17131713
zend_value_error("unsupported ethernet protocol");
17141714
RETURN_THROWS();
17151715
}
17161716

1717+
zend_update_property_string(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("macsrc"), ether_ntoa((struct ether_addr *)e->h_source));
1718+
zend_update_property_string(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("macdst"), ether_ntoa((struct ether_addr *)e->h_dest));
1719+
zend_update_property_long(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("ethprotocol"), protocol);
17171720
zend_update_property(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("payload"), &zpayload);
17181721

17191722
ZEND_TRY_ASSIGN_REF_COPY(arg2, &obj);
@@ -1745,6 +1748,7 @@ PHP_FUNCTION(socket_sendto)
17451748
#endif
17461749
#ifdef AF_PACKET
17471750
struct sockaddr_ll sll;
1751+
unsigned char halen;
17481752
#endif
17491753
int retval;
17501754
size_t buf_len, addr_len;
@@ -1826,17 +1830,20 @@ PHP_FUNCTION(socket_sendto)
18261830
RETURN_THROWS();
18271831
}
18281832

1833+
halen = addr_len > ETH_ALEN ? ETH_ALEN : (unsigned char)addr_len;
1834+
18291835
memset(&sll, 0, sizeof(sll));
1836+
memcpy(sll.sll_addr, addr, halen);
18301837
sll.sll_family = AF_PACKET;
18311838
sll.sll_ifindex = port;
1832-
sll.sll_halen = ETH_ALEN;
1839+
sll.sll_halen = halen;
18331840

18341841
// TODO allows to use more user friendly type to replace raw buffer usage
18351842
retval = sendto(php_sock->bsd_socket, buf, ((size_t)len > buf_len) ? buf_len : (size_t)len, flags, (struct sockaddr *) &sll, sizeof(sll));
18361843
break;
18371844
#endif
18381845
default:
1839-
zend_argument_value_error(1, "must be one of AF_UNIX, AF_INET, or AF_INET6");
1846+
zend_argument_value_error(1, "must be one of AF_UNIX, AF_INET, AF_PACKET or AF_INET6");
18401847
RETURN_THROWS();
18411848
}
18421849

ext/sockets/tests/socket_afpacket.phpt

Lines changed: 1 addition & 15 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_ALL);
31-
$v_bind = socket_bind($s_s, 'lo');
32-
33-
$buf = str_repeat("0", ETH_FRAME_LEN) .
34-
str_repeat("\xFF", 6) .
35-
str_repeat("\x11", 6) .
36-
"\x08\x00" .
37-
str_pad(str_repeat("test", 512), 2048, "\x00");
38-
39-
var_dump(socket_sendto($s_s, $buf, strlen($buf), 0, "lo", 1));
40-
41-
socket_close($s_s);
4229
socket_close($s_c);
4330
?>
4431
--EXPECTF--
@@ -48,4 +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(3576)

0 commit comments

Comments
 (0)