Make set_cloexec_flag abort on error
set_cloexec_flag() may fail only if we pass it a bad fd,
such as -1 or non-opened one. If we do, we have a bug
in the caller. It makes no sense to try to continue
running when we detect such a blatant bug in our own code.
* strace (set_cloexec_flag): Abort instead of returning error
indicator. Change function to return void.
(strace_fopen): Remove error check on set_cloexec_flag return value.
(proc_open): Likewise.
(proc_poll_open): Likewise.
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
diff --git a/strace.c b/strace.c
index 4c91e51..d353eac 100644
--- a/strace.c
+++ b/strace.c
@@ -285,30 +285,26 @@
# define fork() vfork()
#endif
-static int
+static void
set_cloexec_flag(int fd)
{
- int flags, newflags;
+ int flags, newflags;
- if ((flags = fcntl(fd, F_GETFD, 0)) < 0)
- {
- fprintf(stderr, "%s: fcntl F_GETFD: %s\n",
- progname, strerror(errno));
- return -1;
+ flags = fcntl(fd, F_GETFD);
+ if (flags < 0) {
+ /* Can happen only if fd is bad.
+ * Should never happen: if it does, we have a bug
+ * in the caller. Therefore we just abort
+ * instead of propagating the error.
+ */
+ perror_msg_and_die("fcntl(%d, F_GETFD)", fd);
}
newflags = flags | FD_CLOEXEC;
if (flags == newflags)
- return 0;
+ return;
- if (fcntl(fd, F_SETFD, newflags) < 0)
- {
- fprintf(stderr, "%s: fcntl F_SETFD: %s\n",
- progname, strerror(errno));
- return -1;
- }
-
- return 0;
+ fcntl(fd, F_SETFD, newflags); /* never fails */
}
/*
@@ -346,11 +342,8 @@
fprintf(stderr, "%s: can't fopen '%s': %s\n",
progname, path, strerror(errno));
swap_uid();
- if (fp && set_cloexec_flag(fileno(fp)) < 0)
- {
- fclose(fp);
- fp = NULL;
- }
+ if (fp)
+ set_cloexec_flag(fileno(fp));
return fp;
}
@@ -1287,25 +1280,19 @@
perror("strace: open(\"/proc/...\", ...)");
return -1;
}
- if (set_cloexec_flag(tcp->pfd) < 0) {
- return -1;
- }
+ set_cloexec_flag(tcp->pfd);
sprintf(proc, "/proc/%d/status", tcp->pid);
if ((tcp->pfd_stat = open(proc, O_RDONLY|O_EXCL)) < 0) {
perror("strace: open(\"/proc/...\", ...)");
return -1;
}
- if (set_cloexec_flag(tcp->pfd_stat) < 0) {
- return -1;
- }
+ set_cloexec_flag(tcp->pfd_stat);
sprintf(proc, "/proc/%d/as", tcp->pid);
if ((tcp->pfd_as = open(proc, O_RDONLY|O_EXCL)) < 0) {
perror("strace: open(\"/proc/...\", ...)");
return -1;
}
- if (set_cloexec_flag(tcp->pfd_as) < 0) {
- return -1;
- }
+ set_cloexec_flag(tcp->pfd_as);
#else
/* Open the process pseudo-file in /proc. */
#ifndef FREEBSD
@@ -1319,9 +1306,7 @@
perror("strace: open(\"/proc/...\", ...)");
return -1;
}
- if (set_cloexec_flag(tcp->pfd) < 0) {
- return -1;
- }
+ set_cloexec_flag(tcp->pfd);
#endif
#ifdef FREEBSD
sprintf(proc, "/proc/%d/regs", tcp->pid);
@@ -1931,9 +1916,7 @@
exit(1);
}
for (i = 0; i < 2; i++) {
- if (set_cloexec_flag(proc_poll_pipe[i]) < 0) {
- exit(1);
- }
+ set_cloexec_flag(proc_poll_pipe[i]);
}
}