diff options
author | Leah Neukirchen <leah@vuxu.org> | 2018-09-17 13:08:14 +0200 |
---|---|---|
committer | Leah Neukirchen <leah@vuxu.org> | 2018-09-17 13:08:14 +0200 |
commit | fffd96ebd5148e1ac6e73250f06a132ab36443b6 (patch) | |
tree | 55aadcb631cf478578d06721953c31034d60cee8 | |
parent | 0dcdc241208ab35654a9261d5e1cfa7b49da3212 (diff) | |
download | extrace-fffd96ebd5148e1ac6e73250f06a132ab36443b6.tar.gz extrace-fffd96ebd5148e1ac6e73250f06a132ab36443b6.tar.xz extrace-fffd96ebd5148e1ac6e73250f06a132ab36443b6.zip |
extract: verify pid exists
-rw-r--r-- | NEWS.md | 1 | ||||
-rw-r--r-- | extrace.c | 25 |
2 files changed, 25 insertions, 1 deletions
diff --git a/NEWS.md b/NEWS.md index 5d67ad4..90c972a 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,6 +1,7 @@ ## HEAD * pwait: detect and warn for non-existing PID. +* extract: detect and error for non-existing PID in `-p`. ## 0.6 (2018-06-19) 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': |