From be79f38d6cb62757cdabf3ed62ff50d9792efa9f Mon Sep 17 00:00:00 2001 From: Pavel Emelyanov Date: Mon, 10 Dec 2012 15:50:47 +0300 Subject: [PATCH] pstree: Sanitize pstree preparation code We have 3 calls for that, two called directly from cr-restore, one -- from one the former. Clean this mess and write short comments on each stage. Signed-off-by: Pavel Emelyanov --- cr-restore.c | 3 --- include/pstree.h | 1 - pstree.c | 27 +++++++++++++++++++++++---- 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/cr-restore.c b/cr-restore.c index 3be05dde2..0935db067 100644 --- a/cr-restore.c +++ b/cr-restore.c @@ -1250,9 +1250,6 @@ int cr_restore_tasks(pid_t pid, struct cr_options *opts) if (prepare_pstree() < 0) return -1; - if (prepare_pstree_ids() < 0) - return -1; - if (crtools_prepare_shared() < 0) return -1; diff --git a/include/pstree.h b/include/pstree.h index 8536844a4..6efd8f714 100644 --- a/include/pstree.h +++ b/include/pstree.h @@ -55,7 +55,6 @@ extern struct pstree_item *pstree_item_next(struct pstree_item *item); extern bool restore_before_setsid(struct pstree_item *child); extern int prepare_pstree(void); -extern int prepare_pstree_ids(void); extern int dump_pstree(struct pstree_item *root_item); diff --git a/pstree.c b/pstree.c index 7ec6c68ac..df8eff332 100644 --- a/pstree.c +++ b/pstree.c @@ -175,7 +175,7 @@ static int prepare_pstree_for_shell_job(struct pstree_item *root) return 0; } -int prepare_pstree(void) +static int read_pstree_image(void) { int ret = 0, i, ps_fd; struct pstree_item *pi, *parent = NULL; @@ -261,14 +261,12 @@ int prepare_pstree(void) pstree_entry__free_unpacked(e, NULL); } - - ret = prepare_pstree_for_shell_job(root_item); err: close(ps_fd); return ret; } -int prepare_pstree_ids(void) +static int prepare_pstree_ids(void) { struct pstree_item *item, *child, *helper, *tmp; LIST_HEAD(helpers); @@ -427,6 +425,27 @@ int prepare_pstree_ids(void) return 0; } +int prepare_pstree(void) +{ + int ret; + + ret = read_pstree_image(); + if (!ret) + /* + * Shell job may inherit sid/pgid from the current + * shell, not from image. Set things up for this. + */ + ret = prepare_pstree_for_shell_job(root_item); + if (!ret) + /* + * Session/Group leaders might be dead. Need to fix + * pstree with properly injected helper tasks. + */ + ret = prepare_pstree_ids(); + + return ret; +} + bool restore_before_setsid(struct pstree_item *child) { int csid = child->born_sid == -1 ? child->sid : child->born_sid;