summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/machine/image.c9
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);