[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