[PATCH v3 2/2] tests: Workaroud for buggy glibc in ipc_msg test on ppc64

Dmitry V. Levin ldv at altlinux.org
Tue Sep 13 09:48:20 UTC 2016


On Tue, Sep 13, 2016 at 02:56:44AM +0300, Eugene Syromyatnikov wrote:
> glibc before 2.23 (glibc-2.22-122-gbe48165? to be more precise) tried to access
> data pointed by third argument of msgctl call on 64-bit PowerPC which led to
> segmentataion fault (instead of EFAULT from kernel).
[...]
> +/*
> + * Before glibc-2.22-122-gbe48165, ppc64 code tried to retrieve data provided in
> + * third argument of msgctl call (in case of IPC_SET cmd) which led to
> + * segmentation fault.
> + */
> +#if !(defined BROKEN_GLIBC)
> +# if defined __GLIBC__ && defined POWERPC && defined POWERPC64
> +#  if !(defined __GLIBC_MINOR__) || \
> +        ((__GLIBC__ << 16) + __GLIBC_MINOR__ < (2 << 16) + 23)
> +#   define BROKEN_GLIBC 1
> +#  endif
> +# endif /* __GLIBC__ && _powerpc__ && __ppc64__ */
> +#endif /* !BROKEN_GLIBC */
> +
> +#ifndef BROKEN_GLIBC
> +# define BROKEN_GLIBC 0
> +#endif
> +
>  static int id = -1;
>  
>  static void
> @@ -58,7 +76,9 @@ main(void)
>  	static const key_t bogus_key = (key_t) 0xeca86420fdb97531ULL;
>  	static const int bogus_msgid = 0xfdb97531;
>  	static const int bogus_cmd = 0xdeadbeef;
> +#if !BROKEN_GLIBC
>  	static void * const bogus_addr = (void *) -1L;
> +#endif
>  	static const int bogus_flags = 0xface1e55 & ~IPC_CREAT;
>  
>  	assert(msgget(bogus_key, bogus_flags) == -1);
> @@ -81,9 +101,11 @@ main(void)
>  	printf("msgctl\\(%d, (IPC_64\\|)?%#x /\\* MSG_\\?\\?\\? \\*/, NULL\\) "
>  		"+= %s\n", bogus_msgid, bogus_cmd, sprintrc_grep(-1));
>  
> +#if !BROKEN_GLIBC
>  	assert(msgctl(bogus_msgid, IPC_SET, bogus_addr) == -1);
>  	printf("msgctl\\(%d, (IPC_64\\|)?IPC_SET, %p\\) += %s\n",
>  		bogus_msgid, bogus_addr, sprintrc_grep(-1));
> +#endif
>  
>  	if (msgctl(id, IPC_STAT, &ds))
>  		perror_msg_and_skip("msgctl IPC_STAT");

It isn't correct to blame glibc for being buggy if it dereferences
the bogus pointer passed to msgctl.
Could you rename BROKEN_GLIBC to e.g. SKIP_TEST_BOGUS_ADDR, please?

On Tue, Sep 13, 2016 at 09:32:11AM +0200, Andreas Schwab wrote:
> On Sep 13 2016, Eugene Syromyatnikov wrote:
> 
> > glibc before 2.23 (glibc-2.22-122-gbe48165? to be more precise) tried to access
> > data pointed by third argument of msgctl call on 64-bit PowerPC which led to
> > segmentataion fault (instead of EFAULT from kernel).
> 
> Which is a perfectly valid thing to do, as passing an invalid pointer to
> msgctl (the libc function) invokes undefined behaviour.  If you want to
> test the kernel behaviour you need to talk to the kernel directly.

To be honest, I don't quite like the idea of reimplementing complex
arch-specific syscall wrappers just for the sake of strace tests.
Well, not yet.


-- 
ldv
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://lists.strace.io/pipermail/strace-devel/attachments/20160913/126d66f2/attachment.bin>


More information about the Strace-devel mailing list