From: Imre Deak <imre.deak@intel.com>
To: intel-gfx@lists.freedesktop.org
Subject: [PATCH] lib/drmtest: don't use asprintf on signal paths
Date: Tue, 4 Feb 2014 21:15:14 +0200 [thread overview]
Message-ID: <1391541314-18771-1-git-send-email-imre.deak@intel.com> (raw)
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@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
next reply other threads:[~2014-02-04 19:16 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-02-04 19:15 Imre Deak [this message]
2014-02-04 21:29 ` [PATCH] lib/drmtest: don't use asprintf on signal paths Chris Wilson
2014-02-04 22:04 ` Imre Deak
2014-02-04 23:19 ` Daniel Vetter
2014-02-05 9:29 ` Imre Deak
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1391541314-18771-1-git-send-email-imre.deak@intel.com \
--to=imre.deak@intel.com \
--cc=intel-gfx@lists.freedesktop.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox