[CRIU] [PATCH 3/4] remap: add a dead pid /proc remap
Pavel Emelyanov
xemul at parallels.com
Fri Sep 19 06:47:21 PDT 2014
I've pushed the changes, looked at them and found 2 bugs :)
> @@ -516,6 +550,20 @@ static int dump_linked_remap(char *path, int len, const struct stat *ost,
> &rpe, PB_REMAP_FPATH);
> }
>
> +static int dump_dead_process_remap(pid_t pid, char *path, int len, const struct stat *ost,
> + int lfd, u32 id, struct ns_id *nsid)
> +{
> + RemapFilePathEntry rpe = REMAP_FILE_PATH_ENTRY__INIT;
> +
> + rpe.orig_id = id;
> + rpe.remap_id = pid;
> + rpe.has_remap_type = true;
> + rpe.remap_type = REMAP_TYPE__PROCFS;
This code would produce duplicate entries if equal dead pids are
opened by more than one file.
> +
> + return pb_write_one(fdset_fd(glob_fdset, CR_FD_REMAP_FPATH),
> + &rpe, PB_REMAP_FPATH);
> +}
> +
> static bool is_sillyrename_name(char *name)
> {
> int i;
> @@ -557,6 +605,38 @@ static int check_path_remap(char *rpath, int plen, const struct fd_parms *parms,
> struct stat pst;
> const struct stat *ost = &parms->stat;
>
> + if (parms->fs_type == PROC_SUPER_MAGIC) {
> + /* The file points to /proc/pid/<foo> where pid is a dead
> + * process. We remap this file by adding this pid to be
> + * fork()ed into a TASK_HELPER state so that we can point to it
> + * on restore.
> + */
> + pid_t pid;
> + char *start, *end;
> +
> + /* skip "./proc/" */
> + start = strstr(rpath, "/") + 1;
> + if (!start)
> + return -1;
> + start = strstr(start, "/") + 1;
> + if (!start)
> + return -1;
> + pid = strtol(start, &end, 10);
> +
> + /* if we didn't find another /, this path something
> + * like ./proc/kmsg, which we shouldn't mess with. */
> + if (*end == '/') {
> + *end = 0;
> + ret = access(rpath, F_OK);
> + *end = '/';
> +
> + if (ret) {
> + pr_info("Dumping dead process remap of %d\n", pid);
> + return dump_dead_process_remap(pid, rpath + 1, plen - 1, ost, lfd, id, nsid);
> + }
> + }
On these else branches we would go and execute the rest of the
remap code, while we shouldn't.
> + }
> +
> if (ost->st_nlink == 0)
> /*
> * Unpleasant, but easy case. File is completely invisible
More information about the CRIU
mailing list