Depending on compiler and cflags, it could be not working at all.
Signed-off-by: Maxime Bizon <[email protected]> --- .../plugins/socket_default/socket_default_socket.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/libcharon/plugins/socket_default/socket_default_socket.c b/src/libcharon/plugins/socket_default/socket_default_socket.c index dbfddbb..2fdfbe1 100644 --- a/src/libcharon/plugins/socket_default/socket_default_socket.c +++ b/src/libcharon/plugins/socket_default/socket_default_socket.c @@ -418,15 +418,17 @@ METHOD(socket_t, sender, status_t, #if defined(IP_PKTINFO) || defined(IP_SENDSRCADDR) struct in_addr *addr; struct sockaddr_in *sin; + char *buf; #ifdef IP_PKTINFO - char buf[CMSG_SPACE(sizeof(struct in_pktinfo))]; + size_t buf_size = CMSG_SPACE(sizeof(struct in_pktinfo)); struct in_pktinfo *pktinfo; #elif defined(IP_SENDSRCADDR) - char buf[CMSG_SPACE(sizeof(struct in_addr))]; + size_t buf_size = CMSG_SPACE(sizeof(struct in_addr)); #endif - memset(buf, 0, sizeof(buf)); + buf = alloca(buf_size); + memset(buf, 0, buf_size); msg.msg_control = buf; - msg.msg_controllen = sizeof(buf); + msg.msg_controllen = buf_size; cmsg = CMSG_FIRSTHDR(&msg); cmsg->cmsg_level = SOL_IP; #ifdef IP_PKTINFO @@ -446,13 +448,15 @@ METHOD(socket_t, sender, status_t, #ifdef HAVE_IN6_PKTINFO else { - char buf[CMSG_SPACE(sizeof(struct in6_pktinfo))]; + size_t buf_size = CMSG_SPACE(sizeof(struct in6_pktinfo)); + char *buf; struct in6_pktinfo *pktinfo; struct sockaddr_in6 *sin; - memset(buf, 0, sizeof(buf)); + buf = alloca(buf_size); + memset(buf, 0, buf_size); msg.msg_control = buf; - msg.msg_controllen = sizeof(buf); + msg.msg_controllen = buf_size; cmsg = CMSG_FIRSTHDR(&msg); cmsg->cmsg_level = SOL_IPV6; cmsg->cmsg_type = IPV6_PKTINFO; -- 1.9.1 -- Maxime _______________________________________________ Dev mailing list [email protected] https://lists.strongswan.org/mailman/listinfo/dev
