summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortb <>2023-08-14 08:07:27 +0000
committertb <>2023-08-14 08:07:27 +0000
commitd4ac55108c9f22e6e0e39bafa7fcbc1e00289aed (patch)
tree7e89c60ea4653a514eb973f7264048ef097a4bec /src
parent07d7f4adf74c0400d4df305a728d0afa0ed26537 (diff)
downloadopenbsd-d4ac55108c9f22e6e0e39bafa7fcbc1e00289aed.tar.gz
openbsd-d4ac55108c9f22e6e0e39bafa7fcbc1e00289aed.tar.bz2
openbsd-d4ac55108c9f22e6e0e39bafa7fcbc1e00289aed.zip
netcat: avoid issuing syscalls on fd -1
In case a socket error condition occurs, readwrite() invalidates the corresponding fd. Later on, readwrite() may still issue a syscall on it. Avoid that by adding a couple of checks for fd == -1. Reported and fix suggested by Leah Neukirchen. Fixes https://github.com/libressl/openbsd/issues/143 "looks right" deraadt
Diffstat (limited to 'src')
-rw-r--r--src/usr.bin/nc/netcat.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/src/usr.bin/nc/netcat.c b/src/usr.bin/nc/netcat.c
index c8f1cdd9f7..54ddd0ffcc 100644
--- a/src/usr.bin/nc/netcat.c
+++ b/src/usr.bin/nc/netcat.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: netcat.c,v 1.225 2023/01/04 12:53:38 deraadt Exp $ */ 1/* $OpenBSD: netcat.c,v 1.226 2023/08/14 08:07:27 tb Exp $ */
2/* 2/*
3 * Copyright (c) 2001 Eric Jackson <ericj@monkey.org> 3 * Copyright (c) 2001 Eric Jackson <ericj@monkey.org>
4 * Copyright (c) 2015 Bob Beck. All rights reserved. 4 * Copyright (c) 2015 Bob Beck. All rights reserved.
@@ -1177,7 +1177,7 @@ readwrite(int net_fd, struct tls *tls_ctx)
1177 pfd[POLL_NETIN].fd = -1; 1177 pfd[POLL_NETIN].fd = -1;
1178 1178
1179 if (pfd[POLL_NETOUT].revents & POLLHUP) { 1179 if (pfd[POLL_NETOUT].revents & POLLHUP) {
1180 if (Nflag) 1180 if (pfd[POLL_NETOUT].fd != -1 && Nflag)
1181 shutdown(pfd[POLL_NETOUT].fd, SHUT_WR); 1181 shutdown(pfd[POLL_NETOUT].fd, SHUT_WR);
1182 pfd[POLL_NETOUT].fd = -1; 1182 pfd[POLL_NETOUT].fd = -1;
1183 } 1183 }
@@ -1256,7 +1256,7 @@ readwrite(int net_fd, struct tls *tls_ctx)
1256 if (netinbufpos == BUFSIZE) 1256 if (netinbufpos == BUFSIZE)
1257 pfd[POLL_NETIN].events = 0; 1257 pfd[POLL_NETIN].events = 0;
1258 /* handle telnet */ 1258 /* handle telnet */
1259 if (tflag) 1259 if (pfd[POLL_NETIN].fd != -1 && tflag)
1260 atelnet(pfd[POLL_NETIN].fd, netinbuf, 1260 atelnet(pfd[POLL_NETIN].fd, netinbuf,
1261 netinbufpos); 1261 netinbufpos);
1262 } 1262 }
@@ -1297,6 +1297,9 @@ drainbuf(int fd, unsigned char *buf, size_t *bufpos, struct tls *tls)
1297 ssize_t n; 1297 ssize_t n;
1298 ssize_t adjust; 1298 ssize_t adjust;
1299 1299
1300 if (fd == -1)
1301 return -1;
1302
1300 if (tls) { 1303 if (tls) {
1301 n = tls_write(tls, buf, *bufpos); 1304 n = tls_write(tls, buf, *bufpos);
1302 if (n == -1) 1305 if (n == -1)
@@ -1323,6 +1326,9 @@ fillbuf(int fd, unsigned char *buf, size_t *bufpos, struct tls *tls)
1323 size_t num = BUFSIZE - *bufpos; 1326 size_t num = BUFSIZE - *bufpos;
1324 ssize_t n; 1327 ssize_t n;
1325 1328
1329 if (fd == -1)
1330 return -1;
1331
1326 if (tls) { 1332 if (tls) {
1327 n = tls_read(tls, buf + *bufpos, num); 1333 n = tls_read(tls, buf + *bufpos, num);
1328 if (n == -1) 1334 if (n == -1)