summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to 'sys')
-rw-r--r--sys/compat/hpux/hpux_net.c24
-rw-r--r--sys/compat/sunos/sunos_misc.c18
-rw-r--r--sys/compat/ultrix/ultrix_misc.c16
-rw-r--r--sys/kern/uipc_syscalls.c161
-rw-r--r--sys/miscfs/portal/portal_vfsops.c12
-rw-r--r--sys/nfs/nfs_syscalls.c8
6 files changed, 157 insertions, 82 deletions
diff --git a/sys/compat/hpux/hpux_net.c b/sys/compat/hpux/hpux_net.c
index 12a399e91c2..96d3d020be4 100644
--- a/sys/compat/hpux/hpux_net.c
+++ b/sys/compat/hpux/hpux_net.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: hpux_net.c,v 1.6 2001/08/26 06:25:10 deraadt Exp $ */
+/* $OpenBSD: hpux_net.c,v 1.7 2002/02/12 13:05:31 art Exp $ */
/* $NetBSD: hpux_net.c,v 1.14 1997/04/01 19:59:02 scottr Exp $ */
/*
@@ -216,10 +216,12 @@ hpux_sys_setsockopt(p, v, retval)
return (error);
if (SCARG(uap, valsize) > MLEN)
return (EINVAL);
+ FREF(fp);
if (SCARG(uap, val)) {
m = m_get(M_WAIT, MT_SOOPTS);
if ((error = copyin(SCARG(uap, val), mtod(m, caddr_t),
(u_int)SCARG(uap, valsize)))) {
+ FRELE(fp);
(void) m_free(m);
return (error);
}
@@ -236,8 +238,10 @@ hpux_sys_setsockopt(p, v, retval)
mtod(m, struct linger *)->l_onoff = 0;
m->m_len = sizeof(struct linger);
}
- return (sosetopt((struct socket *)fp->f_data, SCARG(uap, level),
- SCARG(uap, name), m));
+ error = sosetopt((struct socket *)fp->f_data, SCARG(uap, level),
+ SCARG(uap, name), m);
+ FRELE(fp);
+ return (error);
}
/* ARGSUSED */
@@ -256,17 +260,21 @@ hpux_sys_setsockopt2(p, v, retval)
return (error);
if (SCARG(uap, valsize) > MLEN)
return (EINVAL);
+ FREF(fp);
if (SCARG(uap, val)) {
m = m_get(M_WAIT, MT_SOOPTS);
if ((error = copyin(SCARG(uap, val), mtod(m, caddr_t),
(u_int)SCARG(uap, valsize)))) {
+ FRELE(fp);
(void) m_free(m);
return (error);
}
socksetsize(SCARG(uap, valsize), m);
}
- return (sosetopt((struct socket *)fp->f_data, SCARG(uap, level),
- SCARG(uap, name), m));
+ error = sosetopt((struct socket *)fp->f_data, SCARG(uap, level),
+ SCARG(uap, name), m);
+ FRELE(fp);
+ return (error);
}
int
@@ -282,10 +290,13 @@ hpux_sys_getsockopt(p, v, retval)
if ((error = getsock(p->p_fd, SCARG(uap, s), &fp)))
return (error);
+ FREF(fp);
if (SCARG(uap, val)) {
if ((error = copyin((caddr_t)SCARG(uap, avalsize),
- (caddr_t)&valsize, sizeof (valsize))))
+ (caddr_t)&valsize, sizeof (valsize)))) {
+ FRELE(fp);
return (error);
+ }
} else
valsize = 0;
if ((error = sogetopt((struct socket *)fp->f_data, SCARG(uap, level),
@@ -308,6 +319,7 @@ hpux_sys_getsockopt(p, v, retval)
(caddr_t)SCARG(uap, avalsize), sizeof (valsize));
}
bad:
+ FRELE(fp);
if (m != NULL)
(void) m_free(m);
return (error);
diff --git a/sys/compat/sunos/sunos_misc.c b/sys/compat/sunos/sunos_misc.c
index 685803ead25..d3a4371c7f4 100644
--- a/sys/compat/sunos/sunos_misc.c
+++ b/sys/compat/sunos/sunos_misc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sunos_misc.c,v 1.31 2002/02/02 16:05:58 art Exp $ */
+/* $OpenBSD: sunos_misc.c,v 1.32 2002/02/12 13:05:31 art Exp $ */
/* $NetBSD: sunos_misc.c,v 1.65 1996/04/22 01:44:31 christos Exp $ */
/*
@@ -519,20 +519,23 @@ sunos_sys_setsockopt(p, v, retval)
void *v;
register_t *retval;
{
- register struct sunos_sys_setsockopt_args *uap = v;
+ struct sunos_sys_setsockopt_args *uap = v;
struct file *fp;
struct mbuf *m = NULL;
int error;
if ((error = getsock(p->p_fd, SCARG(uap, s), &fp)) != 0)
return (error);
+ FREF(fp);
#define SO_DONTLINGER (~SO_LINGER)
if (SCARG(uap, name) == SO_DONTLINGER) {
m = m_get(M_WAIT, MT_SOOPTS);
mtod(m, struct linger *)->l_onoff = 0;
m->m_len = sizeof(struct linger);
- return (sosetopt((struct socket *)fp->f_data, SCARG(uap, level),
+ error = (sosetopt((struct socket *)fp->f_data, SCARG(uap, level),
SO_LINGER, m));
+ FRELE(fp);
+ return (error);
}
if (SCARG(uap, level) == IPPROTO_IP) {
#define SUNOS_IP_MULTICAST_IF 2
@@ -553,20 +556,25 @@ sunos_sys_setsockopt(p, v, retval)
ipoptxlat[SCARG(uap, name) - SUNOS_IP_MULTICAST_IF];
}
}
- if (SCARG(uap, valsize) > MLEN)
+ if (SCARG(uap, valsize) > MLEN) {
+ FRELE(fp);
return (EINVAL);
+ }
if (SCARG(uap, val)) {
m = m_get(M_WAIT, MT_SOOPTS);
error = copyin(SCARG(uap, val), mtod(m, caddr_t),
(u_int)SCARG(uap, valsize));
if (error) {
+ FRELE(fp);
(void) m_free(m);
return (error);
}
m->m_len = SCARG(uap, valsize);
}
- return (sosetopt((struct socket *)fp->f_data, SCARG(uap, level),
+ error = (sosetopt((struct socket *)fp->f_data, SCARG(uap, level),
SCARG(uap, name), m));
+ FRELE(fp);
+ return (error);
}
int
diff --git a/sys/compat/ultrix/ultrix_misc.c b/sys/compat/ultrix/ultrix_misc.c
index c84f4dbed79..8e46acd843f 100644
--- a/sys/compat/ultrix/ultrix_misc.c
+++ b/sys/compat/ultrix/ultrix_misc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ultrix_misc.c,v 1.22 2001/11/06 19:53:18 miod Exp $ */
+/* $OpenBSD: ultrix_misc.c,v 1.23 2002/02/12 13:05:31 art Exp $ */
/* $NetBSD: ultrix_misc.c,v 1.23 1996/04/07 17:23:04 jonathan Exp $ */
/*
@@ -353,27 +353,35 @@ ultrix_sys_setsockopt(p, v, retval)
if ((error = getsock(p->p_fd, SCARG(uap, s), &fp)) != 0)
return (error);
+ FREF(fp);
#define SO_DONTLINGER (~SO_LINGER)
if (SCARG(uap, name) == SO_DONTLINGER) {
m = m_get(M_WAIT, MT_SOOPTS);
mtod(m, struct linger *)->l_onoff = 0;
m->m_len = sizeof(struct linger);
- return (sosetopt((struct socket *)fp->f_data, SCARG(uap, level),
+ error = (sosetopt((struct socket *)fp->f_data, SCARG(uap, level),
SO_LINGER, m));
+ FRELE(fp);
+ return (error);
}
- if (SCARG(uap, valsize) > MLEN)
+ if (SCARG(uap, valsize) > MLEN) {
+ FRELE(fp);
return (EINVAL);
+ }
if (SCARG(uap, val)) {
m = m_get(M_WAIT, MT_SOOPTS);
if ((error = copyin(SCARG(uap, val), mtod(m, caddr_t),
(u_int)SCARG(uap, valsize))) != 0) {
+ FRELE(fp);
(void) m_free(m);
return (error);
}
m->m_len = SCARG(uap, valsize);
}
- return (sosetopt((struct socket *)fp->f_data, SCARG(uap, level),
+ error = (sosetopt((struct socket *)fp->f_data, SCARG(uap, level),
SCARG(uap, name), m));
+ FRELE(fp);
+ return (error);
}
struct ultrix_utsname {
diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c
index 7d314949914..79ff605d430 100644
--- a/sys/kern/uipc_syscalls.c
+++ b/sys/kern/uipc_syscalls.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: uipc_syscalls.c,v 1.49 2002/02/11 12:34:30 art Exp $ */
+/* $OpenBSD: uipc_syscalls.c,v 1.50 2002/02/12 13:05:31 art Exp $ */
/* $NetBSD: uipc_syscalls.c,v 1.19 1996/02/09 19:00:48 christos Exp $ */
/*
@@ -115,12 +115,14 @@ sys_bind(p, v, retval)
if ((error = getsock(p->p_fd, SCARG(uap, s), &fp)) != 0)
return (error);
+ FREF(fp);
error = sockargs(&nam, (caddr_t)SCARG(uap, name), SCARG(uap, namelen),
MT_SONAME);
- if (error)
- return (error);
- error = sobind((struct socket *)fp->f_data, nam);
- m_freem(nam);
+ if (error == 0) {
+ error = sobind((struct socket *)fp->f_data, nam);
+ m_freem(nam);
+ }
+ FRELE(fp);
return (error);
}
@@ -140,7 +142,10 @@ sys_listen(p, v, retval)
if ((error = getsock(p->p_fd, SCARG(uap, s), &fp)) != 0)
return (error);
- return (solisten((struct socket *)fp->f_data, SCARG(uap, backlog)));
+ FREF(fp);
+ error = solisten((struct socket *)fp->f_data, SCARG(uap, backlog));
+ FRELE(fp);
+ return (error);
}
int
@@ -149,12 +154,12 @@ sys_accept(p, v, retval)
void *v;
register_t *retval;
{
- register struct sys_accept_args /* {
+ struct sys_accept_args /* {
syscallarg(int) s;
syscallarg(struct sockaddr *) name;
syscallarg(socklen_t *) anamelen;
} */ *uap = v;
- struct file *fp;
+ struct file *fp, *headfp;
struct mbuf *nam;
socklen_t namelen;
int error, s, tmpfd;
@@ -166,15 +171,17 @@ sys_accept(p, v, retval)
return (error);
if ((error = getsock(p->p_fd, SCARG(uap, s), &fp)) != 0)
return (error);
+ FREF(fp);
+ headfp = fp;
s = splsoftnet();
head = (struct socket *)fp->f_data;
if ((head->so_options & SO_ACCEPTCONN) == 0) {
- splx(s);
- return (EINVAL);
+ error = EINVAL;
+ goto bad;
}
if ((head->so_state & SS_NBIO) && head->so_qlen == 0) {
- splx(s);
- return (EWOULDBLOCK);
+ error = EWOULDBLOCK;
+ goto bad;
}
while (head->so_qlen == 0 && head->so_error == 0) {
if (head->so_state & SS_CANTRCVMORE) {
@@ -184,15 +191,13 @@ sys_accept(p, v, retval)
error = tsleep((caddr_t)&head->so_timeo, PSOCK | PCATCH,
netcon, 0);
if (error) {
- splx(s);
- return (error);
+ goto bad;
}
}
if (head->so_error) {
error = head->so_error;
head->so_error = 0;
- splx(s);
- return (error);
+ goto bad;
}
/*
@@ -251,8 +256,10 @@ sys_accept(p, v, retval)
closef(fp, p);
}
m_freem(nam);
- splx(s);
FILE_SET_MATURE(fp);
+bad:
+ splx(s);
+ FRELE(headfp);
return (error);
}
@@ -263,14 +270,14 @@ sys_connect(p, v, retval)
void *v;
register_t *retval;
{
- register struct sys_connect_args /* {
+ struct sys_connect_args /* {
syscallarg(int) s;
syscallarg(struct sockaddr *) name;
syscallarg(socklen_t) namelen;
} */ *uap = v;
struct file *fp;
- register struct socket *so;
- struct mbuf *nam;
+ struct socket *so;
+ struct mbuf *nam = NULL;
int error, s;
if ((error = getsock(p->p_fd, SCARG(uap, s), &fp)) != 0)
@@ -278,14 +285,16 @@ sys_connect(p, v, retval)
so = (struct socket *)fp->f_data;
if ((so->so_state & SS_NBIO) && (so->so_state & SS_ISCONNECTING))
return (EALREADY);
+ FREF(fp);
error = sockargs(&nam, (caddr_t)SCARG(uap, name), SCARG(uap, namelen),
MT_SONAME);
if (error)
- return (error);
+ goto bad;
error = soconnect(so, nam);
if (error)
goto bad;
if ((so->so_state & SS_NBIO) && (so->so_state & SS_ISCONNECTING)) {
+ FRELE(fp);
m_freem(nam);
return (EINPROGRESS);
}
@@ -303,7 +312,9 @@ sys_connect(p, v, retval)
splx(s);
bad:
so->so_state &= ~SS_ISCONNECTING;
- m_freem(nam);
+ FRELE(fp);
+ if (nam)
+ m_freem(nam);
if (error == ERESTART)
error = EINTR;
return (error);
@@ -453,16 +464,16 @@ done:
int
sendit(p, s, mp, flags, retsize)
- register struct proc *p;
+ struct proc *p;
int s;
- register struct msghdr *mp;
+ struct msghdr *mp;
int flags;
register_t *retsize;
{
struct file *fp;
struct uio auio;
- register struct iovec *iov;
- register int i;
+ struct iovec *iov;
+ int i;
struct mbuf *to, *control;
int len, error;
#ifdef KTRACE
@@ -485,11 +496,14 @@ sendit(p, s, mp, flags, retsize)
(auio.uio_resid += iov->iov_len) > SSIZE_MAX)
return (EINVAL);
}
+ FREF(fp);
if (mp->msg_name) {
error = sockargs(&to, mp->msg_name, mp->msg_namelen,
MT_SONAME);
- if (error)
+ if (error) {
+ FRELE(fp);
return (error);
+ }
} else
to = 0;
if (mp->msg_control) {
@@ -546,6 +560,7 @@ sendit(p, s, mp, flags, retsize)
}
#endif
bad:
+ FRELE(fp);
if (to)
m_freem(to);
return (error);
@@ -639,9 +654,9 @@ done:
int
recvit(p, s, mp, namelenp, retsize)
- register struct proc *p;
+ struct proc *p;
int s;
- register struct msghdr *mp;
+ struct msghdr *mp;
caddr_t namelenp;
register_t *retsize;
{
@@ -672,6 +687,7 @@ recvit(p, s, mp, namelenp, retsize)
(auio.uio_resid += iov->iov_len) > SSIZE_MAX)
return (EINVAL);
}
+ FREF(fp);
#ifdef KTRACE
if (KTRPOINT(p, KTR_GENIO)) {
int iovlen = auio.uio_iovcnt * sizeof (struct iovec);
@@ -780,6 +796,7 @@ recvit(p, s, mp, namelenp, retsize)
mp->msg_controllen = len;
}
out:
+ FRELE(fp);
if (from)
m_freem(from);
if (control)
@@ -794,7 +811,7 @@ sys_shutdown(p, v, retval)
void *v;
register_t *retval;
{
- register struct sys_shutdown_args /* {
+ struct sys_shutdown_args /* {
syscallarg(int) s;
syscallarg(int) how;
} */ *uap = v;
@@ -803,7 +820,10 @@ sys_shutdown(p, v, retval)
if ((error = getsock(p->p_fd, SCARG(uap, s), &fp)) != 0)
return (error);
- return (soshutdown((struct socket *)fp->f_data, SCARG(uap, how)));
+ FREF(fp);
+ error = soshutdown((struct socket *)fp->f_data, SCARG(uap, how));
+ FRELE(fp);
+ return (error);
}
/* ARGSUSED */
@@ -813,7 +833,7 @@ sys_setsockopt(p, v, retval)
void *v;
register_t *retval;
{
- register struct sys_setsockopt_args /* {
+ struct sys_setsockopt_args /* {
syscallarg(int) s;
syscallarg(int) level;
syscallarg(int) name;
@@ -828,27 +848,35 @@ sys_setsockopt(p, v, retval)
return (error);
if (SCARG(uap, valsize) > MCLBYTES)
return (EINVAL);
+ FREF(fp);
if (SCARG(uap, val)) {
m = m_get(M_WAIT, MT_SOOPTS);
if (SCARG(uap, valsize) > MLEN) {
MCLGET(m, M_DONTWAIT);
if ((m->m_flags & M_EXT) == 0) {
- m_freem(m);
- return (ENOBUFS);
+ error = ENOBUFS;
+ goto bad;
}
}
- if (m == NULL)
- return (ENOBUFS);
+ if (m == NULL) {
+ error = ENOBUFS;
+ goto bad;
+ }
error = copyin(SCARG(uap, val), mtod(m, caddr_t),
SCARG(uap, valsize));
if (error) {
- (void) m_free(m);
- return (error);
+ goto bad;
}
m->m_len = SCARG(uap, valsize);
}
- return (sosetopt((struct socket *)fp->f_data, SCARG(uap, level),
- SCARG(uap, name), m));
+ error = sosetopt((struct socket *)fp->f_data, SCARG(uap, level),
+ SCARG(uap, name), m);
+ m = NULL;
+bad:
+ if (m)
+ m_freem(m);
+ FRELE(fp);
+ return (error);
}
/* ARGSUSED */
@@ -858,7 +886,7 @@ sys_getsockopt(p, v, retval)
void *v;
register_t *retval;
{
- register struct sys_getsockopt_args /* {
+ struct sys_getsockopt_args /* {
syscallarg(int) s;
syscallarg(int) level;
syscallarg(int) name;
@@ -872,11 +900,12 @@ sys_getsockopt(p, v, retval)
if ((error = getsock(p->p_fd, SCARG(uap, s), &fp)) != 0)
return (error);
+ FREF(fp);
if (SCARG(uap, val)) {
error = copyin((caddr_t)SCARG(uap, avalsize),
(caddr_t)&valsize, sizeof (valsize));
if (error)
- return (error);
+ goto out;
} else
valsize = 0;
if ((error = sogetopt((struct socket *)fp->f_data, SCARG(uap, level),
@@ -889,6 +918,8 @@ sys_getsockopt(p, v, retval)
error = copyout((caddr_t)&valsize,
(caddr_t)SCARG(uap, avalsize), sizeof (valsize));
}
+out:
+ FRELE(fp);
if (m != NULL)
(void) m_free(m);
return (error);
@@ -927,22 +958,23 @@ sys_getsockname(p, v, retval)
void *v;
register_t *retval;
{
- register struct sys_getsockname_args /* {
+ struct sys_getsockname_args /* {
syscallarg(int) fdes;
syscallarg(caddr_t) asa;
syscallarg(socklen_t *) alen;
} */ *uap = v;
struct file *fp;
- register struct socket *so;
- struct mbuf *m;
+ struct socket *so;
+ struct mbuf *m = NULL;
socklen_t len;
int error;
if ((error = getsock(p->p_fd, SCARG(uap, fdes), &fp)) != 0)
return (error);
+ FREF(fp);
error = copyin((caddr_t)SCARG(uap, alen), (caddr_t)&len, sizeof (len));
if (error)
- return (error);
+ goto bad;
so = (struct socket *)fp->f_data;
m = m_getclr(M_WAIT, MT_SONAME);
error = (*so->so_proto->pr_usrreq)(so, PRU_SOCKADDR, 0, m, 0);
@@ -955,7 +987,9 @@ sys_getsockname(p, v, retval)
error = copyout((caddr_t)&len, (caddr_t)SCARG(uap, alen),
sizeof (len));
bad:
- m_freem(m);
+ FRELE(fp);
+ if (m)
+ m_freem(m);
return (error);
}
@@ -969,14 +1003,14 @@ sys_getpeername(p, v, retval)
void *v;
register_t *retval;
{
- register struct sys_getpeername_args /* {
+ struct sys_getpeername_args /* {
syscallarg(int) fdes;
syscallarg(caddr_t) asa;
syscallarg(socklen_t *) alen;
} */ *uap = v;
struct file *fp;
register struct socket *so;
- struct mbuf *m;
+ struct mbuf *m = NULL;
socklen_t len;
int error;
@@ -985,9 +1019,10 @@ sys_getpeername(p, v, retval)
so = (struct socket *)fp->f_data;
if ((so->so_state & (SS_ISCONNECTED|SS_ISCONFIRMING)) == 0)
return (ENOTCONN);
+ FREF(fp);
error = copyin((caddr_t)SCARG(uap, alen), (caddr_t)&len, sizeof (len));
if (error)
- return (error);
+ goto bad;
m = m_getclr(M_WAIT, MT_SONAME);
error = (*so->so_proto->pr_usrreq)(so, PRU_PEERADDR, 0, m, 0);
if (error)
@@ -999,6 +1034,7 @@ sys_getpeername(p, v, retval)
error = copyout((caddr_t)&len, (caddr_t)SCARG(uap, alen),
sizeof (len));
bad:
+ FRELE(fp);
m_freem(m);
return (error);
}
@@ -1013,14 +1049,14 @@ sys_getpeereid(p, v, retval)
void *v;
register_t *retval;
{
- register struct sys_getpeereid_args /* {
+ struct sys_getpeereid_args /* {
syscallarg(int) fdes;
syscallarg(uid_t *) euid;
syscallarg(gid_t *) egid;
} */ *uap = v;
struct file *fp;
- register struct socket *so;
- struct mbuf *m;
+ struct socket *so;
+ struct mbuf *m = NULL;
struct unpcbid *id;
int error;
@@ -1029,9 +1065,12 @@ sys_getpeereid(p, v, retval)
so = (struct socket *)fp->f_data;
if (so->so_proto != pffindtype(AF_LOCAL, SOCK_STREAM))
return (EOPNOTSUPP);
+ FREF(fp);
m = m_getclr(M_WAIT, MT_SONAME);
- if (m == NULL)
- return (ENOBUFS);
+ if (m == NULL) {
+ error = ENOBUFS;
+ goto bad;
+ }
error = (*so->so_proto->pr_usrreq)(so, PRU_PEEREID, 0, m, 0);
if (!error && m->m_len != sizeof(struct unpcbid))
error = EOPNOTSUPP;
@@ -1044,6 +1083,7 @@ sys_getpeereid(p, v, retval)
error = copyout((caddr_t)&(id->unp_egid),
(caddr_t)SCARG(uap, egid), sizeof(gid_t));
bad:
+ FRELE(fp);
m_freem(m);
return (error);
}
@@ -1055,8 +1095,8 @@ sockargs(mp, buf, buflen, type)
socklen_t buflen;
int type;
{
- register struct sockaddr *sa;
- register struct mbuf *m;
+ struct sockaddr *sa;
+ struct mbuf *m;
int error;
/*
@@ -1097,12 +1137,9 @@ sockargs(mp, buf, buflen, type)
}
int
-getsock(fdp, fdes, fpp)
- struct filedesc *fdp;
- int fdes;
- struct file **fpp;
+getsock(struct filedesc *fdp, int fdes, struct file **fpp)
{
- register struct file *fp;
+ struct file *fp;
if ((fp = fd_getfile(fdp, fdes)) == NULL)
return (EBADF);
diff --git a/sys/miscfs/portal/portal_vfsops.c b/sys/miscfs/portal/portal_vfsops.c
index 86187f81f98..b65841ed79b 100644
--- a/sys/miscfs/portal/portal_vfsops.c
+++ b/sys/miscfs/portal/portal_vfsops.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: portal_vfsops.c,v 1.11 2002/02/08 13:53:28 art Exp $ */
+/* $OpenBSD: portal_vfsops.c,v 1.12 2002/02/12 13:05:32 art Exp $ */
/* $NetBSD: portal_vfsops.c,v 1.14 1996/02/09 22:40:41 christos Exp $ */
/*
@@ -108,9 +108,13 @@ portal_mount(mp, path, data, ndp, p)
if (so->so_proto->pr_domain->dom_family != AF_UNIX)
return (ESOCKTNOSUPPORT);
+ FREF(fp);
+
error = getnewvnode(VT_PORTAL, mp, portal_vnodeop_p, &rvp); /* XXX */
- if (error)
+ if (error) {
+ FRELE(fp);
return (error);
+ }
MALLOC(rvp->v_data, void *, sizeof(struct portalnode),
M_TEMP, M_WAITOK);
@@ -122,7 +126,9 @@ portal_mount(mp, path, data, ndp, p)
VTOPORTAL(rvp)->pt_size = 0;
VTOPORTAL(rvp)->pt_fileid = PORTAL_ROOTFILEID;
fmp->pm_root = rvp;
- fmp->pm_server = fp; fp->f_count++;
+ fmp->pm_server = fp;
+ fp->f_count++;
+ FRELE(fp);
mp->mnt_flag |= MNT_LOCAL;
mp->mnt_data = (qaddr_t)fmp;
diff --git a/sys/nfs/nfs_syscalls.c b/sys/nfs/nfs_syscalls.c
index 1ea7a994fe1..910b9c3e29d 100644
--- a/sys/nfs/nfs_syscalls.c
+++ b/sys/nfs/nfs_syscalls.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: nfs_syscalls.c,v 1.28 2002/02/10 22:02:05 nate Exp $ */
+/* $OpenBSD: nfs_syscalls.c,v 1.29 2002/02/12 13:05:32 art Exp $ */
/* $NetBSD: nfs_syscalls.c,v 1.19 1996/02/18 11:53:52 fvdl Exp $ */
/*
@@ -287,6 +287,7 @@ sys_nfssvc(p, v, retval)
error = getsock(p->p_fd, nfsdarg.sock, &fp);
if (error)
return (error);
+ FREF(fp);
/*
* Get the client address for connected sockets.
*/
@@ -295,10 +296,13 @@ sys_nfssvc(p, v, retval)
else {
error = sockargs(&nam, nfsdarg.name, nfsdarg.namelen,
MT_SONAME);
- if (error)
+ if (error) {
+ FRELE(fp);
return (error);
+ }
}
error = nfssvc_addsock(fp, nam);
+ FRELE(fp);
#endif /* !NFSSERVER */
} else {
#ifndef NFSSERVER