* [Qemu-devel] [PULL 0/2] qtest: don't leak pid files and UNIX domain sockets @ 2014-02-03 15:20 Stefan Hajnoczi 2014-02-03 15:20 ` [Qemu-devel] [PULL 1/2] qtest: unlink QEMU pid file after startup Stefan Hajnoczi ` (2 more replies) 0 siblings, 3 replies; 7+ messages in thread From: Stefan Hajnoczi @ 2014-02-03 15:20 UTC (permalink / raw) To: qemu-devel; +Cc: Peter Maydell, Andreas Faerber, Anthony Liguori This pull request has been rebased onto qemu.git/master and retested. The series fixes init_socket() failures when reused PIDs cause temporary file name collisions. GLib uses abort(3) to exit failed test cases. As a result, the pid file and UNIX domain sockets for a running test are leaked upon failure. Since abort(3) does not call atexit(3) handler functions, we could set up a SIGABRT handler that performs cleanup. But there are other conditions where processes die, like SIGSEGV or SIGBUS. Let's unlink pid files and UNIX domain sockets as soon as the QEMU process has initialized and connections have been made. This eliminates the possibility of leaking these files. Note that the actual QEMU process is orphaned when a test case fails. This series does not fix that problem. Stefan Hajnoczi (2): qtest: unlink QEMU pid file after startup qtest: unlink UNIX domain sockets after connecting tests/libqtest.c | 45 +++++++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 22 deletions(-) -- 1.8.5.3 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [Qemu-devel] [PULL 1/2] qtest: unlink QEMU pid file after startup 2014-02-03 15:20 [Qemu-devel] [PULL 0/2] qtest: don't leak pid files and UNIX domain sockets Stefan Hajnoczi @ 2014-02-03 15:20 ` Stefan Hajnoczi 2014-02-03 15:20 ` [Qemu-devel] [PULL 2/2] qtest: unlink UNIX domain sockets after connecting Stefan Hajnoczi 2014-02-03 16:01 ` [Qemu-devel] [PULL 0/2] qtest: don't leak pid files and UNIX domain sockets Peter Maydell 2 siblings, 0 replies; 7+ messages in thread From: Stefan Hajnoczi @ 2014-02-03 15:20 UTC (permalink / raw) To: qemu-devel; +Cc: Peter Maydell, Andreas Faerber, Anthony Liguori After starting the QEMU process and initializing the QMP connection, we can read the pid file and unlink it. Just stash away the pid instead of the pid filename. This way we can avoid pid file leaks since running tests may abort(3) without cleanup. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> --- tests/libqtest.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/tests/libqtest.c b/tests/libqtest.c index 359d571..dd93be8 100644 --- a/tests/libqtest.c +++ b/tests/libqtest.c @@ -43,8 +43,8 @@ struct QTestState int qmp_fd; bool irq_level[MAX_IRQ]; GString *rx; - gchar *pid_file; /* QEMU PID file */ int child_pid; /* Child process created to execute QEMU */ + pid_t qemu_pid; /* QEMU process spawned by our child */ char *socket_path, *qmp_socket_path; }; @@ -90,13 +90,13 @@ static int socket_accept(int sock) return ret; } -static pid_t qtest_qemu_pid(QTestState *s) +static pid_t read_pid_file(const char *pid_file) { FILE *f; char buffer[1024]; pid_t pid = -1; - f = fopen(s->pid_file, "r"); + f = fopen(pid_file, "r"); if (f) { if (fgets(buffer, sizeof(buffer), f)) { pid = atoi(buffer); @@ -147,7 +147,6 @@ QTestState *qtest_init(const char *extra_args) s->qmp_fd = socket_accept(qmpsock); s->rx = g_string_new(""); - s->pid_file = pid_file; s->child_pid = pid; for (i = 0; i < MAX_IRQ; i++) { s->irq_level[i] = false; @@ -157,8 +156,12 @@ QTestState *qtest_init(const char *extra_args) qtest_qmp_discard_response(s, ""); qtest_qmp_discard_response(s, "{ 'execute': 'qmp_capabilities' }"); + s->qemu_pid = read_pid_file(pid_file); + unlink(pid_file); + g_free(pid_file); + if (getenv("QTEST_STOP")) { - kill(qtest_qemu_pid(s), SIGSTOP); + kill(s->qemu_pid, SIGSTOP); } return s; @@ -168,19 +171,16 @@ void qtest_quit(QTestState *s) { int status; - pid_t pid = qtest_qemu_pid(s); - if (pid != -1) { - kill(pid, SIGTERM); - waitpid(pid, &status, 0); + if (s->qemu_pid != -1) { + kill(s->qemu_pid, SIGTERM); + waitpid(s->qemu_pid, &status, 0); } close(s->fd); close(s->qmp_fd); g_string_free(s->rx, true); - unlink(s->pid_file); unlink(s->socket_path); unlink(s->qmp_socket_path); - g_free(s->pid_file); g_free(s->socket_path); g_free(s->qmp_socket_path); g_free(s); -- 1.8.5.3 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [Qemu-devel] [PULL 2/2] qtest: unlink UNIX domain sockets after connecting 2014-02-03 15:20 [Qemu-devel] [PULL 0/2] qtest: don't leak pid files and UNIX domain sockets Stefan Hajnoczi 2014-02-03 15:20 ` [Qemu-devel] [PULL 1/2] qtest: unlink QEMU pid file after startup Stefan Hajnoczi @ 2014-02-03 15:20 ` Stefan Hajnoczi 2014-02-03 16:01 ` [Qemu-devel] [PULL 0/2] qtest: don't leak pid files and UNIX domain sockets Peter Maydell 2 siblings, 0 replies; 7+ messages in thread From: Stefan Hajnoczi @ 2014-02-03 15:20 UTC (permalink / raw) To: qemu-devel; +Cc: Peter Maydell, Andreas Faerber, Anthony Liguori UNIX domain sockets are leaked when tests call abort(3) (indirectly via glib assert functions). Unlink the files immediately after the connection has been established to avoid leaks. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> --- tests/libqtest.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/tests/libqtest.c b/tests/libqtest.c index dd93be8..c9a4f89 100644 --- a/tests/libqtest.c +++ b/tests/libqtest.c @@ -45,7 +45,6 @@ struct QTestState GString *rx; int child_pid; /* Child process created to execute QEMU */ pid_t qemu_pid; /* QEMU process spawned by our child */ - char *socket_path, *qmp_socket_path; }; #define g_assert_no_errno(ret) do { \ @@ -110,6 +109,8 @@ QTestState *qtest_init(const char *extra_args) { QTestState *s; int sock, qmpsock, i; + gchar *socket_path; + gchar *qmp_socket_path; gchar *pid_file; gchar *command; const char *qemu_binary; @@ -120,12 +121,12 @@ QTestState *qtest_init(const char *extra_args) s = g_malloc(sizeof(*s)); - s->socket_path = g_strdup_printf("/tmp/qtest-%d.sock", getpid()); - s->qmp_socket_path = g_strdup_printf("/tmp/qtest-%d.qmp", getpid()); + socket_path = g_strdup_printf("/tmp/qtest-%d.sock", getpid()); + qmp_socket_path = g_strdup_printf("/tmp/qtest-%d.qmp", getpid()); pid_file = g_strdup_printf("/tmp/qtest-%d.pid", getpid()); - sock = init_socket(s->socket_path); - qmpsock = init_socket(s->qmp_socket_path); + sock = init_socket(socket_path); + qmpsock = init_socket(qmp_socket_path); pid = fork(); if (pid == 0) { @@ -136,8 +137,8 @@ QTestState *qtest_init(const char *extra_args) "-pidfile %s " "-machine accel=qtest " "-display none " - "%s", qemu_binary, s->socket_path, - s->qmp_socket_path, pid_file, + "%s", qemu_binary, socket_path, + qmp_socket_path, pid_file, extra_args ?: ""); execlp("/bin/sh", "sh", "-c", command, NULL); exit(1); @@ -145,6 +146,10 @@ QTestState *qtest_init(const char *extra_args) s->fd = socket_accept(sock); s->qmp_fd = socket_accept(qmpsock); + unlink(socket_path); + unlink(qmp_socket_path); + g_free(socket_path); + g_free(qmp_socket_path); s->rx = g_string_new(""); s->child_pid = pid; @@ -179,10 +184,6 @@ void qtest_quit(QTestState *s) close(s->fd); close(s->qmp_fd); g_string_free(s->rx, true); - unlink(s->socket_path); - unlink(s->qmp_socket_path); - g_free(s->socket_path); - g_free(s->qmp_socket_path); g_free(s); } -- 1.8.5.3 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [Qemu-devel] [PULL 0/2] qtest: don't leak pid files and UNIX domain sockets 2014-02-03 15:20 [Qemu-devel] [PULL 0/2] qtest: don't leak pid files and UNIX domain sockets Stefan Hajnoczi 2014-02-03 15:20 ` [Qemu-devel] [PULL 1/2] qtest: unlink QEMU pid file after startup Stefan Hajnoczi 2014-02-03 15:20 ` [Qemu-devel] [PULL 2/2] qtest: unlink UNIX domain sockets after connecting Stefan Hajnoczi @ 2014-02-03 16:01 ` Peter Maydell 2014-02-04 8:31 ` Stefan Hajnoczi 2 siblings, 1 reply; 7+ messages in thread From: Peter Maydell @ 2014-02-03 16:01 UTC (permalink / raw) To: Stefan Hajnoczi; +Cc: QEMU Developers, Anthony Liguori, Andreas Faerber On 3 February 2014 15:20, Stefan Hajnoczi <stefanha@redhat.com> wrote: > This pull request has been rebased onto qemu.git/master and retested. > > The series fixes init_socket() failures when reused PIDs cause temporary file > name collisions. Your pull request appears to be missing the critically important part, ie the git repo/branch/tag information to pull from... ("git request-pull" is your friend here.) thanks -- PMM ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Qemu-devel] [PULL 0/2] qtest: don't leak pid files and UNIX domain sockets 2014-02-03 16:01 ` [Qemu-devel] [PULL 0/2] qtest: don't leak pid files and UNIX domain sockets Peter Maydell @ 2014-02-04 8:31 ` Stefan Hajnoczi 2014-02-07 16:41 ` Peter Maydell 0 siblings, 1 reply; 7+ messages in thread From: Stefan Hajnoczi @ 2014-02-04 8:31 UTC (permalink / raw) To: Peter Maydell; +Cc: QEMU Developers, Anthony Liguori, Andreas Faerber On Mon, Feb 03, 2014 at 04:01:00PM +0000, Peter Maydell wrote: > On 3 February 2014 15:20, Stefan Hajnoczi <stefanha@redhat.com> wrote: > > This pull request has been rebased onto qemu.git/master and retested. > > > > The series fixes init_socket() failures when reused PIDs cause temporary file > > name collisions. > > Your pull request appears to be missing the critically > important part, ie the git repo/branch/tag information > to pull from... ("git request-pull" is your friend here.) Oops, I ran the wrong script. Here are the full details and signed tag: The following changes since commit 2f61120c10da9128357510debc8e66880cd2bfdc: Merge remote-tracking branch 'qmp-unstable/queue/qmp' into staging (2014-02-01 23:32:31 +0000) are available in the git repository at: git://github.com/stefanha/qemu.git tags/qtest-for-peter for you to fetch changes up to 56db2e5843256c857addb17deb743109330649be: qtest: unlink UNIX domain sockets after connecting (2014-02-03 16:06:24 +0100) ---------------------------------------------------------------- qtest resource cleanup patches ---------------------------------------------------------------- Stefan Hajnoczi (2): qtest: unlink QEMU pid file after startup qtest: unlink UNIX domain sockets after connecting tests/libqtest.c | 45 +++++++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 22 deletions(-) ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Qemu-devel] [PULL 0/2] qtest: don't leak pid files and UNIX domain sockets 2014-02-04 8:31 ` Stefan Hajnoczi @ 2014-02-07 16:41 ` Peter Maydell 2014-02-09 11:40 ` Andreas Färber 0 siblings, 1 reply; 7+ messages in thread From: Peter Maydell @ 2014-02-07 16:41 UTC (permalink / raw) To: Stefan Hajnoczi; +Cc: QEMU Developers, Anthony Liguori, Andreas Faerber On 4 February 2014 08:31, Stefan Hajnoczi <stefanha@redhat.com> wrote: > On Mon, Feb 03, 2014 at 04:01:00PM +0000, Peter Maydell wrote: >> On 3 February 2014 15:20, Stefan Hajnoczi <stefanha@redhat.com> wrote: >> > This pull request has been rebased onto qemu.git/master and retested. >> > >> > The series fixes init_socket() failures when reused PIDs cause temporary file >> > name collisions. >> >> Your pull request appears to be missing the critically >> important part, ie the git repo/branch/tag information >> to pull from... ("git request-pull" is your friend here.) > > Oops, I ran the wrong script. Here are the full details and signed tag: Applied, thanks. -- PMM ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Qemu-devel] [PULL 0/2] qtest: don't leak pid files and UNIX domain sockets 2014-02-07 16:41 ` Peter Maydell @ 2014-02-09 11:40 ` Andreas Färber 0 siblings, 0 replies; 7+ messages in thread From: Andreas Färber @ 2014-02-09 11:40 UTC (permalink / raw) To: Peter Maydell, Stefan Hajnoczi; +Cc: QEMU Developers, Anthony Liguori Am 07.02.2014 17:41, schrieb Peter Maydell: > On 4 February 2014 08:31, Stefan Hajnoczi <stefanha@redhat.com> wrote: >> On Mon, Feb 03, 2014 at 04:01:00PM +0000, Peter Maydell wrote: >>> On 3 February 2014 15:20, Stefan Hajnoczi <stefanha@redhat.com> wrote: >>>> This pull request has been rebased onto qemu.git/master and retested. >>>> >>>> The series fixes init_socket() failures when reused PIDs cause temporary file >>>> name collisions. >>> >>> Your pull request appears to be missing the critically >>> important part, ie the git repo/branch/tag information >>> to pull from... ("git request-pull" is your friend here.) >> >> Oops, I ran the wrong script. Here are the full details and signed tag: > > Applied, thanks. Thanks. I've stumbled over a remaining pid file leak: http://patchwork.ozlabs.org/patch/318576/ Regards, Andreas -- SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2014-02-09 11:40 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2014-02-03 15:20 [Qemu-devel] [PULL 0/2] qtest: don't leak pid files and UNIX domain sockets Stefan Hajnoczi 2014-02-03 15:20 ` [Qemu-devel] [PULL 1/2] qtest: unlink QEMU pid file after startup Stefan Hajnoczi 2014-02-03 15:20 ` [Qemu-devel] [PULL 2/2] qtest: unlink UNIX domain sockets after connecting Stefan Hajnoczi 2014-02-03 16:01 ` [Qemu-devel] [PULL 0/2] qtest: don't leak pid files and UNIX domain sockets Peter Maydell 2014-02-04 8:31 ` Stefan Hajnoczi 2014-02-07 16:41 ` Peter Maydell 2014-02-09 11:40 ` Andreas Färber
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).