misc-progs: setuid: Return exit code from called process

Message ID 20230524090841.269580-1-michael.tremer@ipfire.org
State Accepted
Commit ed1a24686c9a9255290906a8c7bd1cedd7934cdc
Headers
Series misc-progs: setuid: Return exit code from called process |

Commit Message

Michael Tremer May 24, 2023, 9:08 a.m. UTC
  This patch will return the exit code from the called process which has
not been done before. This made it more difficult to catch any
unsuccessful calls from the web UI.

Partly Fixes: #12863
Tested-by: Jon Murphy <jon.murphy@ipfire.org>
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
---
 src/misc-progs/setuid.c | 22 +++++++++++++---------
 1 file changed, 13 insertions(+), 9 deletions(-)
  

Patch

diff --git a/src/misc-progs/setuid.c b/src/misc-progs/setuid.c
index 17b0e7066..9dc0a767b 100644
--- a/src/misc-progs/setuid.c
+++ b/src/misc-progs/setuid.c
@@ -104,16 +104,20 @@  static int system_core(char* command, char** args, uid_t uid, gid_t gid, char *e
 		}
 
 		default: /* parent */
-			do {
-				if (waitpid(pid, &status, 0) == -1) {
-					if (errno != EINTR)
-						return -1;
-					} else {
-						return status;
-					}
-			} while (1);
-	}
+			// Wait until the child process has finished
+			waitpid(pid, &status, 0);
+
+			// The child was terminated by a signal
+			if (WIFSIGNALED(status))
+				 return 128 + WTERMSIG(status);
 
+			// Return the exit code if available
+			if (WIFEXITED(status))
+				return WEXITSTATUS(status);
+
+			// Something unexpected happened, exiting with error
+			return EXIT_FAILURE;
+	}
 }
 
 int run(char* command, char** argv) {