chiark / gitweb /
machined: be more thorough when checking whether an image is writable or not
authorLennart Poettering <lennart@poettering.net>
Fri, 26 Dec 2014 15:44:15 +0000 (16:44 +0100)
committerLennart Poettering <lennart@poettering.net>
Fri, 26 Dec 2014 18:21:58 +0000 (19:21 +0100)
src/machine/image.c

index 9f88b05..f72a5c3 100644 (file)
@@ -86,6 +86,7 @@ static int image_new(
 
 static int image_make(int dfd, const char *name, const char *path, Image **ret) {
         struct stat st;
+        bool writable;
         int r;
 
         assert(dfd >= 0);
@@ -98,6 +99,8 @@ static int image_make(int dfd, const char *name, const char *path, Image **ret)
         if (fstatat(dfd, name, &st, 0) < 0)
                 return -errno;
 
+        writable = faccessat(dfd, name, W_OK, AT_EACCESS) >= 0;
+
         if (S_ISDIR(st.st_mode)) {
 
                 if (!ret)
@@ -127,7 +130,7 @@ static int image_make(int dfd, const char *name, const char *path, Image **ret)
                                 r = image_new(IMAGE_SUBVOLUME,
                                               name,
                                               path,
-                                              info.read_only,
+                                              info.read_only || !writable,
                                               info.otime,
                                               0,
                                               ret);
@@ -143,7 +146,7 @@ static int image_make(int dfd, const char *name, const char *path, Image **ret)
                 r = image_new(IMAGE_DIRECTORY,
                               name,
                               path,
-                              false,
+                              !writable,
                               0,
                               0,
                               ret);
@@ -168,7 +171,7 @@ static int image_make(int dfd, const char *name, const char *path, Image **ret)
                 r = image_new(IMAGE_GPT,
                               truncated,
                               path,
-                              !(st.st_mode & 0222),
+                              !(st.st_mode & 0222) || !writable,
                               crtime,
                               timespec_load(&st.st_mtim),
                               ret);