core: add extra safety check before switching root

This commit is contained in:
Lennart Poettering 2012-05-11 17:17:57 +02:00
parent 7cf82e0bb1
commit 50913bc0c8

View file

@ -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;