From 28ca836e1425d0e9ffb609db3ca72545bb4c33e6 Mon Sep 17 00:00:00 2001 From: Marek Marczykowski Date: Fri, 22 Jun 2012 21:17:50 +0200 Subject: [PATCH] vm: support for magic QUBESRPC command Previously dom0 had to know full path of qubes_rpc_multiplexer in VM, which can differ between VMs (eg totally different on Windows). This commit enables dom0 to magic keyword instead of full path. --- qrexec/qrexec.h | 3 +++ qrexec/qrexec_agent.c | 17 +++++++++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/qrexec/qrexec.h b/qrexec/qrexec.h index 4313d119..d19126dd 100644 --- a/qrexec/qrexec.h +++ b/qrexec/qrexec.h @@ -30,6 +30,9 @@ #define QREXEC_AGENT_TRIGGER_PATH "/var/run/qubes/qrexec_agent" #define QREXEC_AGENT_FDPASS_PATH "/var/run/qubes/qrexec_agent_fdpass" #define MEMINFO_WRITER_PIDFILE "/var/run/meminfo-writer.pid" +#define QUBES_RPC_MULTIPLEXER_PATH "/usr/lib/qubes/qubes_rpc_multiplexer" + +#define QUBES_RPC_MAGIC_CMD "QUBESRPC" enum { /* messages from qrexec_client to qrexec_daemon (both in dom0) */ diff --git a/qrexec/qrexec_agent.c b/qrexec/qrexec_agent.c index 93fa100d..f8d7e20e 100644 --- a/qrexec/qrexec_agent.c +++ b/qrexec/qrexec_agent.c @@ -115,14 +115,23 @@ void no_colon_in_cmd() void do_exec(char *cmd) { - char *sep = index(cmd, ':'); - if (!sep) + char buf[strlen(QUBES_RPC_MULTIPLEXER_PATH) + strlen(cmd) - strlen(QUBES_RPC_MAGIC_CMD) + 1]; + char *realcmd = index(cmd, ':'); + if (!realcmd) no_colon_in_cmd(); - *sep = 0; + /* mark end of username and move to command */ + *realcmd = 0; + realcmd++; + /* replace magic RPC cmd with RPC multiplexer path */ + if (strncmp(realcmd, QUBES_RPC_MAGIC_CMD " ", strlen(QUBES_RPC_MAGIC_CMD)+1)==0) { + strcpy(buf, QUBES_RPC_MULTIPLEXER_PATH); + strcpy(buf + strlen(QUBES_RPC_MULTIPLEXER_PATH), realcmd + strlen(QUBES_RPC_MAGIC_CMD)); + realcmd = buf; + } signal(SIGCHLD, SIG_DFL); signal(SIGPIPE, SIG_DFL); - execl("/bin/su", "su", "-", cmd, "-c", sep + 1, NULL); + execl("/bin/su", "su", "-", cmd, "-c", realcmd, NULL); perror("execl"); exit(1); }