Commit 02853f0a authored by Pavel Emelyanov's avatar Pavel Emelyanov

restore: Prepare on-restorer seccomp filters earlier

Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
Reviewed-by: 's avatarCyrill Gorcunov <gorcunov@openvz.org>
parent c978930d
......@@ -548,6 +548,9 @@ static int restore_one_alive_task(int pid, CoreEntry *core)
if (prepare_timerfds(ta))
return -1;
if (seccomp_filters_get_rst_pos(core, ta) < 0)
return -1;
return sigreturn_restore(pid, ta_cp, core);
}
......@@ -2679,8 +2682,6 @@ static int sigreturn_restore(pid_t pid, unsigned long ta_cp, CoreEntry *core)
#ifdef CONFIG_VDSO
unsigned long vdso_rt_size = 0;
#endif
int n_seccomp_filters = 0;
unsigned long seccomp_filter_pos = 0;
struct vm_area_list self_vmas;
struct vm_area_list *vmas = &rsti(current)->vmas;
......@@ -2713,9 +2714,6 @@ static int sigreturn_restore(pid_t pid, unsigned long ta_cp, CoreEntry *core)
if (ret < 0)
goto err;
if (seccomp_filters_get_rst_pos(core, &n_seccomp_filters, &seccomp_filter_pos) < 0)
goto err;
rst_mem_size = rst_mem_lock();
memzone_size = round_up(sizeof(struct restore_mem_zone) * current->nr_threads, page_size());
restore_bootstrap_len = restorer_len + memzone_size + rst_mem_size;
......@@ -2831,14 +2829,13 @@ static int sigreturn_restore(pid_t pid, unsigned long ta_cp, CoreEntry *core)
task_args->rlims = rst_mem_remap_ptr((unsigned long)task_args->rlims, RM_PRIVATE);
task_args->helpers = rst_mem_remap_ptr((unsigned long)task_args->helpers, RM_PRIVATE);
task_args->zombies = rst_mem_remap_ptr((unsigned long)task_args->zombies, RM_PRIVATE);
task_args->seccomp_filters = rst_mem_remap_ptr((unsigned long)task_args->seccomp_filters, RM_PRIVATE);
#define remap_array(name, nr, cpos) do { \
task_args->name##_n = nr; \
task_args->name = rst_mem_remap_ptr(cpos, RM_PRIVATE); \
} while (0)
remap_array(seccomp_filters, n_seccomp_filters, seccomp_filter_pos);
#undef remap_array
if (core->tc->has_seccomp_mode)
......
......@@ -28,5 +28,6 @@
extern int collect_seccomp_filters(void);
extern int prepare_seccomp_filters(void);
extern int seccomp_filters_get_rst_pos(CoreEntry *item, int *count, unsigned long *pos);
struct task_restore_args;
extern int seccomp_filters_get_rst_pos(CoreEntry *item, struct task_restore_args *);
#endif
......@@ -9,6 +9,7 @@
#include "pstree.h"
#include "ptrace.h"
#include "proc_parse.h"
#include "restorer.h"
#include "seccomp.h"
#include "servicefd.h"
#include "util.h"
......@@ -216,28 +217,26 @@ int prepare_seccomp_filters(void)
return 0;
}
int seccomp_filters_get_rst_pos(CoreEntry *core, int *count, unsigned long *pos)
int seccomp_filters_get_rst_pos(CoreEntry *core, struct task_restore_args *ta)
{
SeccompFilter *sf = NULL;
struct sock_fprog *arr = NULL;
void *filter_data = NULL;
int ret = -1, i;
int ret = -1, i, n_filters;
size_t filter_size = 0;
if (!core->tc->has_seccomp_filter) {
*count = 0;
ta->seccomp_filters_n = 0;
if (!core->tc->has_seccomp_filter)
return 0;
}
*count = 0;
*pos = rst_mem_align_cpos(RM_PRIVATE);
ta->seccomp_filters = (struct sock_fprog *)rst_mem_align_cpos(RM_PRIVATE);
BUG_ON(core->tc->seccomp_filter > se->n_seccomp_filters);
sf = se->seccomp_filters[core->tc->seccomp_filter];
while (1) {
(*count)++;
ta->seccomp_filters_n++;
filter_size += sf->filter.len;
if (!sf->has_prev)
......@@ -246,13 +245,14 @@ int seccomp_filters_get_rst_pos(CoreEntry *core, int *count, unsigned long *pos)
sf = se->seccomp_filters[sf->prev];
}
arr = rst_mem_alloc(sizeof(struct sock_fprog) * (*count) + filter_size, RM_PRIVATE);
n_filters = ta->seccomp_filters_n;
arr = rst_mem_alloc(sizeof(struct sock_fprog) * n_filters + filter_size, RM_PRIVATE);
if (!arr)
goto out;
filter_data = &arr[*count];
filter_data = &arr[n_filters];
sf = se->seccomp_filters[core->tc->seccomp_filter];
for (i = 0; i < *count; i++) {
for (i = 0; i < n_filters; i++) {
struct sock_fprog *fprog = &arr[i];
BUG_ON(sf->filter.len % sizeof(struct sock_filter));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment