about summary refs log tree commit diff
path: root/extrace.c
diff options
context:
space:
mode:
authorLeah Neukirchen <leah@vuxu.org>2018-09-17 13:08:14 +0200
committerLeah Neukirchen <leah@vuxu.org>2018-09-17 13:08:14 +0200
commitfffd96ebd5148e1ac6e73250f06a132ab36443b6 (patch)
tree55aadcb631cf478578d06721953c31034d60cee8 /extrace.c
parent0dcdc241208ab35654a9261d5e1cfa7b49da3212 (diff)
downloadextrace-fffd96ebd5148e1ac6e73250f06a132ab36443b6.tar.gz
extrace-fffd96ebd5148e1ac6e73250f06a132ab36443b6.tar.xz
extrace-fffd96ebd5148e1ac6e73250f06a132ab36443b6.zip
extract: verify pid exists
Diffstat (limited to 'extrace.c')
-rw-r--r--extrace.c25
1 files changed, 24 insertions, 1 deletions
diff --git a/extrace.c b/extrace.c
index 24c5d84..e28a29c 100644
--- a/extrace.c
+++ b/extrace.c
@@ -443,6 +443,29 @@ handle_msg(struct cn_msg *cn_hdr)
 	}
 }
 
+static pid_t
+parse_pid(char *s)
+{
+	pid_t pid;
+	char *end;
+
+	errno = 0;
+	pid = strtol(s, &end, 10);
+	if (pid <= 0 || *end || errno != 0) {
+		fprintf(stderr, "extrace: %s: invalid process id\n", s);
+		exit(1);
+	}
+
+	errno = 0;
+	kill(pid, 0);
+	if (errno == ESRCH) {
+		fprintf(stderr, "extrace: %s: no such process\n", s);
+		exit(1);
+	}
+
+	return pid;
+}
+
 int
 main(int argc, char *argv[])
 {
@@ -465,7 +488,7 @@ main(int argc, char *argv[])
 		case 'e': show_env = 1; break;
 		case 'f': flat = 1; break;
 		case 'l': full_path = 1; break;
-		case 'p': parent = atoi(optarg); break;
+		case 'p': parent = parse_pid(optarg); break;
 		case 'q': show_args = 0; break;
 		case 't': show_exit = 1; break;
 		case 'o':