Hi bluhm, Thanks for your reply! I think your method is better, and I update the patch:
Index: netcat.c =================================================================== RCS file: /cvs/src/usr.bin/nc/netcat.c,v retrieving revision 1.192 diff -u -p -r1.192 netcat.c --- netcat.c 10 Aug 2018 17:15:22 -0000 1.192 +++ netcat.c 6 Sep 2018 10:10:07 -0000 @@ -564,8 +564,11 @@ main(int argc, char *argv[]) } /* Allow only one connection at a time, but stay alive. */ for (;;) { - if (family != AF_UNIX) + if (family != AF_UNIX) { + if (s == -1) + close(s); s = local_listen(host, uport, hints); + } if (s < 0) err(1, NULL); if (uflag && kflag) { @@ -622,9 +625,7 @@ main(int argc, char *argv[]) } close(connfd); } - if (family != AF_UNIX) - close(s); - else if (uflag) { + if (family == AF_UNIX && uflag) { if (connect(s, NULL, 0) < 0) err(1, "connect"); } Thanks! On 9/6/2018 5:07 AM, Alexander Bluhm wrote: > On Tue, Sep 04, 2018 at 01:01:38PM +0800, Nan Xiao wrote: >> Before netcat program exits, it will check whether s is -1, and close >> socket if s is not -1: >> >> if (s != -1) >> close(s); >> >> The following patch fixes the issue that netcat will close socket twice >> if it works as a server: > > I think it is a bug, but should be fixed differently. The netstat > code has a lot of if and else for all the use cases. Adding a s = > -1 at one place makes it even more confusing. > > In general main() does not reset s to -1, it isets it at the > beginning. Look at the client side. There we close at the beginning > of the loop: > > /* Cycle through portlist, connecting to each port. */ > for (s = -1, i = 0; portlist[i] != NULL; i++) { > if (s != -1) > close(s); > > So on the server side we should do the same, otherwise the code > will get more and more messy. Use the same concept everywhere. > I think this would be better: > > /* Allow only one connection at a time, but stay alive. */ > for (;;) { > if (family != AF_UNIX) { > if (s != -1) > close(s); > s = local_listen(host, uport, hints); > } > > bluhm > -- Best Regards Nan Xiao(肖楠)