diff mbox series

[1/1] Use types.h and not time_types.h in sockios.h

Message ID 20210123165652.10884-1-geoffrey.legourrierec@gmail.com (mailing list archive)
State New
Headers show
Series [1/1] Use types.h and not time_types.h in sockios.h | expand

Commit Message

Geoffrey Le Gourriérec Jan. 23, 2021, 4:56 p.m. UTC
This fixes builds for sh arch when libc is not using relevant
time data structures definitions for 32-bit machines. A previous
commit [1] provided a fix, that we seemed to slip through here.

As of the time of this writing, the bug was found with v5.10.7,
with uclibc 1.0.37 only (currently the only libc supporting sh
architecture). uclibc, unlike glibc or muslibc, does not seem to
have made the complete move to post-year-2038 world for 32-bit.
The issue can be reproduced as follows:

$ git clone git://git.busybox.net/buildroot
$ cd buildroot/
$ git checkout 742f37d
$ rm -rf board/qemu/sh4eb-r2d/patches/linux-headers/
$ sed -e '/BR2_GLOBAL_PATCH_DIR/d' -i configs/qemu_sh4eb_r2d_defconfig
$ make qemu_sh4eb_r2d_defconfig
$ make
$ ./output/images/start-qemu.sh

I tried to understand why the initial commit [1] did not prevent
this issue (see notes below), but failed to do so. If anybody can
shed some light on this, I'll gladly take it.

[1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=fc94cf2092c7c1267fa2deb8388d624f50eba808

Signed-off-by: Geoffrey Le Gourriérec <geoffrey.legourrierec@gmail.com>
Cc: Arnd Bergmann <arnd@arndb.de>

---
For the record, here's the build-time error:

/usr/bin/make -j2 -C /builds/clumsyape/buildroot/output/build/uclibc-1.0.37 ARCH="sh" CROSS_COMPILE="/builds/clumsyape/buildroot/output/host/bin/sh4-buildroot-linux-uclibc-" UCLIBC_EXTRA_CFLAGS="" HOSTCC="/usr/bin/gcc"
make[1]: Entering directory '/builds/clumsyape/buildroot/output/build/uclibc-1.0.37'
  GEN libpthread/nptl/sysdeps/unix/sysv/linux/lowlevelcond.h
  GEN libpthread/nptl/sysdeps/unix/sysv/linux/lowlevelcond.h
  GEN libpthread/nptl/sysdeps/unix/sysv/linux/lowlevelrobustlock.h
  GEN libpthread/nptl/sysdeps/unix/sysv/linux/lowlevelrobustlock.h
In file included from /builds/clumsyape/buildroot/output/build/linux-headers-5.10.7/usr/include/asm/sockios.h:5,
                 from /builds/clumsyape/buildroot/output/build/linux-headers-5.10.7/usr/include/asm-generic/socket.h:6,
                 from /builds/clumsyape/buildroot/output/build/linux-headers-5.10.7/usr/include/asm/socket.h:1,
                 from ./include/bits/socket.h:360,
                 from ./include/sys/socket.h:39,
                 from ./include/netinet/in.h:24,
                 from ./include/resolv.h:57,
                 from ./libpthread/nptl/descr.h:36,
                 from ./libpthread/nptl/pthreadP.h:25,
                 from <stdin>:2:
/builds/clumsyape/buildroot/output/build/linux-headers-5.10.7/usr/include/linux/time_types.h:8:2: error: unknown type name '__kernel_time64_t'
    8 |  __kernel_time64_t       tv_sec;                 /* seconds */
      |  ^~~~~~~~~~~~~~~~~
/builds/clumsyape/buildroot/output/build/linux-headers-5.10.7/usr/include/linux/time_types.h:32:2: error: unknown type name '__kernel_old_time_t'
   32 |  __kernel_old_time_t tv_sec;  /* seconds */
      |  ^~~~~~~~~~~~~~~~~~~
libpthread/nptl/sysdeps/unix/sysv/linux/Makefile.commonarch:135: recipe for target 'libpthread/nptl/sysdeps/unix/sysv/linux/lowlevelrobustlock.h' failed
make[1]: *** [libpthread/nptl/sysdeps/unix/sysv/linux/lowlevelrobustlock.h] Error 1
make[1]: Leaving directory '/builds/clumsyape/buildroot/output/build/uclibc-1.0.37'

I did a quick header dependency analysis starting from __kernel_time64_t
(one of the offending types), but could "follow up" to linux/time_types.h
as expected; so I fail to understand how this could break. What's even
more confusing is linux/time_types.h includes linux/types.h itself.
---
 arch/sh/include/uapi/asm/sockios.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Arnd Bergmann Jan. 24, 2021, 10:55 a.m. UTC | #1
On Sat, Jan 23, 2021 at 5:56 PM Geoffrey Le Gourriérec
<geoffrey.legourrierec@gmail.com> wrote:
>
> I did a quick header dependency analysis starting from __kernel_time64_t
> (one of the offending types), but could "follow up" to linux/time_types.h
> as expected; so I fail to understand how this could break. What's even
> more confusing is linux/time_types.h includes linux/types.h itself.

Could you try producing a preprocessed version of the source file using 'gcc -E'
instead of 'gcc -c', using the same arguments as in the failing command?

The output of that should help pinpoint what is going wrong.

I'm fairly sure the patch you sent gets you back to the original problem:
Since it avoids including linux/time_types.h, the compiler no longer
sees the line that fails to build, but at the same time you can not
actually use the SIOCGSTAMP_OLD and SIOCGSTAMPNS_OLD
constants any more, as the structures will be undefined.

      Arnd
Geoffrey Le Gourriérec Jan. 24, 2021, 4:38 p.m. UTC | #2
> On Sat, Jan 23, 2021 at 5:56 PM Geoffrey Le Gourriérec
> <geoffrey.legourrierec@gmail.com> wrote:
> >
> > I did a quick header dependency analysis starting from __kernel_time64_t
> > (one of the offending types), but could "follow up" to linux/time_types.h
> > as expected; so I fail to understand how this could break. What's even
> > more confusing is linux/time_types.h includes linux/types.h itself.
>
> Could you try producing a preprocessed version of the source file using 'gcc -E'
> instead of 'gcc -c', using the same arguments as in the failing command?
>
> The output of that should help pinpoint what is going wrong.

Hi Arnd,

Here is the preprocessed
uclibc-1.0.37/libpthread/nptl/sysdeps/unix/sysv/linux/lowlevelrobustlock.h
:
https://pastebin.com/ypWCZK83

Considering the following dependency chain:
include/uapi/asm-generic/posix_types.h (__kernel_time64_t and
__kernel_old_time_t defined here)
  -- included by: include/uapi/asm/posix_types_32.h (within #ifndef
__ASM_SH_POSIX_TYPES_32_H)

...It looks like we do not enter the __ASM_SH_POSIX_TYPES_32_H include guard.
Searching for that in the uclibc source code, I fall upon this header:
https://repo.or.cz/uclibc-ng.git/blob/ab1dd83bec59c9e65c31efd6e887182948f627be:/libc/sysdeps/linux/sh/bits/kernel_types.h
...with a preliminary comment that seems quite explicit (I am not
familiar at all with the
subject, sorry if I'm perhaps stating the obvious):

/* Note that we use the exact same include guard #define names
* as asm/posix_types.h. This will avoid gratuitous conflicts
* with the posix_types.h kernel header, and will ensure that
* our private content, and not the kernel header, will win.
* -Erik
*/
#if !defined __ASM_SH_POSIX_TYPES_H && !defined __ASM_SH_POSIX_TYPES_32_H
#define __ASM_SH_POSIX_TYPES_H
#define __ASM_SH_POSIX_TYPES_32_H

> I'm fairly sure the patch you sent gets you back to the original problem:
> Since it avoids including linux/time_types.h, the compiler no longer
> sees the line that fails to build, but at the same time you can not
> actually use the SIOCGSTAMP_OLD and SIOCGSTAMPNS_OLD
> constants any more, as the structures will be undefined.

That is correct, my patch just fixes the symptom. I plan to come back
to the Buildroot
folks with a proper patch once we've figured something out.

Thanks for your review,
Arnd Bergmann Jan. 24, 2021, 6:57 p.m. UTC | #3
On Sun, Jan 24, 2021 at 5:38 PM Geoffrey Le Gourriérec
<geoffrey.legourrierec@gmail.com> wrote:
> > On Sat, Jan 23, 2021 at 5:56 PM Geoffrey Le Gourriérec <geoffrey.legourrierec@gmail.com> wrote:

> ...It looks like we do not enter the __ASM_SH_POSIX_TYPES_32_H include guard.
> Searching for that in the uclibc source code, I fall upon this header:
> https://repo.or.cz/uclibc-ng.git/blob/ab1dd83bec59c9e65c31efd6e887182948f627be:/libc/sysdeps/linux/sh/bits/kernel_types.h
> ...with a preliminary comment that seems quite explicit (I am not
> familiar at all with the
> subject, sorry if I'm perhaps stating the obvious):
>
> /* Note that we use the exact same include guard #define names
> * as asm/posix_types.h. This will avoid gratuitous conflicts
> * with the posix_types.h kernel header, and will ensure that
> * our private content, and not the kernel header, will win.
> * -Erik
> */
> #if !defined __ASM_SH_POSIX_TYPES_H && !defined __ASM_SH_POSIX_TYPES_32_H
> #define __ASM_SH_POSIX_TYPES_H
> #define __ASM_SH_POSIX_TYPES_32_H

Ok, so I guess this means that it's just a bug in uclibc. Most likely this code
dates back a very long time, back when the asm/posix_types.h in the
kernel was in fact defining the same types as user space. Since it now
only contains the __kernel_* prefixed types, you can probably just
remove this hack. If that doesn't work, then uclibc needs to be changed to
define the same types as the kernel header.

        Arnd
diff mbox series

Patch

diff --git a/arch/sh/include/uapi/asm/sockios.h b/arch/sh/include/uapi/asm/sockios.h
index ef01ced9e169..d97d14685305 100644
--- a/arch/sh/include/uapi/asm/sockios.h
+++ b/arch/sh/include/uapi/asm/sockios.h
@@ -2,7 +2,7 @@ 
 #ifndef __ASM_SH_SOCKIOS_H
 #define __ASM_SH_SOCKIOS_H
 
-#include <linux/time_types.h>
+#include <linux/types.h>
 
 /* Socket-level I/O control calls. */
 #define FIOGETOWN	_IOR('f', 123, int)