Linux: Work around kernel bugs in chmod on /proc/self/fd paths

Message ID 87a74v9df8.fsf@oldenburg2.str.redhat.com
State Committed
Headers

Commit Message

Florian Weimer March 5, 2020, 12:47 p.m. UTC
  * Stefan Liebler:

> On 2/18/20 5:50 PM, Matheus Castanho wrote:
> ...
>> On 2/18/20 11:50 AM, Florian Weimer wrote:
>>> Agreed, I've dropped it.
>>>
>>> New patch below.
>>>
>>> Florian
> ...
> ...
>> LGTM.
>>
>> Reviewed-by: Matheus Castanho <msc@linux.ibm.com>
>>
>> --
>> Matheus Castanho
>>
>
> Hi Florian,
>
> I've just recognized that building with -Os fails with
> /usr/bin/ld: /path/to/glibc-build/libc_pic.os.clean: in function `fchmodat':
> (.text+0xb1c36): undefined reference to `fstatat64'
> collect2: error: ld returned 1 exit status
>
> This happens at least on x86_64 and s390x.
> I've bisected and this was the first bad commit.

Thanks.  This patch should fix building with -Os.

Florian

8<------------------------------------------------------------------8<
Subject: Linux: Use __fstatat64 in fchmodat implementation

fstatat64 depends on inlining to produce the desired __fxstatat64
call, which does not happen with -Os, leading to a link failure
with an undefined reference to fstatat64.  __fxstatat64 has a macro
definition in include/sys/stat.h and thus avoids the problem.

-----
 sysdeps/unix/sysv/linux/fchmodat.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
  

Comments

Stefan Liebler March 5, 2020, 3:35 p.m. UTC | #1
On 3/5/20 1:47 PM, Florian Weimer wrote:
> * Stefan Liebler:
> 
>> On 2/18/20 5:50 PM, Matheus Castanho wrote:
>> ...
>>> On 2/18/20 11:50 AM, Florian Weimer wrote:
>>>> Agreed, I've dropped it.
>>>>
>>>> New patch below.
>>>>
>>>> Florian
>> ...
>> ...
>>> LGTM.
>>>
>>> Reviewed-by: Matheus Castanho <msc@linux.ibm.com>
>>>
>>> --
>>> Matheus Castanho
>>>
>>
>> Hi Florian,
>>
>> I've just recognized that building with -Os fails with
>> /usr/bin/ld: /path/to/glibc-build/libc_pic.os.clean: in function `fchmodat':
>> (.text+0xb1c36): undefined reference to `fstatat64'
>> collect2: error: ld returned 1 exit status
>>
>> This happens at least on x86_64 and s390x.
>> I've bisected and this was the first bad commit.
> 
> Thanks.  This patch should fix building with -Os.
> 
> Florian
> 
> 8<------------------------------------------------------------------8<
> Subject: Linux: Use __fstatat64 in fchmodat implementation
> 
> fstatat64 depends on inlining to produce the desired __fxstatat64
> call, which does not happen with -Os, leading to a link failure
> with an undefined reference to fstatat64.  __fxstatat64 has a macro
> definition in include/sys/stat.h and thus avoids the problem.
> 
> -----
>   sysdeps/unix/sysv/linux/fchmodat.c | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/sysdeps/unix/sysv/linux/fchmodat.c b/sysdeps/unix/sysv/linux/fchmodat.c
> index 17eca54051..5531f1aa6f 100644
> --- a/sysdeps/unix/sysv/linux/fchmodat.c
> +++ b/sysdeps/unix/sysv/linux/fchmodat.c
> @@ -48,7 +48,7 @@ fchmodat (int fd, const char *file, mode_t mode, int flag)
>         /* Use fstatat because fstat does not work on O_PATH descriptors
>   	 before Linux 3.6.  */
>         struct stat64 st;
> -      if (fstatat64 (pathfd, "", &st, AT_EMPTY_PATH) != 0)
> +      if (__fstatat64 (pathfd, "", &st, AT_EMPTY_PATH) != 0)
>   	{
>   	  __close_nocancel (pathfd);
>   	  return -1;
> 

I've tested this and now glibc buids in my two environments (x86_64 and 
s390x) fine.

LGTM

Thanks,
Stefan
  

Patch

diff --git a/sysdeps/unix/sysv/linux/fchmodat.c b/sysdeps/unix/sysv/linux/fchmodat.c
index 17eca54051..5531f1aa6f 100644
--- a/sysdeps/unix/sysv/linux/fchmodat.c
+++ b/sysdeps/unix/sysv/linux/fchmodat.c
@@ -48,7 +48,7 @@  fchmodat (int fd, const char *file, mode_t mode, int flag)
       /* Use fstatat because fstat does not work on O_PATH descriptors
 	 before Linux 3.6.  */
       struct stat64 st;
-      if (fstatat64 (pathfd, "", &st, AT_EMPTY_PATH) != 0)
+      if (__fstatat64 (pathfd, "", &st, AT_EMPTY_PATH) != 0)
 	{
 	  __close_nocancel (pathfd);
 	  return -1;