From: Mike Frysinger Date: Thu, 17 Jan 2013 18:00:50 +0000 (+0000) Subject: ipxfrm: use alloca to allocate stack space X-Git-Tag: v3.8.0~3^2~24 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=048bff6e0206bca33ee70516521f3048e7714752;p=thirdparty%2Fiproute2.git ipxfrm: use alloca to allocate stack space 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 --- diff --git a/ip/ipxfrm.c b/ip/ipxfrm.c index c7b342060..dda4a7a11 100644 --- a/ip/ipxfrm.c +++ b/ip/ipxfrm.c @@ -25,6 +25,7 @@ * Masahide NAKAMURA @USAGI */ +#include #include #include #include @@ -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);