[Intel-gfx] [PATCH] lib/drmtest: don't use asprintf on signal paths
Imre Deak
imre.deak at intel.com
Tue Feb 4 20:15:14 CET 2014
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 at intel.com>
---
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
More information about the Intel-gfx
mailing list