Skip to content

Commit e98ed7a

Browse files
committed
qrexec-agent: Take advantage of flexible array members
No functional change intended.
1 parent 3313110 commit e98ed7a

File tree

1 file changed

+32
-49
lines changed

1 file changed

+32
-49
lines changed

agent/qrexec-agent.c

+32-49
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,8 @@ struct connection_info {
5757
* finish */
5858
struct waiting_request {
5959
int type;
60-
int connect_domain;
61-
int connect_port;
6260
int padding;
63-
char *cmdline;
61+
struct exec_params *params;
6462
struct qrexec_parsed_command *cmd;
6563
};
6664

@@ -82,9 +80,9 @@ static int meminfo_write_started = 0;
8280
static const char *agent_trigger_path = QREXEC_AGENT_TRIGGER_PATH;
8381
static const char *fork_server_path = QREXEC_FORK_SERVER_SOCKET;
8482

85-
static void handle_server_exec_request_do(int type, int connect_domain, int connect_port,
83+
static void handle_server_exec_request_do(int type,
8684
struct qrexec_parsed_command *cmd,
87-
char *cmdline);
85+
struct exec_params *params);
8886
static void terminate_connection(uint32_t domain, uint32_t port);
8987

9088
const bool qrexec_is_fork_server = false;
@@ -427,7 +425,7 @@ static void wake_meminfo_writer(void)
427425
}
428426

429427
static int try_fork_server(int type, int connect_domain, int connect_port,
430-
char *cmdline, size_t cmdline_len, const char *username) {
428+
const char *cmdline, size_t cmdline_len, const char *username) {
431429
char *colon;
432430
char *fork_server_socket_path;
433431
int s = -1;
@@ -560,37 +558,31 @@ static bool wait_for_session_maybe(struct qrexec_parsed_command *cmd) {
560558
/* hdr parameter is received from dom0, so it is trusted */
561559
static void handle_server_exec_request_init(struct msg_header *hdr)
562560
{
563-
struct exec_params params;
564561
struct qrexec_parsed_command *cmd;
565-
if (hdr->len <= sizeof(params))
566-
abort();
567-
size_t buf_len = hdr->len - sizeof(params);
568-
if (buf_len > INT_MAX)
569-
abort();
570-
char *buf = malloc(buf_len);
571-
if (!buf)
572-
abort();
573-
574-
if (libvchan_recv(ctrl_vchan, &params, sizeof(params)) != sizeof(params))
562+
struct exec_params *params;
563+
if (hdr->len <= sizeof(*params) || hdr->len > (uint32_t)INT_MAX)
564+
handle_vchan_error("buffer size validation");
565+
size_t buf_len = hdr->len - sizeof(*params);
566+
params = malloc(hdr->len);
567+
if (params == NULL)
568+
handle_vchan_error("buffer alloc");
569+
if (libvchan_recv(ctrl_vchan, params, hdr->len) != (int)hdr->len)
575570
handle_vchan_error("read exec params");
576-
if (libvchan_recv(ctrl_vchan, buf, (int)buf_len) != (int)buf_len)
577-
handle_vchan_error("read exec cmd");
578-
579-
buf[buf_len-1] = 0;
571+
params->cmdline[buf_len - 1] = 0;
580572

581573
if (hdr->type == MSG_SERVICE_CONNECT) {
582574
cmd = NULL;
583575
} else {
584-
cmd = parse_qubes_rpc_command(buf, true);
576+
cmd = parse_qubes_rpc_command(params->cmdline, true);
585577
if (cmd == NULL) {
586-
LOG(ERROR, "Could not parse command line: %s", buf);
578+
LOG(ERROR, "Could not parse command line: %s", params->cmdline);
587579
goto doit;
588580
}
589581

590582
/* load service config only for service requests */
591583
if (cmd->service_descriptor) {
592584
if (load_service_config_v2(cmd) < 0) {
593-
LOG(ERROR, "Could not load config for command %s", buf);
585+
LOG(ERROR, "Could not load config for command %s", params->cmdline);
594586
destroy_qrexec_parsed_command(cmd);
595587
cmd = NULL;
596588
goto doit;
@@ -601,16 +593,14 @@ static void handle_server_exec_request_init(struct msg_header *hdr)
601593
/* waiting for session, postpone actual call */
602594
int slot_index;
603595
for (slot_index = 0; slot_index < MAX_FDS; slot_index++)
604-
if (!requests_waiting_for_session[slot_index].cmdline)
596+
if (!requests_waiting_for_session[slot_index].params)
605597
break;
606598
if (slot_index == MAX_FDS) {
607599
/* no free slots */
608600
LOG(WARNING, "No free slots for waiting for GUI session, continuing!");
609601
} else {
610602
requests_waiting_for_session[slot_index].type = hdr->type;
611-
requests_waiting_for_session[slot_index].connect_domain = params.connect_domain;
612-
requests_waiting_for_session[slot_index].connect_port = params.connect_port;
613-
requests_waiting_for_session[slot_index].cmdline = buf;
603+
requests_waiting_for_session[slot_index].params = params;
614604
requests_waiting_for_session[slot_index].cmd = cmd;
615605
/* nothing to do now, when we get GUI session, we'll continue */
616606
return;
@@ -620,23 +610,18 @@ static void handle_server_exec_request_init(struct msg_header *hdr)
620610
}
621611

622612
doit:
623-
handle_server_exec_request_do(hdr->type, params.connect_domain, params.connect_port, cmd, buf);
613+
handle_server_exec_request_do(hdr->type, cmd, params);
624614
destroy_qrexec_parsed_command(cmd);
625-
free(buf);
615+
free(params);
626616
}
627617

628618
static void handle_server_exec_request_do(int type,
629-
int connect_domain,
630-
int connect_port,
631619
struct qrexec_parsed_command *cmd,
632-
char *cmdline) {
620+
struct exec_params *params) {
633621
int client_fd;
634622
pid_t child_agent;
623+
const char *cmdline = params->cmdline;
635624
size_t cmdline_len = strlen(cmdline) + 1; // size of cmdline, including \0 at the end
636-
struct exec_params params = {
637-
.connect_domain = connect_domain,
638-
.connect_port = connect_port,
639-
};
640625

641626
if (type == MSG_SERVICE_CONNECT) {
642627
if (sscanf(cmdline, "SOCKET%d", &client_fd) != 1)
@@ -646,7 +631,7 @@ static void handle_server_exec_request_do(int type,
646631
* qrexec-client-vm process; but this data comes from qrexec-daemon
647632
* (which sends back what it got from us earlier), so it isn't critical.
648633
*/
649-
if (write(client_fd, &params, sizeof(params)) < 0) {
634+
if (write(client_fd, params, sizeof(*params)) < 0) {
650635
/* Do not start polling invalid FD */
651636
if (errno == EBADF)
652637
goto bad_ident;
@@ -659,29 +644,29 @@ static void handle_server_exec_request_do(int type,
659644
* (close socket, send MSG_CONNECTION_TERMINATED) when qrexec-client-vm
660645
* will close the socket (terminate itself). */
661646
register_vchan_connection(-1, client_fd,
662-
params.connect_domain, params.connect_port);
647+
params->connect_domain, params->connect_port);
663648
return;
664649
}
665650

666651
if (cmd != NULL && !cmd->nogui) {
667652
/* try fork server */
668653
int child_socket = try_fork_server(type,
669-
params.connect_domain, params.connect_port,
654+
params->connect_domain, params->connect_port,
670655
cmdline, cmdline_len, cmd->username);
671656
if (child_socket >= 0) {
672657
register_vchan_connection(-1, child_socket,
673-
params.connect_domain, params.connect_port);
658+
params->connect_domain, params->connect_port);
674659
return;
675660
}
676661
}
677662

678663
/* No fork server case */
679664
child_agent = handle_new_process(type,
680-
params.connect_domain, params.connect_port,
665+
params->connect_domain, params->connect_port,
681666
cmd);
682667

683668
register_vchan_connection(child_agent, -1,
684-
params.connect_domain, params.connect_port);
669+
params->connect_domain, params->connect_port);
685670
return;
686671
bad_ident:
687672
LOG(ERROR, "Got MSG_SERVICE_CONNECT from qrexec-daemon with invalid ident (%s), ignoring",
@@ -788,18 +773,16 @@ static void reap_children(void)
788773
while ((pid = waitpid(-1, &status, WNOHANG)) > 0) {
789774
if (pid == wait_for_session_pid) {
790775
for (id = 0; id < MAX_FDS; id++) {
791-
if (!requests_waiting_for_session[id].cmdline)
776+
if (!requests_waiting_for_session[id].params)
792777
continue;
793778
handle_server_exec_request_do(
794779
requests_waiting_for_session[id].type,
795-
requests_waiting_for_session[id].connect_domain,
796-
requests_waiting_for_session[id].connect_port,
797780
requests_waiting_for_session[id].cmd,
798-
requests_waiting_for_session[id].cmdline);
781+
requests_waiting_for_session[id].params);
799782
destroy_qrexec_parsed_command(requests_waiting_for_session[id].cmd);
800783
requests_waiting_for_session[id].cmd = NULL;
801-
free(requests_waiting_for_session[id].cmdline);
802-
requests_waiting_for_session[id].cmdline = NULL;
784+
free(requests_waiting_for_session[id].params);
785+
requests_waiting_for_session[id].params = NULL;
803786
}
804787
wait_for_session_pid = -1;
805788
continue;

0 commit comments

Comments
 (0)