ea821e
From 756f8301d5f7959312bea3fa8865bb543d43fd50 Mon Sep 17 00:00:00 2001
ea821e
From: Karel Zak <kzak@redhat.com>
ea821e
Date: Wed, 8 Feb 2017 10:19:56 +0100
ea821e
Subject: [PATCH] su: properly clear child PID
ea821e
ea821e
Upstream: http://github.com/karelzak/util-linux/commit/dffab154d29a288aa171ff50263ecc8f2e14a891
ea821e
Addresses: https://bugzilla.redhat.com/show_bug.cgi?id=1419474
ea821e
Signed-off-by: Karel Zak <kzak@redhat.com>
ea821e
---
ea821e
 login-utils/su-common.c | 25 +++++++++++++++----------
ea821e
 1 file changed, 15 insertions(+), 10 deletions(-)
ea821e
ea821e
diff --git a/login-utils/su-common.c b/login-utils/su-common.c
ea821e
index d53d690..9b3cad5 100644
ea821e
--- a/login-utils/su-common.c
ea821e
+++ b/login-utils/su-common.c
ea821e
@@ -357,21 +357,26 @@ create_watching_parent (void)
ea821e
 	    break;
ea821e
 	}
ea821e
       if (pid != (pid_t)-1)
ea821e
-	if (WIFSIGNALED (status))
ea821e
-	  {
ea821e
-            fprintf (stderr, "%s%s\n", strsignal (WTERMSIG (status)),
ea821e
-                     WCOREDUMP (status) ? _(" (core dumped)") : "");
ea821e
-            status = WTERMSIG (status) + 128;
ea821e
-	  }
ea821e
-	else
ea821e
-	  status = WEXITSTATUS (status);
ea821e
+	{
ea821e
+	  if (WIFSIGNALED (status))
ea821e
+	    {
ea821e
+	      fprintf (stderr, "%s%s\n", strsignal (WTERMSIG (status)),
ea821e
+                       WCOREDUMP (status) ? _(" (core dumped)") : "");
ea821e
+	      status = WTERMSIG (status) + 128;
ea821e
+	    }
ea821e
+	  else
ea821e
+	    status = WEXITSTATUS (status);
ea821e
+
ea821e
+          /* child is gone, don't use the PID anymore */
ea821e
+          child = (pid_t) -1;
ea821e
+	}
ea821e
       else
ea821e
 	status = 1;
ea821e
     }
ea821e
   else
ea821e
     status = 1;
ea821e
 
ea821e
-  if (caught_signal)
ea821e
+  if (caught_signal && child != (pid_t)-1)
ea821e
     {
ea821e
       fprintf (stderr, _("\nSession terminated, killing shell..."));
ea821e
       kill (child, SIGTERM);
ea821e
@@ -379,7 +384,7 @@ create_watching_parent (void)
ea821e
 
ea821e
   cleanup_pam (PAM_SUCCESS);
ea821e
 
ea821e
-  if (caught_signal)
ea821e
+  if (caught_signal && (child != (pid_t)-1))
ea821e
     {
ea821e
       sleep (2);
ea821e
       kill (child, SIGKILL);
ea821e
-- 
ea821e
2.7.4
ea821e