libsanitizer merge from upstream r221802

David Abdurachmanov david.abdurachmanov@gmail.com
Tue Dec 30 22:48:00 GMT 2014


On Dec 29, 2014, at 7:46 PM, Jakub Jelinek wrote:

> On Mon, Dec 29, 2014 at 07:36:42PM +0100, David Abdurachmanov wrote:
>> I believe this is breaking bootstrap on aarch64-linux-gnu with kernels <=3.15,
>> 3.16 and above are fine.
>> 
>> __kernel_old_{gid,uid}_t were changed in 3.16 from unsigned int to unsigned
>> short. <=3.15 kernel will trigger static asserts in libsanitizer while
>> compiling GCC.
>> 
>> I created PR: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64435 (includes all
>> the details).
>> 
>> Attaching a patch with resolved issues on F19 + 3.12 kernel (also bootstrapped
>> in QEMU with F21 rootfs + 3.17 kernel) on aarch64-linux-gnu.
> 
> That looks very much wrong, ABI can't depend on what kernel headers you are
> compiling against.
> So, better would be just to ifdef out the check and always use 16-bit
> __kernel_old_*_t on aarch64.  Are the
> getresuid16/getresgid16/getgroups16/setgroups16 syscalls wired at all on
> aarch64?  If not, then supposedly the sanitizer_common_syscalls.inc stuff
> for these syscalls should be ifdefed out on aarch64 (or any other arch that
> doesn't have those syscalls).

I am not an expert here.

# uname -r -m
3.17.0-301.fc21.aarch64 aarch64

# cat /proc/kallsyms | sed -n 's/.* sys_//p' | grep 16
chown16
fchown16
getegid16
geteuid16
getgid16
getgroups16
getresgid16
getresuid16
getuid16
lchown16
setfsgid16
setfsuid16
setgid16
setgroups16
setregid16
setresgid16
setresuid16
setreuid16
setuid16

The following are syscall implementations available in my current kernel with
"16" suffix.

From include/uapi/asm-generic/unistd.h

435 #define __NR_getresuid 148
436 __SYSCALL(__NR_getresuid, sys_getresuid)

From arch/arm64/include/asm/unistd32.h

354 #define __NR_getresuid 165
355 __SYSCALL(__NR_getresuid, sys_getresuid16)

Isn't this needed for 32-bit (compat) application support on 64-bit system?

https://lkml.org/lkml/2012/7/6/570
https://lkml.org/lkml/2012/7/6/545

If we have 64-bit kernel and 64-bit application is executed sys_getresuid is
used for getresuid syscall, otherwise if 32-bit application is executed --
sys_getresuid16 is used. Thus 64-bit application will never call
sys_getresuid16 implemenation. Then
getresuid16/getresgid16/getgroups16/setgroups16/etc only needs to in 32-bit
binary of libsanitizer. Same should apply for x86_64/i*86.

Is that correct?

david
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 801 bytes
Desc: Message signed with OpenPGP using GPGMail
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20141230/56cf5e82/attachment.sig>


More information about the Gcc-patches mailing list