lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Thu, 23 Sep 2021 11:01:09 +0100 From: Richard Palethorpe <rpalethorpe@...e.de> To: Arnd Bergmann <arnd@...db.de> Cc: Linux FS-devel Mailing List <linux-fsdevel@...r.kernel.org>, Linux API <linux-api@...r.kernel.org>, linux-aio <linux-aio@...ck.org>, y2038 Mailman List <y2038@...ts.linaro.org>, Andy Lutomirski <luto@...nel.org>, Thomas Gleixner <tglx@...utronix.de>, Ingo Molnar <mingo@...hat.com>, Borislav Petkov <bp@...en8.de>, the arch/x86 maintainers <x86@...nel.org>, "H. Peter Anvin" <hpa@...or.com>, Deepa Dinamani <deepa.kernel@...il.com>, Linux Kernel Mailing List <linux-kernel@...r.kernel.org>, LTP List <ltp@...ts.linux.it> Subject: Re: ia32 signed long treated as x64 unsigned int by __ia32_sys* Hello Arnd, Arnd Bergmann <arnd@...db.de> writes: > On Wed, Sep 22, 2021 at 10:46 AM Richard Palethorpe <rpalethorpe@...e.de> wrote: >> Richard Palethorpe <rpalethorpe@...e.de> writes: > >> > >> > Then the output is: >> > >> > [ 11.252268] io_pgetevents(f7f19000, 4294967295, 1, ...) >> > [ 11.252401] comparing 4294967295 <= 1 >> > io_pgetevents02.c:114: TPASS: invalid min_nr: io_pgetevents() failed as expected: EINVAL (22) >> > [ 11.252610] io_pgetevents(f7f19000, 1, 4294967295, ...) >> > [ 11.252748] comparing 1 <= 4294967295 >> > io_pgetevents02.c:103: TFAIL: invalid max_nr: io_pgetevents() passed unexpectedly >> >> and below is the macro expansion for the automatically generated 32bit to >> 64bit io_pgetevents. I believe it is casting u32 to s64, which appears >> to mean there is no sign extension. I don't know if this is the expected >> behaviour? > > Thank you for digging through this, I meant to already reply once more yesterday > but didn't get around to that. Thanks, no problem. I suppose this will effect other systemcalls as well. Which if nothing else is a pain for testing. > >> __typeof(__builtin_choose_expr( >> (__builtin_types_compatible_p(typeof((long)0), typeof(0LL)) || >> __builtin_types_compatible_p(typeof((long)0), typeof(0ULL))), >> 0LL, 0L)) min_nr, >> __typeof(__builtin_choose_expr( >> (__builtin_types_compatible_p(typeof((long)0), typeof(0LL)) || >> __builtin_types_compatible_p(typeof((long)0), typeof(0ULL))), >> 0LL, 0L)) nr, > > The part that I remembered is in arch/s390/include/asm/syscall_wrapper.h, > which uses this version instead: > > #define __SC_COMPAT_CAST(t, a) \ > ({ \ > long __ReS = a; \ > \ > BUILD_BUG_ON((sizeof(t) > 4) && !__TYPE_IS_L(t) && \ > !__TYPE_IS_UL(t) && !__TYPE_IS_PTR(t) && \ > !__TYPE_IS_LL(t)); \ > if (__TYPE_IS_L(t)) \ > __ReS = (s32)a; \ > if (__TYPE_IS_UL(t)) \ > __ReS = (u32)a; \ > if (__TYPE_IS_PTR(t)) \ > __ReS = a & 0x7fffffff; \ > if (__TYPE_IS_LL(t)) \ > return -ENOSYS; \ > (t)__ReS; \ > }) > > This also takes care of s390-specific pointer conversion, which is the > reason for needing an architecture-specific wrapper, but I suppose the > handling of signed arguments as done in s390 should also be done > everywhere else. > > I also noticed that only x86 and s390 even have separate entry > points for normal syscalls when called in compat mode, while > the others all just zero the upper halves of the registers in the > low-level entry code and then call the native entry point. > > Arnd It looks to me like aarch64 also has something similar? At any rate, I can try to fix it for x86 and investigate what else might be effected. -- Thank you, Richard.
Powered by blists - more mailing lists