nspawn: fix uid patching logic (#3599)
authorLennart Poettering <lennart@poettering.net>
Sat, 25 Jun 2016 04:04:43 +0000 (06:04 +0200)
committerEvgeny Vereshchagin <evvers@ya.ru>
Sat, 25 Jun 2016 04:04:43 +0000 (07:04 +0300)
An incorrectly set if/else chain caused aus to apply the access mode of a
symlink to the directory it is located in. Yuck.

Fixes: #3547

src/nspawn/nspawn-patch-uid.c

index cc79597..ded5866 100644 (file)
@@ -263,9 +263,12 @@ static int patch_fd(int fd, const char *name, const struct stat *st, uid_t shift
                         return -errno;
 
                 /* The Linux kernel alters the mode in some cases of chown(). Let's undo this. */
-                if (name && !S_ISLNK(st->st_mode))
-                        r = fchmodat(fd, name, st->st_mode, 0);
-                else
+                if (name) {
+                        if (!S_ISLNK(st->st_mode))
+                                r = fchmodat(fd, name, st->st_mode, 0);
+                        else /* AT_SYMLINK_NOFOLLOW is not available for fchmodat() */
+                                r = 0;
+                } else
                         r = fchmod(fd, st->st_mode);
                 if (r < 0)
                         return -errno;