upstream commit

Another use for fcntl() and thus of the superfluous 3rd
 parameter is when sanitising standard fd's before calling daemon().

Use a tweaked version of the ssh(1) function in all three places
found using fcntl() this way.

ok jca@ beck@

Upstream-ID: f16811ffa19a1c5f4ef383c5f0fecb843c84e218
This commit is contained in:
krw@openbsd.org 2016-04-02 14:37:42 +00:00 committed by Darren Tucker
parent b3413534aa
commit 574def0eb4

26
misc.c
View File

@ -1,4 +1,4 @@
/* $OpenBSD: misc.c,v 1.102 2016/03/02 22:42:40 dtucker Exp $ */ /* $OpenBSD: misc.c,v 1.103 2016/04/02 14:37:42 krw Exp $ */
/* /*
* Copyright (c) 2000 Markus Friedl. All rights reserved. * Copyright (c) 2000 Markus Friedl. All rights reserved.
* Copyright (c) 2005,2006 Damien Miller. All rights reserved. * Copyright (c) 2005,2006 Damien Miller. All rights reserved.
@ -84,9 +84,9 @@ set_nonblock(int fd)
{ {
int val; int val;
val = fcntl(fd, F_GETFL, 0); val = fcntl(fd, F_GETFL);
if (val < 0) { if (val < 0) {
error("fcntl(%d, F_GETFL, 0): %s", fd, strerror(errno)); error("fcntl(%d, F_GETFL): %s", fd, strerror(errno));
return (-1); return (-1);
} }
if (val & O_NONBLOCK) { if (val & O_NONBLOCK) {
@ -108,9 +108,9 @@ unset_nonblock(int fd)
{ {
int val; int val;
val = fcntl(fd, F_GETFL, 0); val = fcntl(fd, F_GETFL);
if (val < 0) { if (val < 0) {
error("fcntl(%d, F_GETFL, 0): %s", fd, strerror(errno)); error("fcntl(%d, F_GETFL): %s", fd, strerror(errno));
return (-1); return (-1);
} }
if (!(val & O_NONBLOCK)) { if (!(val & O_NONBLOCK)) {
@ -729,16 +729,16 @@ sanitise_stdfd(void)
strerror(errno)); strerror(errno));
exit(1); exit(1);
} }
while (++dupfd <= 2) { while (++dupfd <= STDERR_FILENO) {
/* Only clobber closed fds */ /* Only populate closed fds. */
if (fcntl(dupfd, F_GETFL, 0) >= 0) if (fcntl(dupfd, F_GETFL) == -1 && errno == EBADF) {
continue; if (dup2(nullfd, dupfd) == -1) {
if (dup2(nullfd, dupfd) == -1) { fprintf(stderr, "dup2: %s\n", strerror(errno));
fprintf(stderr, "dup2: %s\n", strerror(errno)); exit(1);
exit(1); }
} }
} }
if (nullfd > 2) if (nullfd > STDERR_FILENO)
close(nullfd); close(nullfd);
} }