From: Lennart Poettering Date: Fri, 26 Dec 2014 15:44:15 +0000 (+0100) Subject: machined: be more thorough when checking whether an image is writable or not X-Git-Tag: v219~811 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=86e339c8846cdf614a41653384c0b4e84b233696 machined: be more thorough when checking whether an image is writable or not --- diff --git a/src/machine/image.c b/src/machine/image.c index 9f88b0551..f72a5c396 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);