Skip to content

Commit 100fbb9

Browse files
committed
qrexec-client: Use XID to connect to qrexec daemon when possible
Unlike domain name, the Xen domain ID (XID) is guaranteed to not be reused until reboot. It is currently possible for qrexec-client to use the XID for all connections to the source VM, but not for connections to the destination VM.
1 parent 31374d1 commit 100fbb9

File tree

3 files changed

+28
-10
lines changed

3 files changed

+28
-10
lines changed

daemon/qrexec-client.c

+9-2
Original file line numberDiff line numberDiff line change
@@ -603,6 +603,13 @@ int main(int argc, char **argv)
603603
usage(argv[0]);
604604
}
605605

606+
char src_domain_id_str[11];
607+
{
608+
int snprintf_res = snprintf(src_domain_id_str, sizeof(src_domain_id_str), "%d", src_domain_id);
609+
if (snprintf_res < 0 || snprintf_res >= (int)sizeof(src_domain_id_str))
610+
err(1, "snprintf()");
611+
}
612+
606613
if (strcmp(domname, "dom0") == 0 || strcmp(domname, "@adminvm") == 0) {
607614
if (request_id != NULL) {
608615
msg_type = MSG_SERVICE_CONNECT;
@@ -617,7 +624,7 @@ int main(int argc, char **argv)
617624
abort();
618625
}
619626
set_remote_domain(src_domain_name);
620-
s = connect_unix_socket(src_domain_name);
627+
s = connect_unix_socket(src_domain_id_str);
621628
negotiate_connection_params(s,
622629
0, /* dom0 */
623630
msg_type,
@@ -676,7 +683,7 @@ int main(int argc, char **argv)
676683
buffer_init(&stdin_buffer);
677684
prepare_ret = prepare_local_fds(local_cmdline, &stdin_buffer);
678685
if (request_id) {
679-
s = connect_unix_socket(src_domain_name);
686+
s = connect_unix_socket(src_domain_id_str);
680687
send_service_connect(s, request_id, data_domain, data_port);
681688
close(s);
682689
if (wait_connection_end) {

qrexec/tests/socket/daemon.py

+10-7
Original file line numberDiff line numberDiff line change
@@ -493,9 +493,12 @@ def stop_client(self):
493493
self.client.communicate()
494494
self.client = None
495495

496-
def connect_daemon(self, domain_name):
496+
def connect_daemon(self, domain_id, domain_name):
497+
assert isinstance(domain_id, int), "domain ID is first"
498+
assert isinstance(domain_name, str), "domain name is second"
497499
daemon = qrexec.socket_server(
498-
os.path.join(self.tempdir, "qrexec.{}".format(domain_name))
500+
os.path.join(self.tempdir, "qrexec.{}".format(domain_id)),
501+
os.path.join(self.tempdir, "qrexec.{}".format(domain_name)),
499502
)
500503
self.addCleanup(daemon.close)
501504
return daemon
@@ -516,7 +519,7 @@ def test_run_vm_command_from_dom0(self):
516519
target_domain = 42
517520
target_port = 513
518521

519-
target_daemon = self.connect_daemon(target_domain_name)
522+
target_daemon = self.connect_daemon(target_domain, target_domain_name)
520523
self.start_client(["-d", target_domain_name, cmd])
521524
target_daemon.accept()
522525
target_daemon.handshake()
@@ -552,7 +555,7 @@ def test_run_vm_command_from_dom0_with_local_command(self):
552555
target_domain = 42
553556
target_port = 513
554557

555-
target_daemon = self.connect_daemon(target_domain_name)
558+
target_daemon = self.connect_daemon(target_domain, target_domain_name)
556559
self.start_client(["-d", target_domain_name, "-l", local_cmd, cmd])
557560
target_daemon.accept()
558561
target_daemon.handshake()
@@ -599,8 +602,8 @@ def test_run_vm_command_and_connect_vm(self):
599602
target_domain = 42
600603
target_port = 513
601604

602-
target_daemon = self.connect_daemon(target_domain_name)
603-
src_daemon = self.connect_daemon(src_domain_name)
605+
target_daemon = self.connect_daemon(target_domain, target_domain_name)
606+
src_daemon = self.connect_daemon(src_domain, src_domain_name)
604607

605608
self.start_client(
606609
[
@@ -649,7 +652,7 @@ def connect_service_request(self, cmd):
649652
src_domain = 43
650653
src_port = 42
651654

652-
src_daemon = self.connect_daemon(src_domain_name)
655+
src_daemon = self.connect_daemon(src_domain, src_domain_name)
653656
source = self.connect_source(src_domain, src_port)
654657

655658
self.start_client(

qrexec/tests/socket/qrexec.py

+9-1
Original file line numberDiff line numberDiff line change
@@ -131,13 +131,21 @@ def vchan_server(socket_dir, domain, remote_domain, port):
131131
return socket_server(vchan_socket_path)
132132

133133

134-
def socket_server(socket_path):
134+
def socket_server(socket_path, socket_path_alt=None):
135135
try:
136136
os.unlink(socket_path)
137137
except FileNotFoundError:
138138
pass
139+
if socket_path_alt is not None:
140+
assert socket_path_alt[0] == '/', "path not absolute"
141+
try:
142+
os.unlink(socket_path_alt)
143+
except FileNotFoundError:
144+
pass
139145
server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
140146
server.bind(socket_path)
147+
if socket_path_alt is not None:
148+
os.symlink(socket_path, socket_path_alt)
141149
server.listen(1)
142150
return QrexecServer(server)
143151

0 commit comments

Comments
 (0)