--- strongswan-5.3.3/src/libcharon/plugins/socket_default/socket_default_socket.c	2014-12-17 17:41:41.000000000 +0100
+++ src/src/libcharon/plugins/socket_default/socket_default_socket.c	2015-10-30 13:54:21.385589549 +0100
@@ -418,15 +418,17 @@
 #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 @@
 #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;
