clone bug (glibc?) (Was: clone-multi-ptrace test failure)

Oleg Nesterov oleg at redhat.com
Sat Nov 28 19:04:02 UTC 2009


(add cc's)

On 11/27, caiqian at redhat.com wrote:
>
> I have consistently reproduced the failure with clone-multi-ptrace
> with both the patched and unpatched F13 kernels.
>
> # ./clone-multi-ptrace
> clone-multi-ptrace: clone-multi-ptrace.c:205: try_to_reproduce: Assertion `((((__extension__ (((union { __typeof(status) __in; int __i; }) { .__in = (status) }).__i))) & 0xff00) >> 8) == 5' failed.
> clone-multi-ptrace: clone-multi-ptrace.c:101: handler_fail: Assertion `0' failed.
> Aborted

I can reproduce this on Jan's testing machine (thanks a lot Jan ;).

This has nothing to do with ptrace, perhaps user-space bug. The test
case fails because the traced traced gets SIGILL, but this happens
even without ptrace.

I distilled the code

	#include <asm/unistd.h>
	#include <stdlib.h>
	#include <sys/wait.h>
	#include <unistd.h>
	#include <assert.h>
	#include <stdio.h>
	#include <sched.h>

	#define THREAD_NUM	2
	#define STACK_SIZE	(16 * 1024)

	static int thread_func(void *unused)
	{
		syscall(__NR_exit, 22);
		return 0;
	}

	void try_to_reproduce (void)
	{
		int pid, status, i;

		pid = fork();
		if (pid == 0) {
			for (i = 0; i < THREAD_NUM; i++)
				clone(thread_func, malloc(STACK_SIZE) + STACK_SIZE,
					CLONE_VM | // only this flag is important
					CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_THREAD | CLONE_SYSVSEM,
					NULL);

			usleep(1000);
			exit(0);
		}

		assert(pid == waitpid(pid, &status, 0));
		if (WIFEXITED(status))
			return;

		printf("\nERR!! status=%x\n", status);
		exit(1);
	}

	int main(void)
	{
		for (;;) {
			try_to_reproduce();
			printf(".");
		}

		return 0;
	}

and it quickly triggers the same problem.

The subthread (and thus the whole child process) is killed by SIGILL,
si_code == 2 (ILL_ILLOPN), the faulting instruction is "vmovdqa"
in /lib64/ld-2.11.so:_dl_x86_64_restore_sse()

        Dump of assembler code for function _dl_x86_64_restore_sse:
        0x0000003ad1e14950 <_dl_x86_64_restore_sse+0>:  cmpl   $0x0,0x20a5f9(%rip)	# +0x3ad201ef50
        0x0000003ad1e14957 <_dl_x86_64_restore_sse+7>:  js     0x3ad1e149aa <_dl_x86_64_restore_sse+90>
--->    0x0000003ad1e14959 <_dl_x86_64_restore_sse+9>:  vmovdqa %fs:0x80,%ymm0
        0x0000003ad1e14963 <_dl_x86_64_restore_sse+19>: vmovdqa %fs:0xa0,%ymm1
        0x0000003ad1e1496d <_dl_x86_64_restore_sse+29>: vmovdqa %fs:0xc0,%ymm2
        0x0000003ad1e14977 <_dl_x86_64_restore_sse+39>: vmovdqa %fs:0xe0,%ymm3
        0x0000003ad1e14981 <_dl_x86_64_restore_sse+49>: vmovdqa %fs:0x100,%ymm4
        0x0000003ad1e1498b <_dl_x86_64_restore_sse+59>: vmovdqa %fs:0x120,%ymm5
        0x0000003ad1e14995 <_dl_x86_64_restore_sse+69>: vmovdqa %fs:0x140,%ymm6
        0x0000003ad1e1499f <_dl_x86_64_restore_sse+79>: vmovdqa %fs:0x160,%ymm7
        0x0000003ad1e149a9 <_dl_x86_64_restore_sse+89>: retq
        0x0000003ad1e149aa <_dl_x86_64_restore_sse+90>: movdqa %fs:0x80,%xmm0

Stack trace:

	#0  _dl_x86_64_restore_sse () at ../sysdeps/x86_64/dl-trampoline.S:222
	222		vmovdqa %fs:RTLD_SAVESPACE_SSE+0*YMM_SIZE, %ymm0
	#0  _dl_x86_64_restore_sse () at ../sysdeps/x86_64/dl-trampoline.S:222
	#1  0x0000003ad1e0dbf5 in _dl_fixup (l=<value optimized out>, reloc_arg=<value optimized out>) at ../elf/dl-runtime.c:126
	#2  0x0000003ad1e142e5 in _dl_runtime_resolve () at ../sysdeps/x86_64/dl-trampoline.S:41
	#3  0x0000000000400855 in thread_func (unused=<value optimized out>) at CLONE.c:14
	#4  0x0000003ad22ddf3d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:112

glibc-2.11-2.x86_64
kernel 2.6.31.5-127.fc12.x86_64

Oleg.




More information about the utrace-devel mailing list