commit 06e2364496697e53a903409adb3fcf09926adb06
parent 5bd1a482d555bce8593f1d3f6b12cbb27884a7b4
Author: Christoph Lohmann <20h@r-36.net>
Date: Sun, 28 Oct 2018 17:26:27 +0100
Fix errno handling.
We sometimes need to save errno, because *printf functions overwrite it.
Thanks to Stéphane Goujet <stephane.goujet@wanadoo.fr> for the hint!
Diffstat:
main.c | | | 25 | +++++++++++++++++++++---- |
1 file changed, 21 insertions(+), 4 deletions(-)
diff --git a/main.c b/main.c
@@ -300,7 +300,7 @@ getlistenfd(struct addrinfo *hints, char *bindip, char *port)
char addstr[INET6_ADDRSTRLEN];
struct addrinfo *ai, *rp;
void *sinaddr;
- int on, reqaf, listfd, aierr;
+ int on, reqaf, listfd, aierr, errno_save;
if ((reqaf = hints->ai_family) == AF_UNSPEC)
hints->ai_family = AF_INET6;
@@ -343,11 +343,15 @@ getlistenfd(struct addrinfo *hints, char *bindip, char *port)
}
break;
}
+
+ /* Save errno, because fprintf in logentry overwrites it. */
+ errno_save = errno;
close(listfd);
if (loglvl & CONN && inet_ntop(rp->ai_family, sinaddr,
addstr, sizeof(addstr))) {
logentry(addstr, port, "-", "could not bind");
}
+ errno = errno_save;
}
freeaddrinfo(ai);
if (rp == NULL)
@@ -372,7 +376,7 @@ main(int argc, char *argv[])
struct addrinfo hints;
struct sockaddr_storage clt;
socklen_t cltlen;
- int sock, dofork, inetf, usechroot, nocgi;
+ int sock, dofork, inetf, usechroot, nocgi, errno_save;
char *port, *base, clienth[NI_MAXHOST], clientp[NI_MAXSERV];
char *user, *group, *bindip, *ohost, *sport, *p;
struct passwd *us;
@@ -462,15 +466,25 @@ main(int argc, char *argv[])
}
if (group != NULL) {
+ errno = 0;
if ((gr = getgrnam(group)) == NULL) {
- perror("no such group");
+ if (errno == 0) {
+ perror("no such group");
+ } else {
+ perror("getgrnam");
+ }
return 1;
}
}
if (user != NULL) {
+ errno = 0;
if ((us = getpwnam(user)) == NULL) {
- perror("no such user");
+ if (errno == 0) {
+ perror("no such user");
+ } else {
+ perror("getpwnam");
+ }
return 1;
}
}
@@ -509,10 +523,13 @@ main(int argc, char *argv[])
hints.ai_family = AF_INET;
listfd = getlistenfd(&hints, bindip, port);
}
+ /* Save errno because of fprintf to stderr. */
+ errno_save = errno;
}
if (listfd < 0) {
fprintf(stderr, "Unable to get a binding socket. "
"Look at bindip and the tcp port.\n");
+ errno = errno_save;
perror("getlistenfd");
return 1;
}