projects
/
unix-history
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
tags
|
clone url
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
copyin & copyout now return EFAULT and all callers uniformly
[unix-history]
/
usr
/
src
/
sys
/
kern
/
uipc_syscalls.c
diff --git
a/usr/src/sys/kern/uipc_syscalls.c
b/usr/src/sys/kern/uipc_syscalls.c
index
f4b27c3
..
3d83c4b
100644
(file)
--- a/
usr/src/sys/kern/uipc_syscalls.c
+++ b/
usr/src/sys/kern/uipc_syscalls.c
@@
-1,4
+1,4
@@
-/* uipc_syscalls.c 4.3
3 82/10/20
*/
+/* uipc_syscalls.c 4.3
9 82/12/28
*/
#include "../h/param.h"
#include "../h/systm.h"
#include "../h/param.h"
#include "../h/systm.h"
@@
-38,13
+38,13
@@
socket()
goto freeopt;
fp->f_flag = FREAD|FWRITE;
fp->f_type = DTYPE_SOCKET;
goto freeopt;
fp->f_flag = FREAD|FWRITE;
fp->f_type = DTYPE_SOCKET;
- u.u_error = socreate(
0
, &so, uap->type, uap->protocol, &aopt);
+ u.u_error = socreate(
uap->domain
, &so, uap->type, uap->protocol, &aopt);
if (u.u_error)
goto bad;
fp->f_socket = so;
freeopt:
if (uap->opt)
if (u.u_error)
goto bad;
fp->f_socket = so;
freeopt:
if (uap->opt)
- m_free(dtom(aopt.so_optdata));
+
(void)
m_free(dtom(aopt.so_optdata));
return;
bad:
u.u_ofile[u.u_r.r_val1] = 0;
return;
bad:
u.u_ofile[u.u_r.r_val1] = 0;
@@
-83,7
+83,7
@@
bind()
m_freem(nam);
freeopt:
if (uap->opt)
m_freem(nam);
freeopt:
if (uap->opt)
- m_free(dtom(aopt.so_optdata));
+
(void)
m_free(dtom(aopt.so_optdata));
}
listen()
}
listen()
@@
-121,10
+121,10
@@
accept()
if (uap->name == 0)
goto noname;
if (uap->name == 0)
goto noname;
- if (copyin((caddr_t)uap->anamelen, (caddr_t)&namelen, sizeof (namelen))) {
- u.u_error = EFAULT;
+ u.u_error = copyin((caddr_t)uap->anamelen, (caddr_t)&namelen,
+ sizeof (namelen));
+ if (u.u_error)
return;
return;
- }
if (useracc((caddr_t)uap->name, (u_int)namelen, B_WRITE) == 0) {
u.u_error = EFAULT;
return;
if (useracc((caddr_t)uap->name, (u_int)namelen, B_WRITE) == 0) {
u.u_error = EFAULT;
return;
@@
-192,8
+192,8
@@
noname:
fp->f_flag = FREAD|FWRITE;
fp->f_socket = so;
ret:
fp->f_flag = FREAD|FWRITE;
fp->f_socket = so;
ret:
- nam = m_get(M_WAIT);
- soaccept(so, nam, &aopt);
+ nam = m_get(M_WAIT
, MT_SONAME
);
+
(void)
soaccept(so, nam, &aopt);
if (uap->name) {
if (namelen > nam->m_len)
namelen = nam->m_len;
if (uap->name) {
if (namelen > nam->m_len)
namelen = nam->m_len;
@@
-207,7
+207,7
@@
ret:
splx(s);
bad:
if (uap->opt)
splx(s);
bad:
if (uap->opt)
- m_free(dtom(aopt.so_optdata));
+
(void)
m_free(dtom(aopt.so_optdata));
}
connect()
}
connect()
@@
-258,7
+258,7
@@
connect()
bad:
m_freem(nam);
if (uap->opt)
bad:
m_freem(nam);
if (uap->opt)
- m_free(dtom(aopt.so_optdata));
+
(void)
m_free(dtom(aopt.so_optdata));
return;
}
return;
}
@@
-305,6
+305,7
@@
sendto()
if (u.u_error)
goto bad;
u.u_error = sosend(fp->f_socket, to, &auio, uap->flags);
if (u.u_error)
goto bad;
u.u_error = sosend(fp->f_socket, to, &auio, uap->flags);
+ u.u_r.r_val1 = uap->len - auio.uio_resid;
bad:
m_freem(to);
}
bad:
m_freem(to);
}
@@
-342,6
+343,7
@@
send()
if (u.u_error)
return;
u.u_error = sosend(fp->f_socket, (struct mbuf *)0, &auio, uap->flags);
if (u.u_error)
return;
u.u_error = sosend(fp->f_socket, (struct mbuf *)0, &auio, uap->flags);
+ u.u_r.r_val1 = uap->len - auio.uio_resid;
}
recvfrom()
}
recvfrom()
@@
-360,10
+362,10
@@
recvfrom()
struct mbuf *from;
int fromlen;
struct mbuf *from;
int fromlen;
- if (copyin((caddr_t)uap->fromlenaddr, (caddr_t)&fromlen, sizeof (fromlen))) {
- u.u_error = EFAULT;
+ u.u_error = copyin((caddr_t)uap->fromlenaddr, (caddr_t)&fromlen,
+ sizeof (fromlen));
+ if (u.u_error)
return;
return;
- }
fp = getf(uap->s);
if (fp == 0)
return;
fp = getf(uap->s);
if (fp == 0)
return;
@@
-391,16
+393,15
@@
recvfrom()
else {
if (fromlen > from->m_len)
fromlen = from->m_len;
else {
if (fromlen > from->m_len)
fromlen = from->m_len;
- if (copyout(mtod(from, caddr_t), uap->from, (u_int)fromlen)) {
- u.u_error = EFAULT;
+ u.u_error = copyout(mtod(from, caddr_t), uap->from,
+ (u_int)fromlen);
+ if (u.u_error)
goto bad;
goto bad;
- }
}
}
-
if (
copyout((caddr_t)&fromlen, (caddr_t)uap->fromlenaddr,
- sizeof (fromlen))
) {
- u.u_error = EFAULT;
+
u.u_error =
copyout((caddr_t)&fromlen, (caddr_t)uap->fromlenaddr,
+ sizeof (fromlen))
;
+ if (u.u_error)
goto bad;
goto bad;
- }
u.u_r.r_val1 = uap->len - auio.uio_resid;
bad:
if (from)
u.u_r.r_val1 = uap->len - auio.uio_resid;
bad:
if (from)
@@
-467,10
+468,12
@@
pipe()
struct socket *rso, *wso;
int r;
struct socket *rso, *wso;
int r;
- u.u_error = socreate(1, &rso, SOCK_STREAM, 0, (struct socketopt *)0);
+ u.u_error = socreate(AF_UNIX, &rso, SOCK_STREAM, 0,
+ (struct socketopt *)0);
if (u.u_error)
return;
if (u.u_error)
return;
- u.u_error = socreate(1, &wso, SOCK_STREAM, 0, (struct socketopt *)0);
+ u.u_error = socreate(AF_UNIX, &wso, SOCK_STREAM, 0,
+ (struct socketopt *)0);
if (u.u_error)
goto free;
rf = falloc();
if (u.u_error)
goto free;
rf = falloc();
@@
-526,13
+529,13
@@
ssocketaddr()
return;
}
so = fp->f_socket;
return;
}
so = fp->f_socket;
- m = m_getclr(M_WAIT);
+ m = m_getclr(M_WAIT
, MT_SONAME
);
u.u_error =
(*so->so_proto->pr_usrreq)(so, PRU_SOCKADDR, 0, m, 0);
if (u.u_error)
goto bad;
u.u_error =
(*so->so_proto->pr_usrreq)(so, PRU_SOCKADDR, 0, m, 0);
if (u.u_error)
goto bad;
- if (copyout(mtod(m, caddr_t), (caddr_t)uap->asa, sizeof (struct sockaddr)))
-
u.u_error = EFAULT
;
+ u.u_error = copyout(mtod(m, caddr_t), (caddr_t)uap->asa,
+
sizeof (struct sockaddr))
;
bad:
m_freem(m);
}
bad:
m_freem(m);
}
@@
-543,17
+546,18
@@
sockname(aname, name, namelen)
int namelen;
{
register struct mbuf *m;
int namelen;
{
register struct mbuf *m;
+ int error;
if (namelen > MLEN)
return (EINVAL);
if (namelen > MLEN)
return (EINVAL);
- m = m_get(M_WAIT);
+ m = m_get(M_WAIT
, MT_SONAME
);
m->m_len = namelen;
m->m_len = namelen;
- if (copyin(name, mtod(m, caddr_t), (u_int)namelen)) {
+ error = copyin(name, mtod(m, caddr_t), (u_int)namelen);
+ if (error)
(void) m_free(m);
(void) m_free(m);
- return (EFAULT);
- }
- *aname = m;
- return (0);
+ else
+ *aname = m;
+ return (error);
}
sockopt(so, opt)
}
sockopt(so, opt)
@@
-561,21
+565,24
@@
sockopt(so, opt)
caddr_t opt;
{
register struct mbuf *m;
caddr_t opt;
{
register struct mbuf *m;
+ int error;
if (opt == 0) {
so->so_optlen = 0;
so->so_optdata = 0;
return (0);
}
if (opt == 0) {
so->so_optlen = 0;
so->so_optdata = 0;
return (0);
}
- if (copyin((caddr_t)opt, (caddr_t)so, sizeof (struct socketopt)))
- return (EFAULT);
+ error = copyin((caddr_t)opt, (caddr_t)so, sizeof (struct socketopt));
+ if (error)
+ return (error);
if (so->so_optlen < 0 || so->so_optlen > MLEN)
return (EINVAL);
if (so->so_optlen < 0 || so->so_optlen > MLEN)
return (EINVAL);
- m = m_get(M_WAIT);
+ m = m_get(M_WAIT
, MT_SOOPTS
);
m->m_len = so->so_optlen;
m->m_len = so->so_optlen;
- if (copyin(so->so_optdata, mtod(m, caddr_t), (u_int)m->m_len)) {
+ error = copyin(so->so_optdata, mtod(m, caddr_t), (u_int)m->m_len);
+ if (error) {
(void) m_free(m);
(void) m_free(m);
- return (
EFAULT
);
+ return (
error
);
}
so->so_optdata = mtod(m, caddr_t);
return (0);
}
so->so_optdata = mtod(m, caddr_t);
return (0);