summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2012-05-11 17:17:57 +0200
committerLennart Poettering <lennart@poettering.net>2012-05-14 22:41:30 +0200
commit50913bc0c8ced894ceabc7e893c0fdf73af9a261 (patch)
tree5f07890198cc71171afa2dbafffb22e03af61bd2
parent7cf82e0bb1ebafd054824d6fc7121050397824e9 (diff)
core: add extra safety check before switching root
-rw-r--r--src/core/dbus-manager.c17
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;