int seccomp_filters_get_rst_pos(CoreEntry *core, int *count, unsigned long *pos) { SeccompFilter *sf = NULL; struct sock_fprog *arr = NULL; void *filter_data = NULL; int ret = -1, i; size_t filter_size = 0; if (!core->tc->has_seccomp_filter) { *count = 0; return 0; } *count = 0; *pos = rst_mem_cpos(RM_PRIVATE); BUG_ON(core->tc->seccomp_filter > se->n_seccomp_filters); sf = se->seccomp_filters[core->tc->seccomp_filter]; while (1) { (*count)++; filter_size += sf->filter.len; if (!sf->has_prev) break; sf = se->seccomp_filters[sf->prev]; } arr = rst_mem_alloc(sizeof(struct sock_fprog) * (*count) + filter_size, RM_PRIVATE); if (!arr) goto out; filter_data = &arr[*count]; sf = se->seccomp_filters[core->tc->seccomp_filter]; for (i = 0; i < *count; i++) { struct sock_fprog *fprog = &arr[i]; BUG_ON(sf->filter.len % sizeof(struct sock_filter)); fprog->len = sf->filter.len / sizeof(struct sock_filter); memcpy(filter_data, sf->filter.data, sf->filter.len); filter_data += sf->filter.len; sf = se->seccomp_filters[sf->prev]; } ret = 0; out: seccomp_entry__free_unpacked(se, NULL); return ret; }
int prepare_shmem_restore(void) { rst_shmems = rst_mem_cpos(RM_SHREMAP); return 0; }