Hi, patch applied, Waldemar
Yann Sionneau wrote, > Summary: > Recent arch do not support Legacy. > Thus they don't define ARCH_HAS_DEPRECATED_SYSCALLS > > But this led to per-arch headers not being installed and common-generic ones > taking precedence. > > So it was impossible to declare arch-specific statfs.h for instance, to force > 64-bit mode only. > > This was leading to the following situation to happen: > 1/ an application compiles (say without -D_FILE_OFFSET_BITS set) > it therefore uses struct statfs from > libc/sysdeps/linux/common-generic/bits/statfs.h > where f_type and f_bsize fields are U32: > https://elixir.bootlin.com/uclibc-ng/latest/source/libc/sysdeps/linux/common-generic/bits/statfs.h#L18 > 2/ application calls "statfs" > 3/ uClibc issues "statfs64" syscall (because __NR_statfs64 is defined and > __NR_statfs is undefined): > https://elixir.bootlin.com/uclibc-ng/latest/source/libc/sysdeps/linux/common/statfs.c#L14 > 4/ if Linux kernel port is not defining CONFIG_COMPAT, it calls > do_statfs_native > https://elixir.bootlin.com/linux/latest/source/fs/statfs.c#L195 > 5/ it does copy_to_user of the size of struct statfs defined in the kernel > source tree: > https://elixir.bootlin.com/linux/latest/source/fs/statfs.c#L161 > 6/ Generic struct statfs in the kernel is defined like this: > https://elixir.bootlin.com/linux/latest/source/include/uapi/asm-generic/statfs.h#L23 > f_type and f_bsize fields are long (64 bits) for 64-bit archs. > 7/ memory corruption occurs because of this mismatch > > Solution: > Allow to not define __ARCH_HAS_DEPRECATED_SYSCALLS__ *and* declare its own > arch-specific statfs.h header, matching the kernel one. > (for instance with f_type and f_bsize defined as long) > > Does this change break other archs? > This change allows headers in libc/sysdeps/linux/<ARCH>/bits/ to override > ones in libc/sysdeps/linux/common-generic/bits/ > The only arch which does not define __ARCH_HAS_DEPRECATED_SYSCALLS__ *and* > has a header in libc/sysdeps/linux/<ARCH>/bits/ which can conflict with one > in libc/sysdeps/linux/common-generic/bits/ > is c6x. > The file that can override is ../libc/sysdeps/linux/c6x/bits/kernel_stat.h > This, btw, means that, today, this file is there and is not used (during > compilation, GNU Make overrides the rule): > Makefile.in:152: warning: overriding recipe for target > `include/bits/kernel_stat.h' > Makefile.in:148: warning: ignoring old recipe for target > `include/bits/kernel_stat.h' > I was not able to compile uClibc with the only binary toolchain I found for > c6x arch (gcc-4.5.1 from code sourcery: > https://sourcery.mentor.com/GNUToolchain/release1882) > However, I can tell that c6x's kernel_stat.h only defines two structs: > kernel_stat and kernel_stat64: > https://elixir.bootlin.com/uclibc-ng/latest/source/libc/sysdeps/linux/c6x/bits/kernel_stat.h > And I can also tell that those structs are only used when using xstat > conversion functions (__xstat32_conv / xstat_conv) which are only used and > present in the __ARCH_HAS_DEPRECATED_SYSCALLS__ == y case. > However, c6x does not define __ARCH_HAS_DEPRECATED_SYSCALLS__ > So I think I can say that this change does not affect c6x nor other archs. > > --- > Makefile.in | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/Makefile.in b/Makefile.in > index 1754040..16ee9ee 100644 > --- a/Makefile.in > +++ b/Makefile.in > @@ -144,14 +144,14 @@ $(top_builddir)include/dl-osinfo.h > $(top_builddir)include/not-cancel.h: > $(ALL_HEADERS_BITS_COMMON): > $(do_ln) $(call rel_srcdir)libc/sysdeps/linux/common/bits/$(@F) $@ > > -$(ALL_HEADERS_BITS_ARCH): > - $(do_ln) $(call rel_srcdir)libc/sysdeps/linux/$(TARGET_ARCH)/bits/$(@F) > $@ > - > ifneq ($(ARCH_HAS_DEPRECATED_SYSCALLS),y) > $(ALL_HEADERS_BITS_COMMON_NO_LEGACY): > $(do_ln) $(call rel_srcdir)libc/sysdeps/linux/common-generic/bits/$(@F) > $@ > endif > > +$(ALL_HEADERS_BITS_ARCH): > + $(do_ln) $(call rel_srcdir)libc/sysdeps/linux/$(TARGET_ARCH)/bits/$(@F) > $@ > + > ifneq ($(TARGET_SUBARCH),) > $(ALL_HEADERS_BITS_SUBARCH): > $(do_ln) $(call > rel_srcdir)libc/sysdeps/linux/$(TARGET_ARCH)/bits/$(TARGET_SUBARCH)/$(@F) $@ > -- > 1.8.3.1 > > _______________________________________________ > devel mailing list > devel@uclibc-ng.org > https://mailman.uclibc-ng.org/cgi-bin/mailman/listinfo/devel _______________________________________________ devel mailing list devel@uclibc-ng.org https://mailman.uclibc-ng.org/cgi-bin/mailman/listinfo/devel