From d865180393eead35594f5bfd6ecc68d222e3e8a9 Mon Sep 17 00:00:00 2001 From: jdolecek Date: Mon, 25 Jun 2001 19:46:50 +0000 Subject: [PATCH] sys_connect(): fix the call to FILE_UNUSE() so that it's done on return, rather than immediatelly after getsock() call --- sys/kern/uipc_syscalls.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c index c7e7bf47502f..8a6821f2518d 100644 --- a/sys/kern/uipc_syscalls.c +++ b/sys/kern/uipc_syscalls.c @@ -1,4 +1,4 @@ -/* $NetBSD: uipc_syscalls.c,v 1.61 2001/06/25 19:24:03 jdolecek Exp $ */ +/* $NetBSD: uipc_syscalls.c,v 1.62 2001/06/25 19:46:50 jdolecek Exp $ */ /* * Copyright (c) 1982, 1986, 1989, 1990, 1993 @@ -270,19 +270,21 @@ sys_connect(struct proc *p, void *v, register_t *retval) if ((error = getsock(p->p_fd, SCARG(uap, s), &fp)) != 0) return (error); so = (struct socket *)fp->f_data; - FILE_UNUSE(fp, p); - if ((so->so_state & SS_NBIO) && (so->so_state & SS_ISCONNECTING)) - return (EALREADY); + if ((so->so_state & SS_NBIO) && (so->so_state & SS_ISCONNECTING)) { + error = EALREADY; + goto out; + } error = sockargs(&nam, SCARG(uap, name), SCARG(uap, namelen), MT_SONAME); if (error) - return (error); + goto out; error = soconnect(so, nam); if (error) goto bad; if ((so->so_state & SS_NBIO) && (so->so_state & SS_ISCONNECTING)) { m_freem(nam); - return (EINPROGRESS); + error = EINPROGRESS; + goto out; } s = splsoftnet(); while ((so->so_state & SS_ISCONNECTING) && so->so_error == 0) { @@ -301,6 +303,8 @@ sys_connect(struct proc *p, void *v, register_t *retval) m_freem(nam); if (error == ERESTART) error = EINTR; + out: + FILE_UNUSE(fp, p); return (error); }