]> xenbits.xensource.com Git - libvirt.git/commitdiff
ebtables: Remove PATH_MAX sized stack allocation
authorMatthias Bolte <matthias.bolte@googlemail.com>
Sun, 3 Apr 2011 09:21:16 +0000 (11:21 +0200)
committerMatthias Bolte <matthias.bolte@googlemail.com>
Tue, 5 Apr 2011 06:55:27 +0000 (08:55 +0200)
src/util/ebtables.c

index e3b8da4dbdbfd4bc161f77a2bede0c4df4be828b..27dce5ddb1da41bb8ece1d11d4af5c84e36a82d2 100644 (file)
@@ -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;
 }
 
 /**