diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/machine/image.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/src/machine/image.c b/src/machine/image.c index 9f88b0551f..f72a5c3960 100644 --- a/src/machine/image.c +++ b/src/machine/image.c @@ -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); |