diff options
author | dillon <dillon@FreeBSD.org> | 2000-11-23 11:05:14 +0000 |
---|---|---|
committer | dillon <dillon@FreeBSD.org> | 2000-11-23 11:05:14 +0000 |
commit | afce6028188244cc0f57e3169f5cdbb337da6320 (patch) | |
tree | e6c09d6d7160343a2ff2e54c90bcace6c774bff0 /sys | |
parent | a3ee97c4c1fe6bd31b9ed2636c30d9b3d3341da8 (diff) | |
download | FreeBSD-src-afce6028188244cc0f57e3169f5cdbb337da6320.zip FreeBSD-src-afce6028188244cc0f57e3169f5cdbb337da6320.tar.gz |
Forgot to patch this file in file descriptor race fix commit
Submitted-by: "Danny J. Zerkel" <dzerkel@columbus.rr.com>
Diffstat (limited to 'sys')
-rw-r--r-- | sys/compat/svr4/svr4_stream.c | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/sys/compat/svr4/svr4_stream.c b/sys/compat/svr4/svr4_stream.c index da01b24..750e9c9 100644 --- a/sys/compat/svr4/svr4_stream.c +++ b/sys/compat/svr4/svr4_stream.c @@ -162,7 +162,7 @@ svr4_sendit(p, s, mp, flags) struct uio ktruio; #endif - error = getsock(p->p_fd, s, &fp); + error = holdsock(p->p_fd, s, &fp); if (error) return (error); auio.uio_iov = mp->msg_iov; @@ -174,15 +174,20 @@ svr4_sendit(p, s, mp, flags) auio.uio_resid = 0; iov = mp->msg_iov; for (i = 0; i < mp->msg_iovlen; i++, iov++) { - if ((auio.uio_resid += iov->iov_len) < 0) + if ((auio.uio_resid += iov->iov_len) < 0) { + fdrop(fp, p); return (EINVAL); + } } if (mp->msg_name) { error = getsockaddr(&to, mp->msg_name, mp->msg_namelen); - if (error) + if (error) { + fdrop(fp, p); return (error); - } else + } + } else { to = 0; + } if (mp->msg_control) { if (mp->msg_controllen < sizeof(struct cmsghdr)) { error = EINVAL; @@ -192,8 +197,9 @@ svr4_sendit(p, s, mp, flags) mp->msg_controllen, MT_CONTROL); if (error) goto bad; - } else + } else { control = 0; + } #ifdef KTRACE if (KTRPOINT(p, KTR_GENIO)) { int iovlen = auio.uio_iovcnt * sizeof (struct iovec); @@ -229,6 +235,7 @@ svr4_sendit(p, s, mp, flags) bad: if (to) FREE(to, M_SONAME); + fdrop(fp, p); return (error); } @@ -253,7 +260,7 @@ svr4_recvit(p, s, mp, namelenp) struct uio ktruio; #endif - error = getsock(p->p_fd, s, &fp); + error = holdsock(p->p_fd, s, &fp); if (error) return (error); auio.uio_iov = mp->msg_iov; @@ -265,8 +272,10 @@ svr4_recvit(p, s, mp, namelenp) auio.uio_resid = 0; iov = mp->msg_iov; for (i = 0; i < mp->msg_iovlen; i++, iov++) { - if ((auio.uio_resid += iov->iov_len) < 0) + if ((auio.uio_resid += iov->iov_len) < 0) { + fdrop(fp, p); return (EINVAL); + } } #ifdef KTRACE if (KTRPOINT(p, KTR_GENIO)) { @@ -352,6 +361,7 @@ out: FREE(fromsa, M_SONAME); if (control) m_freem(control); + fdrop(fp, p); return (error); } |