From 859efe7f882355bd2fa955aab31c3bee62bcdb70 Mon Sep 17 00:00:00 2001 From: Matthias Bolte Date: Sun, 3 Apr 2011 11:21:16 +0200 Subject: [PATCH] ebtables: Remove PATH_MAX sized stack allocation --- src/util/ebtables.c | 44 +++++++++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/src/util/ebtables.c b/src/util/ebtables.c index e3b8da4db..27dce5ddb 100644 --- a/src/util/ebtables.c +++ b/src/util/ebtables.c @@ -266,29 +266,43 @@ ebtablesAddRemoveRule(ebtRules *rules, int action, const char *arg, ...) ebtablesContext * ebtablesContextNew(const char *driver) { - ebtablesContext *ctx; - char chain[PATH_MAX]; + bool success = false; + ebtablesContext *ctx = NULL; + char *input_chain = NULL; + char *forward_chain = NULL; + char *nat_chain = NULL; if (VIR_ALLOC(ctx) < 0) return NULL; - snprintf(chain, sizeof(chain), "libvirt_%s_INPUT", driver); - if (!(ctx->input_filter = ebtRulesNew("filter", chain))) - goto error; + if (virAsprintf(&input_chain, "libvirt_%s_INPUT", driver) < 0 || + virAsprintf(&forward_chain, "libvirt_%s_FORWARD", driver) < 0 || + virAsprintf(&nat_chain, "libvirt_%s_POSTROUTING", driver) < 0) { + goto cleanup; + } - snprintf(chain, sizeof(chain), "libvirt_%s_FORWARD", driver); - if (!(ctx->forward_filter = ebtRulesNew("filter", chain))) - goto error; + if (!(ctx->input_filter = ebtRulesNew("filter", input_chain))) + goto cleanup; - snprintf(chain, sizeof(chain), "libvirt_%s_POSTROUTING", driver); - if (!(ctx->nat_postrouting = ebtRulesNew("nat", chain))) - goto error; + if (!(ctx->forward_filter = ebtRulesNew("filter", forward_chain))) + goto cleanup; - return ctx; + if (!(ctx->nat_postrouting = ebtRulesNew("nat", nat_chain))) + goto cleanup; - error: - ebtablesContextFree(ctx); - return NULL; + success = true; + +cleanup: + VIR_FREE(input_chain); + VIR_FREE(forward_chain); + VIR_FREE(nat_chain); + + if (!success) { + ebtablesContextFree(ctx); + ctx = NULL; + } + + return ctx; } /** -- 2.39.5