qrexec: provide common function for handling service call
Reduce code duplication by moving parsing of "QUBESRPC" magic command to one place. Call qubes-rpc-multiplexer directly with execve(), to avoid string expansions in its parameters.
This commit is contained in:
parent
ff2e2dbc22
commit
50412a8a8f
@ -24,6 +24,8 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "qrexec.h"
|
||||||
#include "libqrexec-utils.h"
|
#include "libqrexec-utils.h"
|
||||||
|
|
||||||
static do_exec_t *exec_func = NULL;
|
static do_exec_t *exec_func = NULL;
|
||||||
@ -31,6 +33,29 @@ void register_exec_func(do_exec_t *func) {
|
|||||||
exec_func = func;
|
exec_func = func;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void exec_qubes_rpc_if_requested(char *prog, char *const envp[]) {
|
||||||
|
/* avoid calling qubes-rpc-multiplexer through shell */
|
||||||
|
if (strncmp(prog, RPC_REQUEST_COMMAND, RPC_REQUEST_COMMAND_LEN) == 0) {
|
||||||
|
char *tok;
|
||||||
|
char *argv[16]; // right now 6 are used, but allow future extensions
|
||||||
|
size_t i = 0;
|
||||||
|
|
||||||
|
tok=strtok(prog, " ");
|
||||||
|
do {
|
||||||
|
if (i >= sizeof(argv)/sizeof(argv[0])-1) {
|
||||||
|
fprintf(stderr, "To many arguments to %s\n", RPC_REQUEST_COMMAND);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
argv[i++] = tok;
|
||||||
|
} while ((tok=strtok(NULL, " ")));
|
||||||
|
argv[i] = NULL;
|
||||||
|
argv[0] = QUBES_RPC_MULTIPLEXER_PATH;
|
||||||
|
execve(QUBES_RPC_MULTIPLEXER_PATH, argv, envp);
|
||||||
|
perror("exec qubes-rpc-multiplexer");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void fix_fds(int fdin, int fdout, int fderr)
|
void fix_fds(int fdin, int fdout, int fderr)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
@ -68,7 +93,7 @@ void do_fork_exec(const char *cmdline, int *pid, int *stdin_fd, int *stdout_fd,
|
|||||||
fix_fds(inpipe[0], outpipe[1], 2);
|
fix_fds(inpipe[0], outpipe[1], 2);
|
||||||
|
|
||||||
if (exec_func != NULL)
|
if (exec_func != NULL)
|
||||||
exec_func(cmdline);
|
exec_func((char*)cmdline);
|
||||||
exit(-1);
|
exit(-1);
|
||||||
default:;
|
default:;
|
||||||
}
|
}
|
||||||
|
@ -33,8 +33,14 @@ struct buffer {
|
|||||||
#define WRITE_STDIN_BUFFERED 1 /* something still in the buffer */
|
#define WRITE_STDIN_BUFFERED 1 /* something still in the buffer */
|
||||||
#define WRITE_STDIN_ERROR 2 /* write error, errno set */
|
#define WRITE_STDIN_ERROR 2 /* write error, errno set */
|
||||||
|
|
||||||
typedef void (do_exec_t)(const char *);
|
typedef void (do_exec_t)(char *);
|
||||||
void register_exec_func(do_exec_t *func);
|
void register_exec_func(do_exec_t *func);
|
||||||
|
/*
|
||||||
|
* exec() qubes-rpc-multiplexer if *prog* starts with magic "QUBESRPC" keyword,
|
||||||
|
* do not return in that case; pass *envp* to execve() as en environment
|
||||||
|
* otherwise, return false without any action
|
||||||
|
*/
|
||||||
|
void exec_qubes_rpc_if_requested(char *prog, char *const envp[]);
|
||||||
|
|
||||||
void buffer_init(struct buffer *b);
|
void buffer_init(struct buffer *b);
|
||||||
void buffer_free(struct buffer *b);
|
void buffer_free(struct buffer *b);
|
||||||
|
Loading…
Reference in New Issue
Block a user