Control: tag -1 - upstream

Hi Duncan,

On Sun, 08 Mar 2020 at 14:25:50 +1100, Duncan Roe wrote:
>> The enclosed patch seems to work for me.  (Untested though, so not
>> pushing just yet.)
> 
> Good idea not to apply that patch. After applying, I can send server nc into a
> hard loop by entering ^D after it has responded to the its 2nd client, as per
> attached scenario.
> 
> Should be a simple fix.

Thanks for testing and fixing the patch :-)  I'm reattaching what you
sent me privately so it shows in the BTS.

> Using TCP, ^D to server nc has no visible efect. Maybe an update to your patch
> can fix this also. I will investicate over the next few days.

Sorry, my bad for claiming earlier that ‘-q0’ was an alias ‘-N’.  What's
correct is what's written in the manual, namely that it *implies* ‘-N’.
All ‘-N’ does is to call shutdown(2) after EOF on stdin; which it does,
so I'm removing the ‘upstream’ tag on the bug.

> Input in parentheses
> 
> Screen 1                         Screen 2
>                                13:40:42$ (nc -k -u -N -6 -l ::1 1042)
> 13:42:11$ (nc -u -N -6 ::1 1042)
> (aaa)
>                                aaa
> (^D)
> 13:42:50$
> (nc -u -N -6 ::1 1042)
> (bbb)
>                                bbb
>                                (^D)
> 
> Screen 2 nc is now in a hard loop:
> 
>> poll([{fd=0, events=POLLIN}, {fd=3, events=0}, {fd=3, events=POLLIN}, {fd=1, 
>> events=0}], 4, -1) = 2 ([{fd=3, revents=POLLHUP}, {fd=3, 
>> revents=POLLIN|POLLHUP}])
>> shutdown(3, SHUT_WR)                    = -1 ENOTCONN (Transport endpoint is 
>> not connected)
>> read(3, "", 16384)                      = 0
>> shutdown(3, SHUT_RD)                    = -1 ENOTCONN (Transport endpoint is 
>> not connected)
>> poll([{fd=0, events=POLLIN}, {fd=3, events=0}, {fd=3, events=POLLIN}, {fd=1, 
>> events=0}], 4, -1) = 2 ([{fd=3, revents=POLLHUP}, {fd=3, 
>> revents=POLLIN|POLLHUP}])
>> shutdown(3, SHUT_WR)                    = -1 ENOTCONN (Transport endpoint is 
>> not connected)

-- 
Guilhem.
--- a/netcat.c
+++ b/netcat.c
@@ -1431,8 +1431,11 @@ readwrite(int net_fd)
 		/* both inputs are gone, buffers are empty, we are done */
 		if (pfd[POLL_STDIN].fd == -1 && pfd[POLL_NETIN].fd == -1 &&
 		    stdinbufpos == 0 && netinbufpos == 0) {
-			if (qflag <= 0)
+			if (qflag <= 0) {
+				if (kflag)
+					kflag = 0;
 				return;
+			}
 			goto delay_exit;
 		}
 		/* both outputs are gone, we can't continue */
@@ -1607,6 +1610,10 @@ delay_exit:
 			if (pfd[POLL_NETOUT].fd != -1 && Nflag)
 				shutdown(pfd[POLL_NETOUT].fd, SHUT_WR);
 			pfd[POLL_NETOUT].fd = -1;
+			if (uflag && pfd[POLL_NETIN].fd != -1 && Nflag && netinbufpos == 0) {
+				shutdown(pfd[POLL_NETIN].fd, SHUT_RD);
+				pfd[POLL_NETIN].fd = -1;
+			}
 		}
 		/* net in gone and queue empty? */
 		if (pfd[POLL_NETIN].fd == -1 && netinbufpos == 0) {

Attachment: signature.asc
Description: PGP signature

Reply via email to