Before waiting for the kernel to reject an invalid name, we
can actually check it before going into the kernel. The code
is stolen from linux kernel function dev_valid_name(),
but it should apply to non-Linux arch as well, because
IFNAMSIZ is POSIX and other errors are obvious.

After this patch I got:

# ovs-vsctl add-port ovsbr0 12345678901234567890
ovs-vsctl: cannot create a port named 12345678901234567890 because the name is 
not valid
# ovs-vsctl add-br 12345678901234567890
ovs-vsctl: cannot create a bridge named 12345678901234567890 because the name 
is not valid

Cc: Ben Pfaff <b...@nicira.com>
Signed-off-by: Cong Wang <xiyou.wangc...@gmail.com>

---
diff --git a/utilities/ovs-vsctl.c b/utilities/ovs-vsctl.c
index fda3a89..3015f8c 100644
--- a/utilities/ovs-vsctl.c
+++ b/utilities/ovs-vsctl.c
@@ -27,6 +27,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <net/if.h>
 
 #include "command-line.h"
 #include "compiler.h"
@@ -992,6 +993,28 @@ vsctl_context_populate_cache(struct vsctl_context *ctx)
     sset_destroy(&bridges);
 }
 
+/* Stolen from Linux kernel net/core/dev.c::dev_valid_name()
+ * Catch the most obvious errors and enforce the POSIX limit IFNAMSIZ
+ */
+static int
+is_valid_name(const char *name)
+{
+    if (*name == '\0')
+        return 0;
+    if (strlen(name) >= IFNAMSIZ)
+        return  0;
+    if (!strcmp(name, ".") || !strcmp(name, ".."))
+        return 0;
+
+    while (*name) {
+        if (*name == '/' || isspace(*name))
+            return 0;
+        name++;
+    }
+
+    return 1;
+}
+
 static void
 check_conflicts(struct vsctl_context *ctx, const char *name,
                 char *msg)
@@ -1001,6 +1024,10 @@ check_conflicts(struct vsctl_context *ctx, const char 
*name,
 
     verify_ports(ctx);
 
+    if (!is_valid_name(name)) {
+        vsctl_fatal("%s because the name is not valid", msg);
+    }
+
     if (shash_find(&ctx->bridges, name)) {
         vsctl_fatal("%s because a bridge named %s already exists",
                     msg, name);
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to