Skip to content

Commit 4342589

Browse files
committed
Use flexible array member for 'struct trigger_service_params3'
No functional change, but the new code is shorter (and simpler). Also drop a pointless check that the command is NUL-terminated, as qrexec-daemon will do that anyway.
1 parent 72643d7 commit 4342589

File tree

3 files changed

+33
-50
lines changed

3 files changed

+33
-50
lines changed

agent/qrexec-agent.c

+11-21
Original file line numberDiff line numberDiff line change
@@ -819,9 +819,7 @@ static void reap_children(void)
819819
static void handle_trigger_io(void)
820820
{
821821
struct msg_header hdr;
822-
struct trigger_service_params3 params;
823-
char *command = NULL;
824-
size_t command_len;
822+
struct trigger_service_params3 *params = NULL;
825823
int client_fd;
826824

827825
client_fd = do_accept(trigger_fd);
@@ -830,40 +828,32 @@ static void handle_trigger_io(void)
830828
if (!read_all(client_fd, &hdr, sizeof(hdr)))
831829
goto error;
832830
if (hdr.type != MSG_TRIGGER_SERVICE3 ||
833-
hdr.len <= sizeof(params) ||
834-
hdr.len > sizeof(params) + MAX_SERVICE_NAME_LEN) {
831+
hdr.len <= sizeof(*params) ||
832+
hdr.len > sizeof(*params) + MAX_SERVICE_NAME_LEN) {
835833
LOG(ERROR, "Invalid request received from qrexec-client-vm, is it outdated?");
836834
goto error;
837835
}
838-
if (!read_all(client_fd, &params, sizeof(params)))
836+
params = malloc(hdr.len);
837+
if (!params)
839838
goto error;
840-
command_len = hdr.len - sizeof(params);
841-
command = malloc(command_len);
842-
if (!command)
843-
goto error;
844-
if (!read_all(client_fd, command, command_len))
845-
goto error;
846-
if (command[command_len-1] != '\0')
839+
if (!read_all(client_fd, params, hdr.len))
847840
goto error;
848841

849-
int res = snprintf(params.request_id.ident, sizeof(params.request_id), "SOCKET%d", client_fd);
850-
if (res < 0 || res >= (int)sizeof(params.request_id))
842+
int res = snprintf(params->request_id.ident, sizeof(params->request_id), "SOCKET%d", client_fd);
843+
if (res < 0 || res >= (int)sizeof(params->request_id))
851844
abort();
852845
if (libvchan_send(ctrl_vchan, &hdr, sizeof(hdr)) != sizeof(hdr))
853846
handle_vchan_error("write hdr");
854-
if (libvchan_send(ctrl_vchan, &params, sizeof(params)) != sizeof(params))
847+
if (libvchan_send(ctrl_vchan, params, hdr.len) != (int)hdr.len)
855848
handle_vchan_error("write params");
856-
if (libvchan_send(ctrl_vchan, command, command_len) != (int)command_len)
857-
handle_vchan_error("write command");
858849

859-
free(command);
850+
free(params);
860851
/* do not close client_fd - we'll need it to send the connection details
861852
* later (when dom0 accepts the request) */
862853
return;
863854
error:
864855
LOG(ERROR, "Failed to retrieve/execute request from qrexec-client-vm");
865-
if (command)
866-
free(command);
856+
free(params);
867857
close(client_fd);
868858
}
869859

daemon/qrexec-daemon.c

+21-28
Original file line numberDiff line numberDiff line change
@@ -1412,55 +1412,48 @@ void handle_message_from_agent(void)
14121412
return;
14131413
}
14141414
case MSG_TRIGGER_SERVICE3: {
1415-
struct trigger_service_params3 untrusted_params3, params3;
1416-
size_t service_name_len = hdr.len - sizeof(untrusted_params3), nul_offset;
1417-
char *untrusted_service_name = malloc(service_name_len), *service_name = NULL;
1415+
struct trigger_service_params3 *untrusted_params3, *params3;
14181416

1419-
if (!untrusted_service_name)
1417+
untrusted_params3 = malloc(hdr.len);
1418+
if (!untrusted_params3)
14201419
handle_vchan_error("malloc(service_name)");
14211420

1422-
if (libvchan_recv(vchan, &untrusted_params3, sizeof(untrusted_params3))
1423-
!= sizeof(untrusted_params3)) {
1424-
free(untrusted_service_name);
1425-
handle_vchan_error("recv params3");
1426-
}
1427-
if (libvchan_recv(vchan, untrusted_service_name, service_name_len)
1428-
!= (int)service_name_len) {
1429-
free(untrusted_service_name);
1421+
if (libvchan_recv(vchan, untrusted_params3, hdr.len)
1422+
!= (int)hdr.len) {
1423+
free(untrusted_params3);
14301424
handle_vchan_error("recv params3(service_name)");
14311425
}
1432-
service_name_len -= 1;
1426+
size_t const service_name_len = hdr.len - sizeof(*untrusted_params3) - 1;
14331427

14341428
/* sanitize start */
1435-
ENSURE_NULL_TERMINATED(untrusted_params3.target_domain);
1436-
sanitize_name(untrusted_params3.target_domain, "@:");
1437-
if (!validate_request_id(&untrusted_params3.request_id, "MSG_TRIGGER_SERVICE3"))
1429+
ENSURE_NULL_TERMINATED(untrusted_params3->target_domain);
1430+
sanitize_name(untrusted_params3->target_domain, "@:");
1431+
if (!validate_request_id(&untrusted_params3->request_id, "MSG_TRIGGER_SERVICE3"))
14381432
goto fail3;
1439-
params3 = untrusted_params3;
1440-
if (untrusted_service_name[service_name_len] != 0) {
1433+
if (untrusted_params3->service_name[service_name_len] != 0) {
14411434
LOG(ERROR, "Service name not NUL-terminated");
14421435
goto fail3;
14431436
}
1444-
nul_offset = strlen(untrusted_service_name);
1437+
size_t const nul_offset = strlen(untrusted_params3->service_name);
14451438
if (nul_offset != service_name_len) {
14461439
LOG(ERROR, "Service name contains NUL byte at offset %zu", nul_offset);
14471440
goto fail3;
14481441
}
1449-
if (!validate_service_name(untrusted_service_name))
1442+
if (!validate_service_name(untrusted_params3->service_name))
14501443
goto fail3;
1451-
service_name = untrusted_service_name;
1452-
untrusted_service_name = NULL;
1444+
params3 = untrusted_params3;
1445+
untrusted_params3 = NULL;
14531446
/* sanitize end */
14541447

14551448
handle_execute_service(remote_domain_id, remote_domain_name,
1456-
params3.target_domain,
1457-
service_name,
1458-
&params3.request_id);
1459-
free(service_name);
1449+
params3->target_domain,
1450+
params3->service_name,
1451+
&params3->request_id);
1452+
free(params3);
14601453
return;
14611454
fail3:
1462-
send_service_refused(vchan, &untrusted_params3.request_id);
1463-
free(untrusted_service_name);
1455+
send_service_refused(vchan, &untrusted_params3->request_id);
1456+
free(untrusted_params3);
14641457
return;
14651458
}
14661459
case MSG_CONNECTION_TERMINATED:

libqrexec/qrexec.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ struct trigger_service_params {
139139
struct trigger_service_params3 {
140140
char target_domain[64]; /* null terminated ASCII string */
141141
struct service_params request_id; /* service request id */
142-
// char service_name[0]; /* null terminated ASCII string, size = msg_header.len - sizeof(struct trigger_service_params3) */
142+
char service_name[]; /* null terminated ASCII string, size = msg_header.len - sizeof(struct trigger_service_params3) */
143143
};
144144

145145
struct peer_info {

0 commit comments

Comments
 (0)