static int open_socket_map(int pid, struct vma_area *vm) { VmaEntry *vma = vm->e; struct file_desc *fd; struct fdinfo_list_entry *le; pr_info("Getting packet socket fd for %d:%x\n", pid, (int)vma->shmid); fd = find_file_desc_raw(FD_TYPES__PACKETSK, vma->shmid); if (!fd) { pr_err("No packet socket %x\n", (int)vma->shmid); return -1; } list_for_each_entry(le, &fd->fd_info_head, desc_list) if (le->pid == pid) { int fd; /* * Restorer will close the mmap-ed fd */ fd = dup(le->fe->fd); if (!fd) { pr_perror("Can't dup packet sk"); return -1; } vma->fd = fd; return 0; } pr_err("No open packet socket %x by %d\n", (int)vma->shmid, pid); return -1; }
static int collect_remap_linked(struct reg_file_info *rfi, RemapFilePathEntry *rfe) { struct file_remap *rm; struct file_desc *rdesc; struct reg_file_info *rrfi; rdesc = find_file_desc_raw(FD_TYPES__REG, rfe->remap_id); if (!rdesc) { pr_err("Can't find target file %x\n", rfe->remap_id); return -1; } rm = xmalloc(sizeof(*rm)); if (!rm) return -1; rrfi = container_of(rdesc, struct reg_file_info, d); pr_info("Remapped %s -> %s\n", rfi->path, rrfi->path); rm->rpath = rrfi->path; rm->is_dir = false; rm->uid = -1; rm->gid = -1; rm->rmnt_id = rfi->rfe->mnt_id; rfi->remap = rm; return 0; }
static int open_remap_linked(struct reg_file_info *rfi, RemapFilePathEntry *rfe) { struct file_remap *rm; struct file_desc *rdesc; struct reg_file_info *rrfi; uid_t owner = -1; rdesc = find_file_desc_raw(FD_TYPES__REG, rfe->remap_id); if (!rdesc) { pr_err("Can't find target file %x\n", rfe->remap_id); return -1; } rm = xmalloc(sizeof(*rm)); if (!rm) return -1; rrfi = container_of(rdesc, struct reg_file_info, d); pr_info("Remapped %s -> %s\n", rfi->path, rrfi->path); if (root_ns_mask & CLONE_NEWUSER) { int rfd; struct stat st; rfd = mntns_get_root_by_mnt_id(rfi->rfe->mnt_id); if (fstatat(rfd, rrfi->path, &st, AT_SYMLINK_NOFOLLOW)) { pr_perror("Can't get owner of link remap %s", rrfi->path); xfree(rm); return -1; } owner = st.st_uid; } rm->rpath = rrfi->path; rm->users = 0; rm->is_dir = false; rm->owner = owner; rm->rmnt_id = rfi->rfe->mnt_id; rfi->remap = rm; return 0; }