]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
Check for symlinks before attempting create.
authorMichael H. Warfield <mhw@WittsEnd.com>
Fri, 25 Apr 2014 16:06:44 +0000 (12:06 -0400)
committerSerge Hallyn <serge.hallyn@ubuntu.com>
Mon, 28 Apr 2014 15:19:01 +0000 (10:19 -0500)
Check for symlinks before attempting create.

When attempting to create the compulsory symlinks in /dev,
check for the existence of the link using stat first before
blindly attempting to create the link.

This works around an apparent quirk in the kernel VFS on read-only
file systems where the returned error code might be EEXIST or EROFS
depending on previous access to the /dev directory and its entries.

Reported-by: William Dauchy <william@gandi.net>
Signed-off-by: Michael H. Warfield <mhw@WittsEnd.com>
Tested-by: William Dauchy <william@gandi.net>
src/lxc/conf.c

index 4052c5f66b54f5f6020ccb36051b8fb05508300b..d765f0da5b75c762ea59cf412401ca5e1e421daf 100644 (file)
@@ -828,6 +828,7 @@ static int setup_dev_symlinks(const struct lxc_rootfs *rootfs)
 {
        char path[MAXPATHLEN];
        int ret,i;
+       struct stat s;
 
 
        for (i = 0; i < sizeof(dev_symlinks) / sizeof(dev_symlinks[0]); i++) {
@@ -835,10 +836,24 @@ static int setup_dev_symlinks(const struct lxc_rootfs *rootfs)
                ret = snprintf(path, sizeof(path), "%s/dev/%s", rootfs->mount, d->name);
                if (ret < 0 || ret >= MAXPATHLEN)
                        return -1;
+
+               /*
+                * Stat the path first.  If we don't get an error
+                * accept it as is and don't try to create it
+                */
+               if (!stat(path, &s)) {
+                       continue;
+               }
+
                ret = symlink(d->oldpath, path);
+
                if (ret && errno != EEXIST) {
-                       SYSERROR("Error creating %s", path);
-                       return -1;
+                       if ( errno == EROFS ) {
+                               WARN("Warning: Read Only file system while creating %s", path);
+                       } else {
+                               SYSERROR("Error creating %s", path);
+                               return -1;
+                       }
                }
        }
        return 0;