aboutsummaryrefslogtreecommitdiff
path: root/softmmu
diff options
context:
space:
mode:
authorHanna Reitz <hreitz@redhat.com>2022-06-09 14:27:01 +0200
committerHanna Reitz <hreitz@redhat.com>2022-07-12 14:31:15 +0200
commit85c4bf8aa6c93c24876e8870ae7cf8ab2e5a96cf (patch)
tree0af33e78d3e63391fbbbc9a798cf6c4e795cef79 /softmmu
parenteed29d49ecc5d0db82b72538745223d09a54ee97 (diff)
vl: Unlink absolute PID file path
After writing the PID file, we register an exit notifier to unlink it when the process terminates. However, if the process has changed its working directory in the meantime (e.g. in os_setup_post() when daemonizing), this will not work when the PID file path was relative. Therefore, pass the absolute path (created with realpath()) to the unlink() call in the exit notifier. (realpath() needs a path pointing to an existing file, so we cannot use it before qemu_write_pidfile().) Reproducer: $ cd /tmp $ qemu-system-x86_64 --daemonize --pidfile qemu.pid $ file qemu.pid qemu.pid: ASCII text $ kill $(cat qemu.pid) $ file qemu.pid qemu.pid: ASCII text (qemu.pid should be gone after the process has terminated.) Signed-off-by: Hanna Reitz <hreitz@redhat.com> Message-Id: <20220609122701.17172-4-hreitz@redhat.com> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Diffstat (limited to 'softmmu')
-rw-r--r--softmmu/vl.c30
1 files changed, 26 insertions, 4 deletions
diff --git a/softmmu/vl.c b/softmmu/vl.c
index 36f46fcdad..aabd82e09a 100644
--- a/softmmu/vl.c
+++ b/softmmu/vl.c
@@ -1522,11 +1522,18 @@ machine_parse_property_opt(QemuOptsList *opts_list, const char *propname,
}
static const char *pid_file;
-static Notifier qemu_unlink_pidfile_notifier;
+struct UnlinkPidfileNotifier {
+ Notifier notifier;
+ char *pid_file_realpath;
+};
+static struct UnlinkPidfileNotifier qemu_unlink_pidfile_notifier;
static void qemu_unlink_pidfile(Notifier *n, void *data)
{
- unlink(pid_file);
+ struct UnlinkPidfileNotifier *upn;
+
+ upn = DO_UPCAST(struct UnlinkPidfileNotifier, notifier, n);
+ unlink(upn->pid_file_realpath);
}
static const QEMUOption *lookup_opt(int argc, char **argv,
@@ -2430,13 +2437,28 @@ static void qemu_maybe_daemonize(const char *pid_file)
rcu_disable_atfork();
if (pid_file) {
+ char *pid_file_realpath = NULL;
+
if (!qemu_write_pidfile(pid_file, &err)) {
error_reportf_err(err, "cannot create PID file: ");
exit(1);
}
- qemu_unlink_pidfile_notifier.notify = qemu_unlink_pidfile;
- qemu_add_exit_notifier(&qemu_unlink_pidfile_notifier);
+ pid_file_realpath = g_malloc0(PATH_MAX);
+ if (!realpath(pid_file, pid_file_realpath)) {
+ error_report("cannot resolve PID file path: %s: %s",
+ pid_file, strerror(errno));
+ unlink(pid_file);
+ exit(1);
+ }
+
+ qemu_unlink_pidfile_notifier = (struct UnlinkPidfileNotifier) {
+ .notifier = {
+ .notify = qemu_unlink_pidfile,
+ },
+ .pid_file_realpath = pid_file_realpath,
+ };
+ qemu_add_exit_notifier(&qemu_unlink_pidfile_notifier.notifier);
}
}