X-Git-Url: http://git.openwrt.org/?p=project%2Fprocd.git;a=blobdiff_plain;f=system.c;h=193c9b05afa6ef5a160a1b11633eb4b543b13fe4;hp=bb2abe5e527e356fba70a6853ec8a57342311dbc;hb=056d8ddda8d5236ac94d6897b674291679c05e91;hpb=7c6cf551df1eb4b59b2576c73db7ad30ac4ce396 diff --git a/system.c b/system.c index bb2abe5..193c9b0 100644 --- a/system.c +++ b/system.c @@ -345,27 +345,40 @@ static int proc_signal(struct ubus_context *ctx, struct ubus_object *obj, enum { SYSUPGRADE_PATH, + SYSUPGRADE_PREFIX, __SYSUPGRADE_MAX }; static const struct blobmsg_policy sysupgrade_policy[__SYSUPGRADE_MAX] = { [SYSUPGRADE_PATH] = { .name = "path", .type = BLOBMSG_TYPE_STRING }, + [SYSUPGRADE_PREFIX] = { .name = "prefix", .type = BLOBMSG_TYPE_STRING }, }; static void -procd_spawn_upgraded(char *path) +procd_exec_upgraded(const char *prefix, char *path) { char *wdt_fd = watchdog_fd(); - char *argv[] = { "/tmp/upgraded", NULL, NULL}; + char *argv[] = { "/sbin/upgraded", NULL, NULL}; + + if (chroot(prefix)) { + fprintf(stderr, "Failed to chroot for upgraded exec.\n"); + return; + } argv[1] = path; DEBUG(2, "Exec to upgraded now\n"); if (wdt_fd) { - watchdog_no_cloexec(); + watchdog_set_cloexec(false); setenv("WDTFD", wdt_fd, 1); } execvp(argv[0], argv); + + /* Cleanup on failure */ + fprintf(stderr, "Failed to exec upgraded.\n"); + unsetenv("WDTFD"); + watchdog_set_cloexec(true); + chroot("."); } static int sysupgrade(struct ubus_context *ctx, struct ubus_object *obj, @@ -378,11 +391,11 @@ static int sysupgrade(struct ubus_context *ctx, struct ubus_object *obj, return UBUS_STATUS_INVALID_ARGUMENT; blobmsg_parse(sysupgrade_policy, __SYSUPGRADE_MAX, tb, blob_data(msg), blob_len(msg)); - if (!tb[SYSUPGRADE_PATH]) + if (!tb[SYSUPGRADE_PATH] || !tb[SYSUPGRADE_PREFIX]) return UBUS_STATUS_INVALID_ARGUMENT; - procd_spawn_upgraded(blobmsg_get_string(tb[SYSUPGRADE_PATH])); - fprintf(stderr, "Yikees, something went wrong. no /sbin/upgraded ?\n"); + procd_exec_upgraded(blobmsg_get_string(tb[SYSUPGRADE_PREFIX]), + blobmsg_get_string(tb[SYSUPGRADE_PATH])); return 0; }