Re: [PATCH v4 1/2] man/man3/getcwd.3: say more clear that syscall can return "(unreachable)", but modern glibc wrapper cannot

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

 



Hi Askar,

On Thu, Feb 20, 2025 at 09:19:25AM +0000, Askar Safin wrote:
> I verified using expirement that modern glibc wrapper getcwd actually never returns "(unreachable)".
> Also I have read modern glibc sources for all 3 functions documented here.
> All they don't return "(unreachable)".

We have a (soft) 72-col limit on the commit message.  I should document
this, as I think it's not documented anywhere.  I also took the time to
fix some minor wording issues.

(That limit doesn't apply to the subject, which can be of arbitrary
 lenght, as long as it's reasonable.)

> Now let me describe my expirement:
> 
> 	d-user@comp:/tmp$ cat getcwd.c
> 	#include <unistd.h>
> 	#include <stdio.h>
> 	#include <sys/syscall.h>
> 
> 	int
> 	main(void)
> 	{
> 		char  buf[1000];
> 
> 		if (syscall(SYS_getcwd, buf, sizeof(buf)) == -1)
> 			perror("SYS_getcwd");
> 		else
> 			printf("SYS_getcwd: %s\n", buf);
> 
> 		if (getcwd(buf, sizeof(buf)) == NULL)
> 			perror("getcwd");
> 		else
> 			printf("getcwd: %s\n", buf);
> 
> 		return 0;
> 	}
> 	d-user@comp:/tmp$ gcc -Wall -Wextra -o getcwd getcwd.c
> 	d-user@comp:/tmp$ sudo unshare --mount bash
> 	d-root@comp:/tmp# mkdir /tmp/dir
> 	d-root@comp:/tmp# mount -t tmpfs tmpfs /tmp/dir
> 	d-root@comp:/tmp# cd /tmp/dir
> 	d-root@comp:/tmp/dir# umount -l .
> 	d-root@comp:/tmp/dir# /tmp/getcwd
> 	SYS_getcwd: (unreachable)/
> 	getcwd: No such file or directory
> 	d-root@comp:/tmp/dir# exit
> 	exit
> 
> Reviewed-by: Carlos O'Donell <carlos@xxxxxxxxxx>
> Link: <https://sourceware.org/bugzilla/show_bug.cgi?id=18203>
> Link: <https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=52a713fdd0a30e1bd79818e2e3c4ab44ddca1a94>

I moved the R-B tag to after the links, since those links are also
reviewed.

> Signed-off-by: Askar Safin <safinaskar@xxxxxxxxxxxx>
> ---
>  man/man3/getcwd.3 | 5 ++++-
>  1 file changed, 4 insertions(+), 1 deletion(-)
> 
> diff --git a/man/man3/getcwd.3 b/man/man3/getcwd.3
> index 685585a60..919ffb08f 100644
> --- a/man/man3/getcwd.3
> +++ b/man/man3/getcwd.3
> @@ -246,7 +246,10 @@ without changing its current directory into the new root).
>  Such behavior can also be caused by an unprivileged user by changing
>  the current directory into another mount namespace.
>  When dealing with pathname from untrusted sources, callers of the
> -functions described in this page
> +functions described in this page (until glibc 2.27)

I changed this from 'until' to 'before'.  The word until doesn't make it
clear if the version 2.27 has the old or the new behavior.  The word
before makes it clear that the old behavior was not present in 2.27.

As I mentioned as a reply to the cover letter, I've applied this patch,
and amended it editorially with those minor edits.  Thanks!


Cheers,
Alex

> +or the raw
> +.BR getcwd ()
> +system call
>  should consider checking whether the returned pathname starts
>  with '/' or '(' to avoid misinterpreting an unreachable path
>  as a relative pathname.
> -- 
> 2.39.5
> 

-- 
<https://www.alejandro-colomar.es/>

Attachment: signature.asc
Description: PGP signature


[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