Skip to content

Commit 756bd39

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 7957eea commit 756bd39

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
@@ -621,6 +621,13 @@ int main(int argc, char **argv)
621621
usage(argv[0]);
622622
}
623623

624+
char src_domain_id_str[11];
625+
{
626+
int snprintf_res = snprintf(src_domain_id_str, sizeof(src_domain_id_str), "%d", src_domain_id);
627+
if (snprintf_res < 0 || snprintf_res >= (int)sizeof(src_domain_id_str))
628+
err(1, "snprintf()");
629+
}
630+
624631
if (strcmp(domname, "dom0") == 0 || strcmp(domname, "@adminvm") == 0) {
625632
if (request_id != NULL) {
626633
msg_type = MSG_SERVICE_CONNECT;
@@ -635,7 +642,7 @@ int main(int argc, char **argv)
635642
abort();
636643
}
637644
set_remote_domain(src_domain_name);
638-
s = connect_unix_socket(src_domain_name);
645+
s = connect_unix_socket(src_domain_id_str);
639646
negotiate_connection_params(s,
640647
0, /* dom0 */
641648
msg_type,
@@ -698,7 +705,7 @@ int main(int argc, char **argv)
698705
buffer_init(&stdin_buffer);
699706
prepare_ret = prepare_local_fds(local_cmdline, &stdin_buffer);
700707
if (request_id) {
701-
s = connect_unix_socket(src_domain_name);
708+
s = connect_unix_socket(src_domain_id_str);
702709
send_service_connect(s, request_id, data_domain, data_port);
703710
close(s);
704711
if (wait_connection_end) {

qrexec/tests/socket/daemon.py

+10-7
Original file line numberDiff line numberDiff line change
@@ -581,9 +581,12 @@ def stop_client(self):
581581
self.client.communicate()
582582
self.client = None
583583

584-
def connect_daemon(self, domain_name):
584+
def connect_daemon(self, domain_id, domain_name):
585+
assert isinstance(domain_id, int), "domain ID is first"
586+
assert isinstance(domain_name, str), "domain name is second"
585587
daemon = qrexec.socket_server(
586-
os.path.join(self.tempdir, "qrexec.{}".format(domain_name))
588+
os.path.join(self.tempdir, "qrexec.{}".format(domain_id)),
589+
os.path.join(self.tempdir, "qrexec.{}".format(domain_name)),
587590
)
588591
self.addCleanup(daemon.close)
589592
return daemon
@@ -604,7 +607,7 @@ def test_run_vm_command_from_dom0(self):
604607
target_domain = 42
605608
target_port = 513
606609

607-
target_daemon = self.connect_daemon(target_domain_name)
610+
target_daemon = self.connect_daemon(target_domain, target_domain_name)
608611
self.start_client(["-d", target_domain_name, cmd])
609612
target_daemon.accept()
610613
target_daemon.handshake()
@@ -640,7 +643,7 @@ def test_run_vm_command_from_dom0_with_local_command(self):
640643
target_domain = 42
641644
target_port = 513
642645

643-
target_daemon = self.connect_daemon(target_domain_name)
646+
target_daemon = self.connect_daemon(target_domain, target_domain_name)
644647
self.start_client(["-d", target_domain_name, "-l", local_cmd, cmd])
645648
target_daemon.accept()
646649
target_daemon.handshake()
@@ -687,8 +690,8 @@ def test_run_vm_command_and_connect_vm(self):
687690
target_domain = 42
688691
target_port = 513
689692

690-
target_daemon = self.connect_daemon(target_domain_name)
691-
src_daemon = self.connect_daemon(src_domain_name)
693+
target_daemon = self.connect_daemon(target_domain, target_domain_name)
694+
src_daemon = self.connect_daemon(src_domain, src_domain_name)
692695

693696
self.start_client(
694697
[
@@ -737,7 +740,7 @@ def connect_service_request(self, cmd):
737740
src_domain = 43
738741
src_port = 42
739742

740-
src_daemon = self.connect_daemon(src_domain_name)
743+
src_daemon = self.connect_daemon(src_domain, src_domain_name)
741744
source = self.connect_source(src_domain, src_port)
742745

743746
self.start_client(

qrexec/tests/socket/qrexec.py

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

137137

138-
def socket_server(socket_path):
138+
def socket_server(socket_path, socket_path_alt=None):
139139
try:
140140
os.unlink(socket_path)
141141
except FileNotFoundError:
142142
pass
143+
if socket_path_alt is not None:
144+
assert socket_path_alt[0] == '/', "path not absolute"
145+
try:
146+
os.unlink(socket_path_alt)
147+
except FileNotFoundError:
148+
pass
143149
server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
144150
server.bind(socket_path)
151+
if socket_path_alt is not None:
152+
os.symlink(socket_path, socket_path_alt)
145153
server.listen(1)
146154
return QrexecServer(server)
147155

0 commit comments

Comments
 (0)