chroot() can fail and its return value should be checked against, in that case
do an exit() since this is a fatal condition that we cannot recover from.

Fixes: 63789e51ed91 ("init: add support for sysupgrades triggered from preinit")
Signed-off-by: Florian Fainelli <f.faine...@gmail.com>
---
 sysupgrade.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/sysupgrade.c b/sysupgrade.c
index 30f1836135c9..07e33f752d0c 100644
--- a/sysupgrade.c
+++ b/sysupgrade.c
@@ -26,8 +26,10 @@ void sysupgrade_exec_upgraded(const char *prefix, char 
*path, char *command)
 {
        char *wdt_fd = watchdog_fd();
        char *argv[] = { "/sbin/upgraded", NULL, NULL, NULL};
+       int ret;
 
-       if (chroot(prefix)) {
+       ret = chroot(prefix);
+       if (ret < 0) {
                fprintf(stderr, "Failed to chroot for upgraded exec.\n");
                return;
        }
@@ -45,5 +47,9 @@ void sysupgrade_exec_upgraded(const char *prefix, char *path, 
char *command)
        fprintf(stderr, "Failed to exec upgraded.\n");
        unsetenv("WDTFD");
        watchdog_set_cloexec(true);
-       chroot(".");
+       ret = chroot(".");
+       if (ret < 0) {
+               fprintf(stderr, "Failed to reset chroot, exiting.\n");
+               exit(EXIT_FAILURE);
+       }
 }
-- 
2.11.0


_______________________________________________
Lede-dev mailing list
Lede-dev@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/lede-dev

Reply via email to