diff options
author | Lennart Poettering <lennart@poettering.net> | 2012-05-11 17:17:57 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2012-05-14 22:41:30 +0200 |
commit | 50913bc0c8ced894ceabc7e893c0fdf73af9a261 (patch) | |
tree | 5f07890198cc71171afa2dbafffb22e03af61bd2 | |
parent | 7cf82e0bb1ebafd054824d6fc7121050397824e9 (diff) |
core: add extra safety check before switching root
-rw-r--r-- | src/core/dbus-manager.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/src/core/dbus-manager.c b/src/core/dbus-manager.c index 6ad198436a..33dcb56c09 100644 --- a/src/core/dbus-manager.c +++ b/src/core/dbus-manager.c @@ -1186,6 +1186,7 @@ static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection, } else if (dbus_message_is_method_call(message, "org.freedesktop.systemd1.Manager", "SwitchRoot")) { const char *switch_root, *switch_root_init; char *u, *v; + int k; if (!dbus_message_get_args( message, @@ -1206,6 +1207,22 @@ static DBusHandlerResult bus_manager_message_handler(DBusConnection *connection, return bus_send_error_reply(connection, message, &error, -ENOTSUP); } + /* Safety check */ + if (isempty(switch_root_init)) + k = access(switch_root, F_OK); + else { + char *p; + + p = join(switch_root, "/", switch_root_init, NULL); + if (!p) + goto oom; + + k = access(p, X_OK); + free(p); + } + if (k < 0) + return bus_send_error_reply(connection, message, NULL, -errno); + u = strdup(switch_root); if (!u) goto oom; |