From: Karel Zak Date: Wed, 16 Aug 2017 12:03:06 +0000 (+0200) Subject: su: make wait_for_child() usable in arbitrary situation X-Git-Tag: v2.31-rc1~35 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b55e712816f11626d4ae466742bbf0ff0b405310;p=thirdparty%2Futil-linux.git su: make wait_for_child() usable in arbitrary situation For example if called more than once; to keep PTY code simple and robust. Signed-off-by: Karel Zak --- diff --git a/login-utils/su-common.c b/login-utils/su-common.c index 48812cbc11..f4e11dd2d8 100644 --- a/login-utils/su-common.c +++ b/login-utils/su-common.c @@ -334,21 +334,23 @@ static void supam_open_session(struct su_context *su) static int wait_for_child(struct su_context *su) { - pid_t pid; + pid_t pid = (pid_t) -1;; int status = 0; - DBG(SIG, ul_debug("waiting for child [%d]...", su->child)); - for (;;) { - pid = waitpid(su->child, &status, WUNTRACED); - - if (pid != (pid_t) - 1 && WIFSTOPPED(status)) { - kill(getpid(), SIGSTOP); - /* once we get here, we must have resumed */ - kill(pid, SIGCONT); - } else - break; + if (su->child != (pid_t) -1) { + DBG(SIG, ul_debug("waiting for child [%d]...", su->child)); + for (;;) { + pid = waitpid(su->child, &status, WUNTRACED); + + if (pid != (pid_t) - 1 && WIFSTOPPED(status)) { + kill(getpid(), SIGSTOP); + /* once we get here, we must have resumed */ + kill(pid, SIGCONT); + } else + break; + } } - if (pid != (pid_t) - 1) { + if (pid != (pid_t) -1) { if (WIFSIGNALED(status)) { fprintf(stderr, "%s%s\n", strsignal(WTERMSIG(status)),