Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date: Wed, 9 Sep 2020 02:07:47 -0400
From: Rich Felker <dalias@...c.org>
To: musl@...ts.openwall.com
Subject: Re: riscv32 v2

On Mon, Sep 07, 2020 at 09:54:56PM -0400, Rich Felker wrote:
> On Fri, Sep 04, 2020 at 01:48:19AM -0400, Stefan O'Rear wrote:
> > From cd57a6b47783c5302f931e543b608cb3ba58387d Mon Sep 17 00:00:00 2001
> > From: Stefan O'Rear <sorear@...tmail.com>
> > Date: Thu, 3 Sep 2020 03:59:59 -0400
> > Subject: [PATCH 06/14] Only call fstatat if defined
> > 
> > riscv32 and future architectures lack it.
> > ---
> >  src/stat/fchmodat.c   | 23 ++++++++++++++++++++---
> >  src/stat/fstatat.c    |  6 ++++++
> >  src/stdio/tempnam.c   |  9 +++++++--
> >  src/stdio/tmpnam.c    |  9 +++++++--
> >  src/time/__map_file.c | 19 +++++++++++++++----
> >  5 files changed, 55 insertions(+), 11 deletions(-)
> > 
> > diff --git a/src/stat/fchmodat.c b/src/stat/fchmodat.c
> > index 4ee00b0a..857e84e5 100644
> > --- a/src/stat/fchmodat.c
> > +++ b/src/stat/fchmodat.c
> > @@ -1,8 +1,10 @@
> >  #include <sys/stat.h>
> >  #include <fcntl.h>
> >  #include <errno.h>
> > +#include <stdint.h>
> >  #include "syscall.h"
> >  #include "kstat.h"
> > +#include "statx.h"
> >  
> >  int fchmodat(int fd, const char *path, mode_t mode, int flag)
> >  {
> > @@ -11,13 +13,22 @@ int fchmodat(int fd, const char *path, mode_t mode, int flag)
> >  	if (flag != AT_SYMLINK_NOFOLLOW)
> >  		return __syscall_ret(-EINVAL);
> >  
> > -	struct kstat st;
> >  	int ret, fd2;
> >  	char proc[15+3*sizeof(int)];
> >  
> > +#ifdef SYS_fstatat
> > +	struct kstat st;
> >  	if ((ret = __syscall(SYS_fstatat, fd, path, &st, flag)))
> >  		return __syscall_ret(ret);
> > -	if (S_ISLNK(st.st_mode))
> > +	mode_t get_mode = st.st_mode;
> > +#else
> > +	struct statx st;
> > +	if ((ret = __syscall(SYS_statx, fd, path, flag, STATX_TYPE, &st)))
> > +		return __syscall_ret(ret);
> > +	mode_t get_mode = st.stx_mode;
> > +#endif
> > +
> > +	if (S_ISLNK(get_mode))
> >  		return __syscall_ret(-EOPNOTSUPP);
> >  
> >  	if ((fd2 = __syscall(SYS_openat, fd, path, O_RDONLY|O_PATH|O_NOFOLLOW|O_NOCTTY|O_CLOEXEC)) < 0) {
> > @@ -27,9 +38,15 @@ int fchmodat(int fd, const char *path, mode_t mode, int flag)
> >  	}
> >  
> >  	__procfdname(proc, fd2);
> > +#ifdef SYS_fstatat
> >  	ret = __syscall(SYS_fstatat, AT_FDCWD, proc, &st, 0);
> > +	get_mode = st.st_mode;
> > +#else
> > +	ret = __syscall(SYS_statx, AT_FDCWD, proc, 0, STATX_TYPE, &st);
> > +	get_mode = st.stx_mode;
> > +#endif
> >  	if (!ret) {
> > -		if (S_ISLNK(st.st_mode)) ret = -EOPNOTSUPP;
> > +		if (S_ISLNK(get_mode)) ret = -EOPNOTSUPP;
> >  		else ret = __syscall(SYS_fchmodat, AT_FDCWD, proc, mode);
> >  	}
> >  
> 
> I was just looking at this file for another reason, and wondered why
> we're not just calling the fstatat function here. There's no namespace
> reason not to. According to the description of commit
> c9ebff4736128186121424364c1c62224b02aee3, use of struct kstat here was
> done "as a low-risk fix" right before release of 1.2.0, and I probably
> had in mind changing it to fstatat later and just never got around to
> it.
> 
> The same could be done for tempnam (POSIX) but not tmpnam (C) or
> __map_file (used in plain C interfaces like setlocale and time
> functions) without adding a namespace-safe alias for fstatat.
> 
> Of course this does pull in more code that's not needed, so maybe your
> version of the change is best, and maybe this is what I had in mind
> when I hesitated to make the bigger change back in February. I don't
> like that knowledge of different syscall alternatives leaks all over
> the place, but I also don't like increasing code size unnecessarily on
> all archs...

Not something that requires action, but possible streamlining I just
discovered: in places where lstat is being used to probe file
existence (tmpnam, etc.), SYS_readlink also works, yields smaller
code, and is #ifdef-free. You get the same ENOENT for nonexistence,
and success or EINVAL indicating existence as a symlink or
non-symlink, respectively.

Rich

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.