Skip to content

Commit f859a70

Browse files
committed
addressing concerns
1 parent 640ee0b commit f859a70

File tree

1 file changed

+50
-43
lines changed

1 file changed

+50
-43
lines changed

ext/sockets/sockets.c

Lines changed: 50 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1441,10 +1441,10 @@ PHP_FUNCTION(socket_bind)
14411441
if ((char *)ipdata + sizeof(a) < ZSTR_VAL(recv_buf) + slen) { \
14421442
zend_string_efree(recv_buf); \
14431443
Z_DELREF_P(zpayload); \
1444-
ZEND_TRY_ASSIGN_REF_VALUE(arg2, obj); \
1445-
ZEND_TRY_ASSIGN_REF_STRING(arg5, ifrname); \
1446-
if (arg6) { \
1447-
ZEND_TRY_ASSIGN_REF_LONG(arg6, sll.sll_ifindex);\
1444+
ZEND_TRY_ASSIGN_REF_VALUE(data, obj); \
1445+
ZEND_TRY_ASSIGN_REF_STRING(addr, ifrname); \
1446+
if (index) { \
1447+
ZEND_TRY_ASSIGN_REF_LONG(index, sll.sll_ifindex);\
14481448
} \
14491449
zend_value_error("invalid %s header", lyr); \
14501450
return FAILURE; \
@@ -1462,7 +1462,7 @@ static zend_result php_socket_get_chunk(zend_string *dst, const zend_string *src
14621462
}
14631463

14641464
static zend_result php_socket_afpacket_add_tcp(unsigned char *ipdata, struct sockaddr_ll sll, char *ifrname, zend_string *recv_buf,
1465-
size_t slen, zval *szpayload, zval *zpayload, zval *obj, zval *arg2, zval *arg5, zval *arg6, size_t headersize) {
1465+
size_t slen, zval *szpayload, zval *zpayload, zval *obj, zval *data, zval *addr, zval *index, size_t headersize) {
14661466
struct tcphdr tcp;
14671467
ETH_SUB_CHECKLENGTH(tcp, "TCP");
14681468
memcpy(&tcp, ipdata, sizeof(tcp));
@@ -1477,7 +1477,7 @@ static zend_result php_socket_afpacket_add_tcp(unsigned char *ipdata, struct soc
14771477
}
14781478

14791479
static zend_result php_socket_afpacket_add_udp(unsigned char *ipdata, struct sockaddr_ll sll, char *ifrname, zend_string *recv_buf,
1480-
size_t slen, zval *szpayload, zval *zpayload, zval *obj, zval *arg2, zval *arg5, zval *arg6, size_t headersize) {
1480+
size_t slen, zval *szpayload, zval *zpayload, zval *obj, zval *data, zval *addr, zval *index, size_t headersize) {
14811481
struct udphdr udp;
14821482
ETH_SUB_CHECKLENGTH(udp, "UDP");
14831483
memcpy(&udp, ipdata, sizeof(udp));
@@ -1700,7 +1700,13 @@ PHP_FUNCTION(socket_recvfrom)
17001700
break;
17011701
#endif
17021702
#ifdef AF_PACKET
1703-
case AF_PACKET:
1703+
case AF_PACKET: {
1704+
zval *socket = arg1;
1705+
zval *data = arg2;
1706+
size_t recv_len = (size_t)arg3;
1707+
int recv_flags = (int)arg4;
1708+
zval *addr = arg5;
1709+
zval *index = arg6;
17041710
getsockopt(php_sock->bsd_socket, SOL_SOCKET, SO_TYPE, (char *) &protoid, &protoidlen);
17051711

17061712
// TODO: SOCK_DGRAM support
@@ -1715,7 +1721,7 @@ PHP_FUNCTION(socket_recvfrom)
17151721
char ifrname[IFNAMSIZ];
17161722
zval zpayload;
17171723

1718-
retval = recvfrom(php_sock->bsd_socket, ZSTR_VAL(recv_buf), arg3, arg4, (struct sockaddr *)&sll, (socklen_t *)&slen);
1724+
retval = recvfrom(php_sock->bsd_socket, ZSTR_VAL(recv_buf), recv_len, recv_flags, (struct sockaddr *)&sll, (socklen_t *)&slen);
17191725

17201726
if (retval < 0) {
17211727
PHP_SOCKET_ERROR(php_sock, "unable to recvfrom", errno);
@@ -1735,7 +1741,7 @@ PHP_FUNCTION(socket_recvfrom)
17351741
RETURN_FALSE;
17361742
}
17371743

1738-
dst_buf = zend_string_alloc(arg3, false);
1744+
dst_buf = zend_string_alloc(recv_len + 1, false);
17391745

17401746
if (php_socket_get_chunk(dst_buf, recv_buf, 0, ETH_HLEN) == FAILURE) {
17411747
zend_value_error("invalid ethernet frame buffer length");
@@ -1751,7 +1757,7 @@ PHP_FUNCTION(socket_recvfrom)
17511757

17521758
zval obj;
17531759
object_init_ex(&obj, ethpacket_ce);
1754-
zend_update_property(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("socket"), arg1);
1760+
zend_update_property(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("socket"), socket);
17551761
zend_update_property_long(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("headerSize"), ETH_HLEN);
17561762
zend_update_property_long(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("ethProtocol"), protocol);
17571763

@@ -1776,11 +1782,11 @@ PHP_FUNCTION(socket_recvfrom)
17761782
zend_update_property_stringl(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("rawPacket"), ZSTR_VAL(recv_buf), ZSTR_LEN(recv_buf));
17771783
zend_string_release(dst_buf);
17781784
zend_string_efree(recv_buf);
1779-
ZEND_TRY_ASSIGN_REF_VALUE(arg2, &obj);
1780-
ZEND_TRY_ASSIGN_REF_STRING(arg5, ifrname);
1785+
ZEND_TRY_ASSIGN_REF_VALUE(data, &obj);
1786+
ZEND_TRY_ASSIGN_REF_STRING(addr, ifrname);
17811787

1782-
if (arg6) {
1783-
ZEND_TRY_ASSIGN_REF_LONG(arg6, sll.sll_ifindex);
1788+
if (index) {
1789+
ZEND_TRY_ASSIGN_REF_LONG(index, sll.sll_ifindex);
17841790
}
17851791
zend_value_error("invalid transport header length");
17861792
RETURN_THROWS();
@@ -1804,7 +1810,7 @@ PHP_FUNCTION(socket_recvfrom)
18041810
RETURN_THROWS();
18051811
}
18061812
unsigned char *ipdata = (unsigned char *)ZSTR_VAL(dst_buf);
1807-
if (php_socket_afpacket_add_tcp(ipdata, sll, ifrname, recv_buf, slen, &szpayload, &zpayload, &obj, arg2, arg5, arg6, ZSTR_LEN(dst_buf)) == FAILURE) {
1813+
if (php_socket_afpacket_add_tcp(ipdata, sll, ifrname, recv_buf, slen, &szpayload, &zpayload, &obj, data, addr, index, ZSTR_LEN(dst_buf)) == FAILURE) {
18081814
zend_string_release(dst_buf);
18091815
zend_string_efree(recv_buf);
18101816
RETURN_THROWS();
@@ -1819,7 +1825,7 @@ PHP_FUNCTION(socket_recvfrom)
18191825
RETURN_THROWS();
18201826
}
18211827
unsigned char *ipdata = (unsigned char *)ZSTR_VAL(dst_buf);
1822-
if (php_socket_afpacket_add_udp(ipdata, sll, ifrname, recv_buf, slen, &szpayload, &zpayload, &obj, arg2, arg5, arg6, ZSTR_LEN(dst_buf)) == FAILURE) {
1828+
if (php_socket_afpacket_add_udp(ipdata, sll, ifrname, recv_buf, slen, &szpayload, &zpayload, &obj, data, addr, index, ZSTR_LEN(dst_buf)) == FAILURE) {
18231829
zend_string_release(dst_buf);
18241830
zend_string_efree(recv_buf);
18251831
RETURN_THROWS();
@@ -1832,11 +1838,11 @@ PHP_FUNCTION(socket_recvfrom)
18321838
zend_string_efree(recv_buf);
18331839
zend_string_release(dst_buf);
18341840
Z_DELREF(zpayload);
1835-
ZEND_TRY_ASSIGN_REF_VALUE(arg2, &obj);
1836-
ZEND_TRY_ASSIGN_REF_STRING(arg5, ifrname);
1841+
ZEND_TRY_ASSIGN_REF_VALUE(data, &obj);
1842+
ZEND_TRY_ASSIGN_REF_STRING(addr, ifrname);
18371843

1838-
if (arg6) {
1839-
ZEND_TRY_ASSIGN_REF_LONG(arg6, sll.sll_ifindex);
1844+
if (index) {
1845+
ZEND_TRY_ASSIGN_REF_LONG(index, sll.sll_ifindex);
18401846
}
18411847
zend_value_error("unsupported ip header protocol");
18421848
RETURN_THROWS();
@@ -1860,11 +1866,11 @@ PHP_FUNCTION(socket_recvfrom)
18601866
zend_update_property_string(Z_OBJCE(obj), Z_OBJ(obj), ZEND_STRL("rawPacket"), ZSTR_VAL(recv_buf));
18611867
zend_string_efree(recv_buf);
18621868
zend_string_release(dst_buf);
1863-
ZEND_TRY_ASSIGN_REF_VALUE(arg2, &obj);
1864-
ZEND_TRY_ASSIGN_REF_STRING(arg5, ifrname);
1869+
ZEND_TRY_ASSIGN_REF_VALUE(data, &obj);
1870+
ZEND_TRY_ASSIGN_REF_STRING(addr, ifrname);
18651871

1866-
if (arg6) {
1867-
ZEND_TRY_ASSIGN_REF_LONG(arg6, sll.sll_ifindex);
1872+
if (index) {
1873+
ZEND_TRY_ASSIGN_REF_LONG(index, sll.sll_ifindex);
18681874
}
18691875
zend_value_error("invalid transport header length");
18701876
RETURN_THROWS();
@@ -1889,7 +1895,7 @@ PHP_FUNCTION(socket_recvfrom)
18891895
RETURN_THROWS();
18901896
}
18911897
unsigned char *ipdata = (unsigned char *)ZSTR_VAL(dst_buf);
1892-
if (php_socket_afpacket_add_tcp(ipdata, sll, ifrname, recv_buf, slen, &szpayload, &zpayload, &obj, arg2, arg5, arg6, ZSTR_LEN(dst_buf)) == FAILURE) {
1898+
if (php_socket_afpacket_add_tcp(ipdata, sll, ifrname, recv_buf, slen, &szpayload, &zpayload, &obj, data, addr, index, ZSTR_LEN(dst_buf)) == FAILURE) {
18931899
zend_string_release(dst_buf);
18941900
zend_string_efree(recv_buf);
18951901
RETURN_THROWS();
@@ -1904,7 +1910,7 @@ PHP_FUNCTION(socket_recvfrom)
19041910
RETURN_THROWS();
19051911
}
19061912
unsigned char *ipdata = (unsigned char *)ZSTR_VAL(dst_buf);
1907-
if (php_socket_afpacket_add_udp(ipdata, sll, ifrname, recv_buf, slen, &szpayload, &zpayload, &obj, arg2, arg5, arg6, ZSTR_LEN(dst_buf)) == FAILURE) {
1913+
if (php_socket_afpacket_add_udp(ipdata, sll, ifrname, recv_buf, slen, &szpayload, &zpayload, &obj, data, addr, data, ZSTR_LEN(dst_buf)) == FAILURE) {
19081914
zend_string_release(dst_buf);
19091915
zend_string_efree(recv_buf);
19101916
RETURN_THROWS();
@@ -1918,11 +1924,11 @@ PHP_FUNCTION(socket_recvfrom)
19181924
zend_string_efree(recv_buf);
19191925
zend_string_release(dst_buf);
19201926
Z_DELREF(zpayload);
1921-
ZEND_TRY_ASSIGN_REF_VALUE(arg2, &obj);
1922-
ZEND_TRY_ASSIGN_REF_STRING(arg5, ifrname);
1927+
ZEND_TRY_ASSIGN_REF_VALUE(data, &obj);
1928+
ZEND_TRY_ASSIGN_REF_STRING(addr, ifrname);
19231929

1924-
if (arg6) {
1925-
ZEND_TRY_ASSIGN_REF_LONG(arg6, sll.sll_ifindex);
1930+
if (index) {
1931+
ZEND_TRY_ASSIGN_REF_LONG(index, sll.sll_ifindex);
19261932
}
19271933
zend_value_error("unsupported ipv6 header protocol");
19281934
RETURN_THROWS();
@@ -1941,10 +1947,10 @@ PHP_FUNCTION(socket_recvfrom)
19411947
if ((char *)payload + sizeof(innere) < ZSTR_VAL(recv_buf) + slen) {
19421948
zend_string_efree(recv_buf);
19431949
zend_string_release(dst_buf);
1944-
ZEND_TRY_ASSIGN_REF_VALUE(arg2, &obj);
1945-
ZEND_TRY_ASSIGN_REF_STRING(arg5, ifrname);
1946-
if (arg6) {
1947-
ZEND_TRY_ASSIGN_REF_LONG(arg6, sll.sll_ifindex);
1950+
ZEND_TRY_ASSIGN_REF_VALUE(data, &obj);
1951+
ZEND_TRY_ASSIGN_REF_STRING(addr, ifrname);
1952+
if (index) {
1953+
ZEND_TRY_ASSIGN_REF_LONG(index, sll.sll_ifindex);
19481954
}
19491955
zend_value_error("invalid ethernet loop header");
19501956
RETURN_THROWS();
@@ -1956,7 +1962,7 @@ PHP_FUNCTION(socket_recvfrom)
19561962
zend_update_property_string(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("srcMac"), ether_ntoa((struct ether_addr *)innere.h_source));
19571963
zend_update_property_string(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("dstMac"), ether_ntoa((struct ether_addr *)innere.h_dest));
19581964
zend_update_property_long(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("headerSize"), ETH_HLEN);
1959-
zend_update_property(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("socket"), arg1);
1965+
zend_update_property(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("socket"), socket);
19601966
zend_update_property(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("rawPacket"), &innerp);
19611967
zend_update_property(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("payload"), &innerp);
19621968
zend_update_property_long(Z_OBJCE(zpayload), Z_OBJ(zpayload), ZEND_STRL("ethProtocol"), 0);
@@ -1969,11 +1975,11 @@ PHP_FUNCTION(socket_recvfrom)
19691975
zend_string_efree(recv_buf);
19701976
zend_string_release(dst_buf);
19711977

1972-
ZEND_TRY_ASSIGN_REF_VALUE(arg2, &obj);
1973-
ZEND_TRY_ASSIGN_REF_STRING(arg5, ifrname);
1978+
ZEND_TRY_ASSIGN_REF_VALUE(data, &obj);
1979+
ZEND_TRY_ASSIGN_REF_STRING(addr, ifrname);
19741980

1975-
if (arg6) {
1976-
ZEND_TRY_ASSIGN_REF_LONG(arg6, sll.sll_ifindex);
1981+
if (index) {
1982+
ZEND_TRY_ASSIGN_REF_LONG(index, sll.sll_ifindex);
19771983
}
19781984
zend_value_error("unsupported ethernet protocol");
19791985
RETURN_THROWS();
@@ -1987,13 +1993,14 @@ PHP_FUNCTION(socket_recvfrom)
19871993
zend_string_efree(recv_buf);
19881994
zend_string_free(dst_buf);
19891995

1990-
ZEND_TRY_ASSIGN_REF_VALUE(arg2, &obj);
1991-
ZEND_TRY_ASSIGN_REF_STRING(arg5, ifrname);
1996+
ZEND_TRY_ASSIGN_REF_VALUE(data, &obj);
1997+
ZEND_TRY_ASSIGN_REF_STRING(addr, ifrname);
19921998

1993-
if (arg6) {
1994-
ZEND_TRY_ASSIGN_REF_LONG(arg6, sll.sll_ifindex);
1999+
if (index) {
2000+
ZEND_TRY_ASSIGN_REF_LONG(index, sll.sll_ifindex);
19952001
}
19962002
break;
2003+
}
19972004
#endif
19982005
default:
19992006
zend_argument_value_error(1, "must be one of AF_UNIX, AF_INET, or AF_INET6");

0 commit comments

Comments
 (0)