It's not signal safe and I got kms_flip in hung state with the backtrace below, while the parent process waiting for the signal helper to exit. It was quite easy to reproduce the bug by running kms_flip --run-subtest=flip-vs-dpms-off-vs-modeset With the change I couldn't reproduce it. 0 0x00007f9a1362018b in ?? () from /lib/x86_64-linux-gnu/libc.so.6 1 0x00007f9a1359df81 in ?? () from /lib/x86_64-linux-gnu/libc.so.6 2 0x00007f9a1359b6cf in ?? () from /lib/x86_64-linux-gnu/libc.so.6 3 0x00007f9a13628eb6 in __vasprintf_chk () from /lib/x86_64-linux-gnu/libc.so.6 4 0x00007f9a13628e72 in __asprintf_chk () from /lib/x86_64-linux-gnu/libc.so.6 5 0x000000000040a4a2 in asprintf (__fmt=0x417441 "/dev/dri/card%u", __ptr=0x7fff1a972c08) at /usr/include/x86_64-linux-gnu/bits/stdio2.h:178 6 drm_get_card () at drmtest.c:190 7 0x000000000040a54a in __drm_open_any () at drmtest.c:229 8 0x000000000040a846 in quiescent_gpu_at_exit (sig=<optimized out>) at drmtest.c:281 9 0x0000000000408759 in call_exit_handlers (sig=3) at drmtest.c:1519 10 fatal_sig_handler (sig=3) at drmtest.c:1543 11 <signal handler called> 12 0x00007f9a13596770 in ?? () from /lib/x86_64-linux-gnu/libc.so.6 13 0x00007f9a135d8f3f in fork () from /lib/x86_64-linux-gnu/libc.so.6 14 0x000000000040b3af in __igt_fork_helper (proc=0x61d8cc <signal_helper>) at drmtest.c:1199 15 0x000000000040b4ce in igt_fork_signal_helper () at drmtest.c:751 16 0x0000000000404167 in main (argc=<optimized out>, argv=<optimized out>) at kms_flip.c:1533 Signed-off-by: Imre Deak <imre.deak@xxxxxxxxx> --- lib/drmtest.c | 31 +++++++++---------------------- 1 file changed, 9 insertions(+), 22 deletions(-) diff --git a/lib/drmtest.c b/lib/drmtest.c index f7262d7..77de80b 100644 --- a/lib/drmtest.c +++ b/lib/drmtest.c @@ -181,17 +181,14 @@ void gem_quiescent_gpu(int fd) */ int drm_get_card(void) { - char *name; int i, fd; for (i = 0; i < 16; i++) { - int ret; + char name[128]; - ret = asprintf(&name, "/dev/dri/card%u", i); - igt_assert(ret != -1); + snprintf(name, sizeof(name), "/dev/dri/card%u", i); fd = open(name, O_RDWR); - free(name); if (fd == -1) continue; @@ -223,15 +220,12 @@ static void oom_adjust_for_doom(void) /** Open the first DRM device we can find, searching up to 16 device nodes */ static int __drm_open_any(void) { - char *name; - int ret, fd; + char name[128]; + int fd; - ret = asprintf(&name, "/dev/dri/card%d", drm_get_card()); - if (ret == -1) - return -1; + snprintf(name, sizeof(name), "/dev/dri/card%d", drm_get_card()); fd = open(name, O_RDWR); - free(name); if (!is_intel(fd)) { close(fd); @@ -245,17 +239,14 @@ static int __drm_open_any(void) static int __drm_open_any_render(void) { - char *name; int i, fd; for (i = 128; i < (128 + 16); i++) { - int ret; + char name[128]; - ret = asprintf(&name, "/dev/dri/renderD%u", i); - igt_assert(ret != -1); + snprintf(name, sizeof(name), "/dev/dri/renderD%u", i); fd = open(name, O_RDWR); - free(name); if (fd == -1) continue; @@ -1041,14 +1032,10 @@ void __igt_skip_check(const char *file, const int line, int err = errno; if (f) { - static char *buf; - - /* igt_skip never returns, so try to not leak too badly. */ - if (buf) - free(buf); + static char buf[4096]; va_start(args, f); - vasprintf(&buf, f, args); + vsnprintf(buf, sizeof(buf), f, args); va_end(args); igt_skip("Test requirement not met in function %s, file %s:%i:\n" -- 1.8.4 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx