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) ...@@ -548,6 +548,9 @@ static int restore_one_alive_task(int pid, CoreEntry *core)
if (prepare_timerfds(ta)) if (prepare_timerfds(ta))
return -1; return -1;
if (seccomp_filters_get_rst_pos(core, ta) < 0)
return -1;
return sigreturn_restore(pid, ta_cp, core); return sigreturn_restore(pid, ta_cp, core);
} }
...@@ -2679,8 +2682,6 @@ static int sigreturn_restore(pid_t pid, unsigned long ta_cp, CoreEntry *core) ...@@ -2679,8 +2682,6 @@ static int sigreturn_restore(pid_t pid, unsigned long ta_cp, CoreEntry *core)
#ifdef CONFIG_VDSO #ifdef CONFIG_VDSO
unsigned long vdso_rt_size = 0; unsigned long vdso_rt_size = 0;
#endif #endif
int n_seccomp_filters = 0;
unsigned long seccomp_filter_pos = 0;
struct vm_area_list self_vmas; struct vm_area_list self_vmas;
struct vm_area_list *vmas = &rsti(current)->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) ...@@ -2713,9 +2714,6 @@ static int sigreturn_restore(pid_t pid, unsigned long ta_cp, CoreEntry *core)
if (ret < 0) if (ret < 0)
goto err; goto err;
if (seccomp_filters_get_rst_pos(core, &n_seccomp_filters, &seccomp_filter_pos) < 0)
goto err;
rst_mem_size = rst_mem_lock(); rst_mem_size = rst_mem_lock();
memzone_size = round_up(sizeof(struct restore_mem_zone) * current->nr_threads, page_size()); memzone_size = round_up(sizeof(struct restore_mem_zone) * current->nr_threads, page_size());
restore_bootstrap_len = restorer_len + memzone_size + rst_mem_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) ...@@ -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->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->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->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 { \ #define remap_array(name, nr, cpos) do { \
task_args->name##_n = nr; \ task_args->name##_n = nr; \
task_args->name = rst_mem_remap_ptr(cpos, RM_PRIVATE); \ task_args->name = rst_mem_remap_ptr(cpos, RM_PRIVATE); \
} while (0) } while (0)
remap_array(seccomp_filters, n_seccomp_filters, seccomp_filter_pos);
#undef remap_array #undef remap_array
if (core->tc->has_seccomp_mode) if (core->tc->has_seccomp_mode)
......
...@@ -28,5 +28,6 @@ ...@@ -28,5 +28,6 @@
extern int collect_seccomp_filters(void); extern int collect_seccomp_filters(void);
extern int prepare_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 #endif
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "pstree.h" #include "pstree.h"
#include "ptrace.h" #include "ptrace.h"
#include "proc_parse.h" #include "proc_parse.h"
#include "restorer.h"
#include "seccomp.h" #include "seccomp.h"
#include "servicefd.h" #include "servicefd.h"
#include "util.h" #include "util.h"
...@@ -216,28 +217,26 @@ int prepare_seccomp_filters(void) ...@@ -216,28 +217,26 @@ int prepare_seccomp_filters(void)
return 0; 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; SeccompFilter *sf = NULL;
struct sock_fprog *arr = NULL; struct sock_fprog *arr = NULL;
void *filter_data = NULL; void *filter_data = NULL;
int ret = -1, i; int ret = -1, i, n_filters;
size_t filter_size = 0; size_t filter_size = 0;
if (!core->tc->has_seccomp_filter) { ta->seccomp_filters_n = 0;
*count = 0;
if (!core->tc->has_seccomp_filter)
return 0; return 0;
}
*count = 0; ta->seccomp_filters = (struct sock_fprog *)rst_mem_align_cpos(RM_PRIVATE);
*pos = rst_mem_align_cpos(RM_PRIVATE);
BUG_ON(core->tc->seccomp_filter > se->n_seccomp_filters); BUG_ON(core->tc->seccomp_filter > se->n_seccomp_filters);
sf = se->seccomp_filters[core->tc->seccomp_filter]; sf = se->seccomp_filters[core->tc->seccomp_filter];
while (1) { while (1) {
(*count)++; ta->seccomp_filters_n++;
filter_size += sf->filter.len; filter_size += sf->filter.len;
if (!sf->has_prev) if (!sf->has_prev)
...@@ -246,13 +245,14 @@ int seccomp_filters_get_rst_pos(CoreEntry *core, int *count, unsigned long *pos) ...@@ -246,13 +245,14 @@ int seccomp_filters_get_rst_pos(CoreEntry *core, int *count, unsigned long *pos)
sf = se->seccomp_filters[sf->prev]; 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) if (!arr)
goto out; goto out;
filter_data = &arr[*count]; filter_data = &arr[n_filters];
sf = se->seccomp_filters[core->tc->seccomp_filter]; 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]; struct sock_fprog *fprog = &arr[i];
BUG_ON(sf->filter.len % sizeof(struct sock_filter)); 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