summaryrefslogtreecommitdiff
path: root/ext/sockets/multicast.c
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2019-06-20 16:13:16 +0200
committerNikita Popov <nikita.ppv@gmail.com>2019-06-20 17:24:16 +0200
commitdd6d47183432df70d48a47d456ecde318174770d (patch)
tree578a8f7c941c30284794bea0c99ed3791609ea65 /ext/sockets/multicast.c
parentd80f0ff6c0a557d8c993a9d2bd006fb488f6d564 (diff)
downloadphp-git-dd6d47183432df70d48a47d456ecde318174770d.tar.gz
Handle misaligned ifreq on macos
Diffstat (limited to 'ext/sockets/multicast.c')
-rw-r--r--ext/sockets/multicast.c23
1 files changed, 11 insertions, 12 deletions
diff --git a/ext/sockets/multicast.c b/ext/sockets/multicast.c
index e874803656..481bf94f8c 100644
--- a/ext/sockets/multicast.c
+++ b/ext/sockets/multicast.c
@@ -788,28 +788,27 @@ int php_add4_to_if_index(struct in_addr *addr, php_socket *php_sock, unsigned *i
for (p = if_conf.ifc_buf;
p < if_conf.ifc_buf + if_conf.ifc_len;
p += entry_len) {
- struct ifreq *cur_req;
-
- /* let's hope the pointer is aligned */
- cur_req = (struct ifreq*) p;
+ /* p may be misaligned on macos. */
+ struct ifreq cur_req;
+ memcpy(&cur_req, p, sizeof(struct ifreq));
#ifdef HAVE_SOCKADDR_SA_LEN
- entry_len = cur_req->ifr_addr.sa_len + sizeof(cur_req->ifr_name);
+ entry_len = cur_req.ifr_addr.sa_len + sizeof(cur_req.ifr_name);
#else
/* if there's no sa_len, assume the ifr_addr field is a sockaddr */
- entry_len = sizeof(struct sockaddr) + sizeof(cur_req->ifr_name);
+ entry_len = sizeof(struct sockaddr) + sizeof(cur_req.ifr_name);
#endif
- entry_len = MAX(entry_len, sizeof(*cur_req));
+ entry_len = MAX(entry_len, sizeof(cur_req));
- if ((((struct sockaddr*)&cur_req->ifr_addr)->sa_family == AF_INET) &&
- (((struct sockaddr_in*)&cur_req->ifr_addr)->sin_addr.s_addr ==
+ if ((((struct sockaddr*)&cur_req.ifr_addr)->sa_family == AF_INET) &&
+ (((struct sockaddr_in*)&cur_req.ifr_addr)->sin_addr.s_addr ==
addr->s_addr)) {
#if defined(SIOCGIFINDEX)
- if (ioctl(php_sock->bsd_socket, SIOCGIFINDEX, (char*)cur_req)
+ if (ioctl(php_sock->bsd_socket, SIOCGIFINDEX, (char*)&cur_req)
== -1) {
#elif defined(HAVE_IF_NAMETOINDEX)
unsigned index_tmp;
- if ((index_tmp = if_nametoindex(cur_req->ifr_name)) == 0) {
+ if ((index_tmp = if_nametoindex(cur_req.ifr_name)) == 0) {
#else
#error Neither SIOCGIFINDEX nor if_nametoindex are available
#endif
@@ -819,7 +818,7 @@ int php_add4_to_if_index(struct in_addr *addr, php_socket *php_sock, unsigned *i
goto err;
} else {
#if defined(SIOCGIFINDEX)
- *if_index = cur_req->ifr_ifindex;
+ *if_index = cur_req.ifr_ifindex;
#else
*if_index = index_tmp;
#endif