int collect_shmem(int pid, VmaEntry *vi) { unsigned long size = vi->pgoff + vi->end - vi->start; struct shmem_info *si; si = find_shmem_by_id(vi->shmid); if (si) { if (si->size < size) si->size = size; si->count++; /* * Only the shared mapping with a lowest * pid will be created in real, other processes * will wait until the kernel propagate this mapping * into /proc */ if (!pid_rst_prio(pid, si->pid)) { if (si->pid == pid) si->self_count++; return 0; } si->pid = pid; si->start = vi->start; si->end = vi->end; si->self_count = 1; return 0; } si = rst_mem_alloc(sizeof(struct shmem_info), RM_SHREMAP); if (!si) return -1; pr_info("Add new shmem 0x%"PRIx64" (0x%016"PRIx64"-0x%016"PRIx64")\n", vi->shmid, vi->start, vi->end); si->start = vi->start; si->end = vi->end; si->shmid = vi->shmid; si->pid = pid; si->size = size; si->fd = -1; si->count = 1; si->self_count = 1; nr_shmems++; futex_init(&si->lock); return 0; }
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; }