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) {
