exile_launch(): Open another pipe to also write to child

This commit is contained in:
Albert S. 2022-01-16 21:18:10 +01:00
parent 0caff45600
commit ed54575b89
2 changed files with 40 additions and 17 deletions

45
exile.h
View File

@ -2009,10 +2009,12 @@ struct exile_launch_params
struct exile_launch_result struct exile_launch_result
{ {
int tid; int tid;
int fd; int read_fd;
int write_fd;
}; };
static int pipefds[2]; static int child_read_pipe[2];
static int child_write_pipe[2];
static int exile_clone_handle(void *arg) static int exile_clone_handle(void *arg)
{ {
@ -2023,10 +2025,11 @@ static int exile_clone_handle(void *arg)
if(ret != 0) if(ret != 0)
{ {
EXILE_LOG_ERROR("Failed to enable policy\n"); EXILE_LOG_ERROR("Failed to enable policy\n");
close(pipefds[1]); close(child_read_pipe[1]);
close(child_write_pipe[0]);
return 1; return 1;
} }
ret = dup2(pipefds[1], 1); ret = dup2(child_read_pipe[1], 1);
if(ret == -1) if(ret == -1)
{ {
EXILE_LOG_ERROR("Failed to redirect stdout to pipe\n"); EXILE_LOG_ERROR("Failed to redirect stdout to pipe\n");
@ -2034,7 +2037,8 @@ static int exile_clone_handle(void *arg)
} }
ret = params->func(params->funcarg); ret = params->func(params->funcarg);
fclose(stdout); fclose(stdout);
close(pipefds[1]); close(child_read_pipe[1]);
close(child_write_pipe[0]);
return ret; return ret;
} }
@ -2042,17 +2046,25 @@ static int exile_clone_handle(void *arg)
* *
* Creates a child-process, then activates the policy contained in launch_params, * Creates a child-process, then activates the policy contained in launch_params,
* and jumps to the specified function, passing the specified argument to it. * and jumps to the specified function, passing the specified argument to it.
* Returns a fd connected to stdout in the child process. * Returns a fd connected to stdout in the child process, as well as a fd allowing to write
* to the child.
*
* if cloneflags is 0, the default ones are passed to clone(), otherwise the value of cloneflags * if cloneflags is 0, the default ones are passed to clone(), otherwise the value of cloneflags
* *
* Return value: Negative on error, otherwise the file descriptor to read from*/ * Return value: Negative on error, otherwise the file descriptor to read from*/
int exile_launch(struct exile_launch_params *launch_params, struct exile_launch_result *launch_result) int exile_launch(struct exile_launch_params *launch_params, struct exile_launch_result *launch_result)
{ {
int ret = pipe(child_read_pipe);
int ret = pipe(pipefds);
if(ret != 0) if(ret != 0)
{ {
EXILE_LOG_ERROR("pipe failed\n"); EXILE_LOG_ERROR("read pipe creation failed\n");
return ret;
}
ret = pipe(child_write_pipe);
if(ret != 0)
{
EXILE_LOG_ERROR("write pipe creation failed\n");
return ret; return ret;
} }
@ -2077,9 +2089,12 @@ int exile_launch(struct exile_launch_params *launch_params, struct exile_launch_
EXILE_LOG_ERROR("clone failed(): %s\n", strerror(errno)); EXILE_LOG_ERROR("clone failed(): %s\n", strerror(errno));
return ret; return ret;
} }
close(pipefds[1]); close(child_read_pipe[1]);
close(child_write_pipe[0]);
launch_result->tid = ret; launch_result->tid = ret;
launch_result->fd = pipefds[0]; launch_result->read_fd = child_read_pipe[0];
launch_result->write_fd = child_write_pipe[1];
return 0; return 0;
} }
@ -2107,7 +2122,7 @@ char *exile_launch_get(struct exile_launch_params *launch_params, size_t *n)
while(1) while(1)
{ {
char buffer[4096]; char buffer[4096];
int ret = read(launch_result.fd, buffer, sizeof(buffer)); int ret = read(launch_result.read_fd, buffer, sizeof(buffer));
if(ret == 0) if(ret == 0)
{ {
break; break;
@ -2126,7 +2141,7 @@ char *exile_launch_get(struct exile_launch_params *launch_params, size_t *n)
if(ferror(stream)) if(ferror(stream))
{ {
/* TODO: can we seek and free? */ /* TODO: can we seek and free? */
close(launch_result.fd); close(launch_result.read_fd);
return NULL; return NULL;
} }
} }
@ -2136,10 +2151,10 @@ char *exile_launch_get(struct exile_launch_params *launch_params, size_t *n)
if(seek == -1) if(seek == -1)
{ {
EXILE_LOG_ERROR("fseek failed\n"); EXILE_LOG_ERROR("fseek failed\n");
close(launch_result.fd); close(launch_result.read_fd);
return NULL; return NULL;
} }
close(launch_result.fd); close(launch_result.read_fd);
*n = size; *n = size;
return result; return result;
} }

12
test.c
View File

@ -549,7 +549,10 @@ int do_launch_test(void *arg)
{ {
int num = *(int *)(arg); int num = *(int *)(arg);
num += 1; num += 1;
char buffer[512] = { 0 };
read(child_write_pipe[0], buffer, sizeof(buffer)-1);
printf("Sandboxed +1: %i\n", num); printf("Sandboxed +1: %i\n", num);
printf("Echoing: %s\n", buffer);
fflush(stdout); fflush(stdout);
return 0; return 0;
} }
@ -570,11 +573,16 @@ int test_launch()
return 1; return 1;
} }
char buffer[4096]; char buffer[4096] = { 0 };
int s = read(res.fd, buffer, sizeof(buffer)); write(res.write_fd, "1234", 4);
int s = read(res.read_fd, buffer, sizeof(buffer)-1);
write(1, buffer, s); write(1, buffer, s);
printf("Before wait, got: %i\n", s); printf("Before wait, got: %i\n", s);
fflush(stdout); fflush(stdout);
if(strstr(buffer, "Echoing: 1234") == NULL)
{
printf("Failed: Did not get back what we wrote\n");
}
int status = 0; int status = 0;
waitpid(res.tid, &status, __WALL); waitpid(res.tid, &status, __WALL);
if(WIFEXITED(status)) if(WIFEXITED(status))