]> git.ipfire.org Git - thirdparty/iproute2.git/commitdiff
ipxfrm: use alloca to allocate stack space
authorMike Frysinger <vapier@gentoo.org>
Thu, 17 Jan 2013 18:00:50 +0000 (18:00 +0000)
committerStephen Hemminger <stephen@networkplumber.org>
Fri, 18 Jan 2013 16:17:12 +0000 (08:17 -0800)
Clang doesn't support the gcc extension for embeddeding flexible arrays
inside of structures.  Use the slightly more portable alloca().

Signed-off-by: Mike Frysinger <vapier@gentoo.org>
ip/ipxfrm.c

index c7b342060b932a2aa5519a2436ce30490cf806bc..dda4a7a1166aff5ad742aff853686c48cc9d89f5 100644 (file)
@@ -25,6 +25,7 @@
  *     Masahide NAKAMURA @USAGI
  */
 
+#include <alloca.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -555,16 +556,13 @@ static inline void xfrm_algo_print(struct xfrm_algo *algo, int type, int len,
 static void xfrm_aead_print(struct xfrm_algo_aead *algo, int len,
                            FILE *fp, const char *prefix)
 {
-       struct {
-               struct xfrm_algo algo;
-               char key[algo->alg_key_len / 8];
-       } base;
+       struct xfrm_algo *base_algo = alloca(sizeof(*base_algo) + algo->alg_key_len / 8);
 
-       memcpy(base.algo.alg_name, algo->alg_name, sizeof(base.algo.alg_name));
-       base.algo.alg_key_len = algo->alg_key_len;
-       memcpy(base.algo.alg_key, algo->alg_key, algo->alg_key_len / 8);
+       memcpy(base_algo->alg_name, algo->alg_name, sizeof(base_algo->alg_name));
+       base_algo->alg_key_len = algo->alg_key_len;
+       memcpy(base_algo->alg_key, algo->alg_key, algo->alg_key_len / 8);
 
-       __xfrm_algo_print(&base.algo, XFRMA_ALG_AEAD, len, fp, prefix, 0);
+       __xfrm_algo_print(base_algo, XFRMA_ALG_AEAD, len, fp, prefix, 0);
 
        fprintf(fp, " %d", algo->alg_icv_len);
 
@@ -574,16 +572,13 @@ static void xfrm_aead_print(struct xfrm_algo_aead *algo, int len,
 static void xfrm_auth_trunc_print(struct xfrm_algo_auth *algo, int len,
                                  FILE *fp, const char *prefix)
 {
-       struct {
-               struct xfrm_algo algo;
-               char key[algo->alg_key_len / 8];
-       } base;
+       struct xfrm_algo *base_algo = alloca(sizeof(*base_algo) + algo->alg_key_len / 8);
 
-       memcpy(base.algo.alg_name, algo->alg_name, sizeof(base.algo.alg_name));
-       base.algo.alg_key_len = algo->alg_key_len;
-       memcpy(base.algo.alg_key, algo->alg_key, algo->alg_key_len / 8);
+       memcpy(base_algo->alg_name, algo->alg_name, sizeof(base_algo->alg_name));
+       base_algo->alg_key_len = algo->alg_key_len;
+       memcpy(base_algo->alg_key, algo->alg_key, algo->alg_key_len / 8);
 
-       __xfrm_algo_print(&base.algo, XFRMA_ALG_AUTH_TRUNC, len, fp, prefix, 0);
+       __xfrm_algo_print(base_algo, XFRMA_ALG_AUTH_TRUNC, len, fp, prefix, 0);
 
        fprintf(fp, " %d", algo->alg_trunc_len);