On 21/05/18(Mon) 14:18, Alexander Bluhm wrote:
> On Mon, May 21, 2018 at 01:41:45PM +0200, Martin Pieuchot wrote:
> > Diff below fixes that, ok?
>
> This part modifies the struct socket. It would run without
> netlock in your diff.
Indeed, updated diff.
Index: kern/uipc_syscalls.c
===================================================================
RCS file: /cvs/src/sys/kern/uipc_syscalls.c,v
retrieving revision 1.170
diff -u -p -r1.170 uipc_syscalls.c
--- kern/uipc_syscalls.c 8 May 2018 08:53:41 -0000 1.170
+++ kern/uipc_syscalls.c 21 May 2018 13:09:28 -0000
@@ -340,24 +340,25 @@ doaccept(struct proc *p, int sock, struc
error = soaccept(so, nam);
if (!error && name != NULL)
error = copyaddrout(p, nam, name, namelen, anamelen);
+out:
if (!error) {
if (nflag & FNONBLOCK)
so->so_state |= SS_NBIO;
else
so->so_state &= ~SS_NBIO;
+ sounlock(s);
fp->f_data = so;
FILE_SET_MATURE(fp, p);
*retval = tmpfd;
- }
-out:
- sounlock(s);
- m_freem(nam);
- if (error) {
+ } else {
+ sounlock(s);
fdplock(fdp);
fdremove(fdp, tmpfd);
closef(fp, p);
fdpunlock(fdp);
}
+
+ m_freem(nam);
FRELE(headfp, p);
return (error);
}