Re: fchmodat(2) does support AT_SYMLINK_NOFOLLOW now, no?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





On Thu, Aug 29, 2024 at 7:44 PM Alejandro Colomar <alx@xxxxxxxxxx> wrote:
Hi Elliott,

On Tue, Aug 27, 2024 at 03:07:54PM GMT, enh wrote:
> oh, i can definitely make a start...
>
> (i was going to at least send you the easiest patch, but then i
> realized even there there's a bit of a bikeshed opportunity, so i'll
> just give you all the pieces and let you decide what to do with them!)

Thanks!

>
> so i think we have these things to say:
>
> 1. AT_SYMLINK_NOFOLLOW _is_ supported for fchmodat(2).
> 2. but only since Linux 6.6 (except see 4).
> 3. there's no mention of lchmod().
> 4. that function is very old, but it doesn't actually work on glibc
> until 2.32 (https://sourceware.org/bugzilla/show_bug.cgi?id=14578#c16)
> where it uses the O_PATH trick that musl and bionic also use (and so
> doesn't need Linux 6.6).
>
> heh, actually trying to write the bits down is probably easiest done
> as a diff anyway...
>
> diff --git a/man/man2/chmod.2 b/man/man2/chmod.2
> index ae53fe3c9..c6c54eeca 100644
> --- a/man/man2/chmod.2
> +++ b/man/man2/chmod.2
> @@ -11,7 +11,7 @@
>  .\"
>  .TH chmod 2 (date) "Linux man-pages (unreleased)"
>  .SH NAME
> -chmod, fchmod, fchmodat \- change permissions of a file
> +chmod, fchmod, lchown, fchmodat \- change permissions of a file
>  .SH LIBRARY
>  Standard C library
>  .RI ( libc ,\~ \-lc )
> @@ -21,6 +21,7 @@ Standard C library
>  .P
>  .BI "int chmod(const char *" pathname ", mode_t " mode );
>  .BI "int fchmod(int " fd ", mode_t " mode );
> +.BI "int lchmod(const char *" pathname ", mode_t " mode );

Does lchmod() need any feature test macros?

done.
 
>  .P
>  .BR "#include <fcntl.h>" "           /* Definition of AT_* constants */"
>  .B #include <sys/stat.h>
> @@ -60,9 +61,10 @@ Feature Test Macro Requirements for glibc (see
>  .fi
>  .SH DESCRIPTION
>  The
> -.BR chmod ()
> -and
> +.BR chmod (),
>  .BR fchmod ()

We use Oxford comma.

done.
 
> +and
> +.BR lchmod ()
>  system calls change a file's mode bits.
>  (The file mode consists of the file permission bits plus the set-user-ID,
>  set-group-ID, and sticky bits.)
> @@ -76,6 +78,11 @@ which is dereferenced if it is a symbolic link.
>  .BR fchmod ()
>  changes the mode of the file referred to by the open file descriptor
>  .IR fd .
> +.IP \[bu]
> +.BR lchmod ()
> +is like
> +.BR chmod (),
> +but does not dereference symbolic links.
>  .P
>  The new file mode is specified in
>  .IR mode ,
> @@ -203,8 +210,9 @@ can either be 0, or include the following flag:
>  If
>  .I pathname
>  is a symbolic link, do not dereference it:
> -instead operate on the link itself.
> -This flag is not currently implemented.
> +instead operate on the link itself,
> +like
> +.BR lchmod ().
>  .P
>  See
>  .BR openat (2)
> @@ -285,6 +293,7 @@ is a file descriptor referring to a file other

Would you mind checking this?:

        $ head -n11 <CONTRIBUTING.d/git
        Name
               Git - instructions for configuring git(1)

        Description
           git-diff(1), gitattributes(5)
               To produce useful hunk contexts in manual pages, we need to hack
               git(1)'s idea of a function name, and also to tell git what is a
               manual page.

                   $ git config --global diff.man.xfuncname '^\.S[SHsh] .*$';
                   $ echo '*.[0-9]* diff=man' >>~/.config/git/attributes;

It helps reviewing diffs for manual pages.  :)

~/man-pages$ echo '*.[0-9]* diff=man' >>~/.git/attributes;
-bash: /usr/local/google/home/enh/.git/attributes: No such file or directory

i assume this is meant to be

~/man-pages$ echo '*.[0-9]* diff=man' >>~/.gitattributes;

instead?
 
> than a directory.
>  specified
>  .BR AT_SYMLINK_NOFOLLOW ,
>  which is not supported.
> +(See C library/kernel differences.)
>  .TP
>  .B EPERM
>  The effective UID does not match the owner of the file,
> @@ -310,12 +319,22 @@ This interface differs from the underlying Linux
> system call, which does
>  have a
>  .I flags
>  argument.
> +.P
> +Linux 6.6 added the
> +.BR fchmodat2 ()
> +system call with the POSIX flags argument.
>  .SS glibc notes
>  On older kernels where
> -.BR fchmodat ()
> +.BR fchmodat2 ()
>  is unavailable, the glibc wrapper function falls back to the use of
> -.BR chmod ().
> -When
> +.BR fchmodat ()
> +when no flags are supplied,
> +or to
> +.BR chmod ()
> +otherwise.
> +In the
> +.BR chmod ()
> +fallback, if
>  .I pathname
>  is a relative pathname,
>  glibc constructs a pathname based on the symbolic link in
>
> something along those lines?

Sounds good.  I'd like to also add entries in HISTORY for lchmod() and
fchmodat2().  And STANDARDS should also be updated.

done.
 
Have a lovely night!
Alex

--
<https://www.alejandro-colomar.es/>
diff --git a/man/man2/chmod.2 b/man/man2/chmod.2
index ae53fe3c9..3085840a2 100644
--- a/man/man2/chmod.2
+++ b/man/man2/chmod.2
@@ -11,7 +11,7 @@
 .\"
 .TH chmod 2 (date) "Linux man-pages (unreleased)"
 .SH NAME
-chmod, fchmod, fchmodat \- change permissions of a file
+chmod, fchmod, lchown, fchmodat \- change permissions of a file
 .SH LIBRARY
 Standard C library
 .RI ( libc ,\~ \-lc )
@@ -21,6 +21,7 @@ Standard C library
 .P
 .BI "int chmod(const char *" pathname ", mode_t " mode );
 .BI "int fchmod(int " fd ", mode_t " mode );
+.BI "int lchmod(const char *" pathname ", mode_t " mode );
 .P
 .BR "#include <fcntl.h>" "           /* Definition of AT_* constants */"
 .B #include <sys/stat.h>
@@ -51,6 +52,12 @@ Feature Test Macro Requirements for glibc (see
 .\"        || (_XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED)
 .fi
 .P
+.BR lchmod ():
+.nf
+    Since glibc 2.5:
+        _DEFAULT_SOURCE
+.fi
+.P
 .BR fchmodat ():
 .nf
     Since glibc 2.10:
@@ -60,9 +67,10 @@ Feature Test Macro Requirements for glibc (see
 .fi
 .SH DESCRIPTION
 The
-.BR chmod ()
+.BR chmod (),
+.BR fchmod (),
 and
-.BR fchmod ()
+.BR lchmod ()
 system calls change a file's mode bits.
 (The file mode consists of the file permission bits plus the set-user-ID,
 set-group-ID, and sticky bits.)
@@ -76,6 +84,11 @@ which is dereferenced if it is a symbolic link.
 .BR fchmod ()
 changes the mode of the file referred to by the open file descriptor
 .IR fd .
+.IP \[bu]
+.BR lchmod ()
+is like
+.BR chmod (),
+but does not dereference symbolic links.
 .P
 The new file mode is specified in
 .IR mode ,
@@ -203,8 +216,9 @@ can either be 0, or include the following flag:
 If
 .I pathname
 is a symbolic link, do not dereference it:
-instead operate on the link itself.
-This flag is not currently implemented.
+instead operate on the link itself,
+like
+.BR lchmod ().
 .P
 See
 .BR openat (2)
@@ -285,6 +299,7 @@ is a file descriptor referring to a file other than a directory.
 specified
 .BR AT_SYMLINK_NOFOLLOW ,
 which is not supported.
+(See C library/kernel differences.)
 .TP
 .B EPERM
 The effective UID does not match the owner of the file,
@@ -310,12 +325,22 @@ This interface differs from the underlying Linux system call, which does
 have a
 .I flags
 argument.
+.P
+Linux 6.6 added the
+.BR fchmodat2 ()
+system call with the POSIX flags argument.
 .SS glibc notes
 On older kernels where
-.BR fchmodat ()
+.BR fchmodat2 ()
 is unavailable, the glibc wrapper function falls back to the use of
-.BR chmod ().
-When
+.BR fchmodat ()
+when no flags are supplied,
+or to
+.BR chmod ()
+otherwise.
+In the
+.BR chmod ()
+fallback, if
 .I pathname
 is a relative pathname,
 glibc constructs a pathname based on the symbolic link in
@@ -324,7 +349,16 @@ that corresponds to the
 .I dirfd
 argument.
 .SH STANDARDS
+.TP
+.BR chmod ()
+.TQ
+.BR fchmod ()
+.TQ
+.BR fchmodat ()
 POSIX.1-2008.
+.TP
+.BR lchmod ()
+Linux.
 .SH HISTORY
 .TP
 .BR chmod ()
@@ -336,6 +370,9 @@ POSIX.1-2008.
 POSIX.1-2008.
 Linux 2.6.16,
 glibc 2.4.
+.TP
+.BR lchmod ()
+Linux 2.6.16, glibc 2.5.
 .SH SEE ALSO
 .BR chmod (1),
 .BR chown (2),

[Index of Archives]     [Kernel Documentation]     [Netdev]     [Linux Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux