summaryrefslogtreecommitdiffstats
path: root/sys/compat
diff options
context:
space:
mode:
authordillon <dillon@FreeBSD.org>2000-11-23 11:05:14 +0000
committerdillon <dillon@FreeBSD.org>2000-11-23 11:05:14 +0000
commitafce6028188244cc0f57e3169f5cdbb337da6320 (patch)
treee6c09d6d7160343a2ff2e54c90bcace6c774bff0 /sys/compat
parenta3ee97c4c1fe6bd31b9ed2636c30d9b3d3341da8 (diff)
downloadFreeBSD-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/compat')
-rw-r--r--sys/compat/svr4/svr4_stream.c24
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);
}
OpenPOWER on IntegriCloud