jail: allow rootfs to be a symbolic link
authorDaniel Golle <daniel@makrotopia.org>
Wed, 14 Jul 2021 16:47:22 +0000 (17:47 +0100)
committerDaniel Golle <daniel@makrotopia.org>
Thu, 15 Jul 2021 17:08:03 +0000 (18:08 +0100)
Follow symbolic link to rootfs so we can use autofs symlinks in /mnt
to reference volumes in config.json.

Signed-off-by: Daniel Golle <daniel@makrotopia.org>
jail/jail.c

index b8878b5dab9c43d0e4fc4a57ed137a80caa0177c..dca3992256d32af39441395ea5033fdb30bc713b 100644 (file)
@@ -1325,6 +1325,8 @@ static const struct blobmsg_policy oci_root_policy[] = {
 static int parseOCIroot(const char *jsonfile, struct blob_attr *msg)
 {
        static char extroot[PATH_MAX] = { 0 };
+       char buf[PATH_MAX];
+       ssize_t len;
        struct blob_attr *tb[__OCI_ROOT_MAX];
        char *cur;
        char *root_path;
@@ -1349,6 +1351,21 @@ static int parseOCIroot(const char *jsonfile, struct blob_attr *msg)
 
        strncat(extroot, root_path, PATH_MAX - (strlen(extroot) + 1));
 
+       /* follow symbolic link(s) */
+       while ((len = readlink(extroot, buf, sizeof(buf)-1)) != -1) {
+               buf[len] = '\0';
+               if (buf[0] != '/') {
+                       cur = strrchr(extroot, '/');
+                       if (!cur)
+                               return ENOTDIR;
+
+                       *(++cur) = '\0';
+                       strncat(extroot, buf, sizeof(extroot)-1);
+               } else {
+                       strncpy(extroot, buf, sizeof(extroot)-1);
+               }
+       }
+
        opts.extroot = extroot;
 
        if (tb[OCI_ROOT_READONLY])