Skip to content

Commit

Permalink
bridge: Remove restriction on socket name.
Browse files Browse the repository at this point in the history
Following patch removes restriction on the listening socket name that gets
configured as bridge controller. Currently, we only connect to sockets in a
specific directory with the name of the bridge. This patch removes the
restriction on the bridge name, keeping the directory restriction.

Bug #14029.
Signed-off-by: Pavithra Ramesh <[email protected]>
Signed-off-by: Ben Pfaff <[email protected]>
  • Loading branch information
paramesh2012 authored and blp committed Jan 16, 2013
1 parent e71336c commit 329e346
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 17 deletions.
1 change: 1 addition & 0 deletions AUTHORS
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ Mehak Mahajan [email protected]
Natasha Gude [email protected]
Neil McKee [email protected]
Paul Fazzone [email protected]
Pavithra Ramesh [email protected]
Philippe Jung [email protected]
Pravin B Shelar [email protected]
Raju Subramanian [email protected]
Expand Down
60 changes: 43 additions & 17 deletions vswitchd/bridge.c
Original file line number Diff line number Diff line change
Expand Up @@ -2730,11 +2730,18 @@ bridge_configure_local_iface_netdev(struct bridge *br,

/* Returns true if 'a' and 'b' are the same except that any number of slashes
* in either string are treated as equal to any number of slashes in the other,
* e.g. "x///y" is equal to "x/y". */
* e.g. "x///y" is equal to "x/y".
*
* Also, if 'b_stoplen' bytes from 'b' are found to be equal to corresponding
* bytes from 'a', the function considers this success. Specify 'b_stoplen' as
* SIZE_MAX to compare all of 'a' to all of 'b' rather than just a prefix of
* 'b' against a prefix of 'a'.
*/
static bool
equal_pathnames(const char *a, const char *b)
equal_pathnames(const char *a, const char *b, size_t b_stoplen)
{
while (*a == *b) {
const char *b_start = b;
while (b - b_start < b_stoplen && *a == *b) {
if (*a == '/') {
a += strspn(a, "/");
b += strspn(b, "/");
Expand Down Expand Up @@ -2792,21 +2799,40 @@ bridge_configure_remotes(struct bridge *br,
static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5);
char *whitelist;

whitelist = xasprintf("unix:%s/%s.controller",
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))) {
VLOG_ERR_RL(&rl, "bridge %s: Not connecting to socket "
"controller \"%s\" due to possibility for "
"remote exploit. Instead, specify socket "
"in whitelisted \"%s\" or connect to "
"\"unix:%s/%s.mgmt\" (which is always "
"available without special configuration).",
br->name, c->target, whitelist,
ovs_rundir(), br->name);
if (!equal_pathnames(c->target, whitelist)) {
/* Prevent remote ovsdb-server users from accessing arbitrary
* Unix domain sockets and overwriting arbitrary local
* files. */
VLOG_ERR_RL(&rl, "bridge %s: Not adding Unix domain socket "
"controller \"%s\" due to possibility for remote "
"exploit. Instead, specify whitelisted \"%s\" or "
"connect to \"unix:%s/%s.mgmt\" (which is always "
"available without special configuration).",
br->name, c->target, whitelist,
ovs_rundir(), br->name);
free(whitelist);
continue;
free(whitelist);
continue;
}
} else {
whitelist = xasprintf("punix:%s/%s.controller",
ovs_rundir(), br->name);
if (!equal_pathnames(c->target, whitelist, SIZE_MAX)) {
/* Prevent remote ovsdb-server users from accessing
* arbitrary Unix domain sockets and overwriting arbitrary
* local files. */
VLOG_ERR_RL(&rl, "bridge %s: Not adding Unix domain socket "
"controller \"%s\" due to possibility of "
"overwriting local files. Instead, specify "
"whitelisted \"%s\" or connect to "
"\"unix:%s/%s.mgmt\" (which is always "
"available without special configuration).",
br->name, c->target, whitelist,
ovs_rundir(), br->name);
free(whitelist);
continue;
}
}

free(whitelist);
Expand Down

0 comments on commit 329e346

Please sign in to comment.