Message ID | 20220427024545.18298-1-akihiko.odaki@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | 9pfs: local: Do not follow symlink in _nofollow | expand |
On Mittwoch, 27. April 2022 04:45:45 CEST Akihiko Odaki wrote: > Signed-off-by: Akihiko Odaki <akihiko.odaki@gmail.com> > --- > hw/9pfs/9p-local.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/hw/9pfs/9p-local.c b/hw/9pfs/9p-local.c > index d42ce6d8b82..def8afdb4d6 100644 > --- a/hw/9pfs/9p-local.c > +++ b/hw/9pfs/9p-local.c > @@ -365,7 +365,7 @@ static int fchmodat_nofollow(int dirfd, const char > *name, mode_t mode) if (fd == -1) { > /* In case the file is writable-only and isn't a directory. */ > if (errno == EACCES) { > - fd = openat_file(dirfd, name, O_WRONLY, 0); > + fd = openat_file(dirfd, name, O_WRONLY | O_NOFOLLOW, 0); O_NOFOLLOW flag is always added inside openat_file() implementation: https://github.com/qemu/qemu/blob/master/hw/9pfs/9p-util.h#L60 So this change is not necessary AFAICS. > } > if (fd == -1 && errno == EISDIR) { > errno = EACCES;
On Wed, 27 Apr 2022 10:46:31 +0200 Christian Schoenebeck <qemu_oss@crudebyte.com> wrote: > On Mittwoch, 27. April 2022 04:45:45 CEST Akihiko Odaki wrote: > > Signed-off-by: Akihiko Odaki <akihiko.odaki@gmail.com> > > --- > > hw/9pfs/9p-local.c | 2 +- > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > diff --git a/hw/9pfs/9p-local.c b/hw/9pfs/9p-local.c > > index d42ce6d8b82..def8afdb4d6 100644 > > --- a/hw/9pfs/9p-local.c > > +++ b/hw/9pfs/9p-local.c > > @@ -365,7 +365,7 @@ static int fchmodat_nofollow(int dirfd, const char > > *name, mode_t mode) if (fd == -1) { > > /* In case the file is writable-only and isn't a directory. */ > > if (errno == EACCES) { > > - fd = openat_file(dirfd, name, O_WRONLY, 0); > > + fd = openat_file(dirfd, name, O_WRONLY | O_NOFOLLOW, 0); > > O_NOFOLLOW flag is always added inside openat_file() implementation: > > https://github.com/qemu/qemu/blob/master/hw/9pfs/9p-util.h#L60 > > So this change is not necessary AFAICS. > Right, and with macOS in mind, maybe fchmodat(AT_SYMLINK_NOFOLLOW) just works unlike with linux ? > > } > > if (fd == -1 && errno == EISDIR) { > > errno = EACCES; > >
On Mittwoch, 27. April 2022 12:21:51 CEST Greg Kurz wrote: > On Wed, 27 Apr 2022 10:46:31 +0200 > > Christian Schoenebeck <qemu_oss@crudebyte.com> wrote: > > On Mittwoch, 27. April 2022 04:45:45 CEST Akihiko Odaki wrote: > > > Signed-off-by: Akihiko Odaki <akihiko.odaki@gmail.com> > > > --- > > > > > > hw/9pfs/9p-local.c | 2 +- > > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > > > diff --git a/hw/9pfs/9p-local.c b/hw/9pfs/9p-local.c > > > index d42ce6d8b82..def8afdb4d6 100644 > > > --- a/hw/9pfs/9p-local.c > > > +++ b/hw/9pfs/9p-local.c > > > @@ -365,7 +365,7 @@ static int fchmodat_nofollow(int dirfd, const char > > > *name, mode_t mode) if (fd == -1) { > > > > > > /* In case the file is writable-only and isn't a directory. */ > > > if (errno == EACCES) { > > > > > > - fd = openat_file(dirfd, name, O_WRONLY, 0); > > > + fd = openat_file(dirfd, name, O_WRONLY | O_NOFOLLOW, 0); > > > > O_NOFOLLOW flag is always added inside openat_file() implementation: > > > > https://github.com/qemu/qemu/blob/master/hw/9pfs/9p-util.h#L60 > > > > So this change is not necessary AFAICS. > > Right, and with macOS in mind, maybe fchmodat(AT_SYMLINK_NOFOLLOW) just > works unlike with linux ? Yep, fchmodat(AT_SYMLINK_NOFOLLOW) seems to work on macOS! Like you already suggested on the other thread, it would make sense to move current implementation of fchmodat_nofollow() to 9p-util-linux.h/.c and let macOS just use fchmodat(AT_SYMLINK_NOFOLLOW) instead. Best regards, Christian Schoenebeck
diff --git a/hw/9pfs/9p-local.c b/hw/9pfs/9p-local.c index d42ce6d8b82..def8afdb4d6 100644 --- a/hw/9pfs/9p-local.c +++ b/hw/9pfs/9p-local.c @@ -365,7 +365,7 @@ static int fchmodat_nofollow(int dirfd, const char *name, mode_t mode) if (fd == -1) { /* In case the file is writable-only and isn't a directory. */ if (errno == EACCES) { - fd = openat_file(dirfd, name, O_WRONLY, 0); + fd = openat_file(dirfd, name, O_WRONLY | O_NOFOLLOW, 0); } if (fd == -1 && errno == EISDIR) { errno = EACCES;
Signed-off-by: Akihiko Odaki <akihiko.odaki@gmail.com> --- hw/9pfs/9p-local.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)