[ovs-dev] [PATCH] stream-unix: append ovs_rundir to socket If socket path specified is relative to ovs_rundir(), append the directory name to in unix_open.

Pavithra Ramesh paramesh at vmware.com
Wed Feb 6 19:28:55 UTC 2013


Taken care of the memroy leak, used xasprintf instead.
Also included the change in bridge.c to relax the whitelist
check.

Signed-off-by: Pavithra Ramesh <paramesh at vmware.com>
---
 lib/stream-unix.c |   11 ++++++++++-
 vswitchd/bridge.c |    6 ++++--
 2 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/lib/stream-unix.c b/lib/stream-unix.c
index 6ed7648..a71108c 100644
--- a/lib/stream-unix.c
+++ b/lib/stream-unix.c
@@ -29,6 +29,7 @@
 #include "packets.h"
 #include "poll-loop.h"
 #include "socket-util.h"
+#include "dirs.h"
 #include "util.h"
 #include "stream-provider.h"
 #include "stream-fd.h"
@@ -42,15 +43,23 @@ static int
 unix_open(const char *name, char *suffix, struct stream **streamp,
           uint8_t dscp OVS_UNUSED)
 {
-    const char *connect_path = suffix;
+    const char *ovsDir = ovs_rundir();
+    char *new_path = NULL, *connect_path = suffix;
     int fd;
 
+    if (suffix[0] != '/') {
+        /* Not specified absolute path */
+        new_path = xasprintf("%s/%s", ovsDir, suffix);
+        connect_path = new_path;
+    }
     fd = make_unix_socket(SOCK_STREAM, true, NULL, connect_path);
     if (fd < 0) {
         VLOG_DBG("%s: connection failed (%s)", connect_path, strerror(-fd));
+        free(new_path);        
         return -fd;
     }
 
+    free(new_path);        
     return new_fd_stream(name, fd, check_connection_completion(fd), streamp);
 }
 
diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c
index f5a4366..ed51ab4 100644
--- a/vswitchd/bridge.c
+++ b/vswitchd/bridge.c
@@ -2799,8 +2799,10 @@ bridge_configure_remotes(struct bridge *br,
             if (!strncmp(c->target, "unix:", 5)) {
                 /* Connect to a listening socket */
                 whitelist = xasprintf("unix:%s/", ovs_rundir());
-                if (!equal_pathnames(c->target, whitelist,
-                                     strlen(whitelist))) {
+                if ((c->target[5] == '/') &&
+                   (!equal_pathnames(c->target, whitelist,
+                     strlen(whitelist)))) {
+                    /* Absolute path specified, but not in ovs_rundir */
                     VLOG_ERR_RL(&rl, "bridge %s: Not connecting to socket "
                                   "controller \"%s\" due to possibility for "
                                   "remote exploit.  Instead, specify socket "
-- 
1.7.0.4




More information about the dev mailing list