Current updated patch for comments is below.
Jayanth did make one point that an application could assume that
the error return from accept was in regards to the listening socket
instead of the new socket, so that may be a concern.
--
Jonathan
Index: uipc_socket.c
===================================================================
RCS file: /ncvs/src/sys/kern/uipc_socket.c,v
retrieving revision 1.68.2.11
diff -u -r1.68.2.11 uipc_socket.c
--- uipc_socket.c 2000/12/22 10:25:21 1.68.2.11
+++ uipc_socket.c 2001/02/07 20:30:29
@@ -365,11 +365,8 @@
so->so_state &= ~SS_NOFDREF;
if ((so->so_state & SS_ISDISCONNECTED) == 0)
error = (*so->so_proto->pr_usrreqs->pru_accept)(so, nam);
- else {
- if (nam)
- *nam = 0;
- error = 0;
- }
+ else
+ error = ECONNABORTED;
splx(s);
return (error);
}
Index: uipc_syscalls.c
===================================================================
RCS file: /ncvs/src/sys/kern/uipc_syscalls.c,v
retrieving revision 1.65.2.6
diff -u -r1.65.2.6 uipc_syscalls.c
--- uipc_syscalls.c 2000/12/02 00:47:50 1.65.2.6
+++ uipc_syscalls.c 2001/02/07 21:27:03
@@ -283,7 +283,19 @@
nfp->f_ops = &socketops;
nfp->f_type = DTYPE_SOCKET;
sa = 0;
- (void) soaccept(so, &sa);
+ error = soaccept(so, &sa);
+ if (error) {
+ /*
+ * return a namelen of zero for older code which might
+ * ignore the return value from accept.
+ */
+ if (uap->name != NULL) {
+ namelen = 0;
+ (void) copyout((caddr_t)&namelen,
+ (caddr_t)uap->anamelen, sizeof(*uap->anamelen));
+ }
+ goto noconnection;
+ }
if (sa == NULL) {
namelen = 0;
if (uap->name)
@@ -307,6 +319,7 @@
error = copyout((caddr_t)&namelen,
(caddr_t)uap->anamelen, sizeof (*uap->anamelen));
}
+noconnection:
if (sa)
FREE(sa, M_SONAME);
To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-net" in the body of the message