Synopsis: Insufficient msg_controllen checking for sendmsg(2)
NetBSD versions: NetBSD-current (NetBSD 1.5A to July 1, 2001)
Thanks to: Jaromir Dolecek and Matt Thomas
Reported in NetBSD Security Advisory: NetBSD-SA2001-011
Index: sys/kern/uipc_syscalls.c
===================================================================
RCS file: /cvsroot/syssrc/sys/kern/uipc_syscalls.c,v
retrieving revision 1.63
retrieving revision 1.64
diff -p -p -c -r1.63 -r1.64
*** sys/kern/uipc_syscalls.c 2001/06/25 20:46:13 1.63
--- sys/kern/uipc_syscalls.c 2001/07/01 20:42:48 1.64
*************** sys_getpeername(struct proc *p, void *v,
*** 1068,1074 ****
* XXX arguments in mbufs, and this could go away.
*/
int
! sockargs(struct mbuf **mp, const void *buf, int buflen, int type)
{
struct sockaddr *sa;
struct mbuf *m;
--- 1068,1074 ----
* XXX arguments in mbufs, and this could go away.
*/
int
! sockargs(struct mbuf **mp, const void *buf, size_t buflen, int type)
{
struct sockaddr *sa;
struct mbuf *m;
*************** sockargs(struct mbuf **mp, const void *b
*** 1076,1089 ****
/*
* We can't allow socket names > UCHAR_MAX in length, since that
! * will overflow sa_len.
*/
! if (type == MT_SONAME && (u_int)buflen > UCHAR_MAX)
return (EINVAL);
/* Allocate an mbuf to hold the arguments. */
m = m_get(M_WAIT, type);
! if ((u_int)buflen > MLEN) {
/*
* Won't fit into a regular mbuf, so we allocate just
* enough external storage to hold the argument.
--- 1076,1090 ----
/*
* We can't allow socket names > UCHAR_MAX in length, since that
! * will overflow sa_len. Control data more than a page size in
! * length is just too much.
*/
! if (buflen > (type == MT_SONAME ? UCHAR_MAX : PAGE_SIZE))
return (EINVAL);
/* Allocate an mbuf to hold the arguments. */
m = m_get(M_WAIT, type);
! if (buflen > MLEN) {
/*
* Won't fit into a regular mbuf, so we allocate just
* enough external storage to hold the argument.
*************** sockargs(struct mbuf **mp, const void *b
*** 1091,1097 ****
MEXTMALLOC(m, buflen, M_WAITOK);
}
m->m_len = buflen;
! error = copyin(buf, mtod(m, caddr_t), (u_int)buflen);
if (error) {
(void) m_free(m);
return (error);
--- 1092,1098 ----
MEXTMALLOC(m, buflen, M_WAITOK);
}
m->m_len = buflen;
! error = copyin(buf, mtod(m, caddr_t), buflen);
if (error) {
(void) m_free(m);
return (error);