Module Name: src Committed By: rtr Date: Sat May 23 15:27:55 UTC 2015
Modified Files: src/sys/compat/svr4: svr4_stream.c Log Message: get rid of unnecessary use of mbuf to hold sockaddr, which was leaked... while here change use to typed pointer sockaddr * instead of void * which also lets us get rid of sasize variable used to track length (since we can now use sa_len easily) To generate a diff of this commit: cvs rdiff -u -r1.85 -r1.86 src/sys/compat/svr4/svr4_stream.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/compat/svr4/svr4_stream.c diff -u src/sys/compat/svr4/svr4_stream.c:1.85 src/sys/compat/svr4/svr4_stream.c:1.86 --- src/sys/compat/svr4/svr4_stream.c:1.85 Sat May 2 17:18:03 2015 +++ src/sys/compat/svr4/svr4_stream.c Sat May 23 15:27:55 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: svr4_stream.c,v 1.85 2015/05/02 17:18:03 rtr Exp $ */ +/* $NetBSD: svr4_stream.c,v 1.86 2015/05/23 15:27:55 rtr Exp $ */ /*- * Copyright (c) 1994, 2008 The NetBSD Foundation, Inc. @@ -39,7 +39,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: svr4_stream.c,v 1.85 2015/05/02 17:18:03 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: svr4_stream.c,v 1.86 2015/05/23 15:27:55 rtr Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -1366,16 +1366,14 @@ int svr4_sys_putmsg(struct lwp *l, const struct svr4_sys_putmsg_args *uap, register_t *retval) { struct proc *p = l->l_proc; + struct sockaddr *skp; file_t *fp; struct svr4_strbuf dat, ctl; struct svr4_strmcmd sc; struct sockaddr_in sain; struct sockaddr_un saun; - void *skp; - int sasize; struct svr4_strm *st; int error; - struct mbuf *nam; struct msghdr msg; struct iovec aiov; @@ -1454,8 +1452,7 @@ svr4_sys_putmsg(struct lwp *l, const str goto out; } netaddr_to_sockaddr_in(&sain, &sc); - skp = &sain; - sasize = sizeof(sain); + skp = (struct sockaddr *)&sain; error = sain.sin_family != st->s_family; break; @@ -1471,13 +1468,14 @@ svr4_sys_putmsg(struct lwp *l, const str /* Maybe we've been given a device/inode pair */ dev_t *dev = SVR4_ADDROF(&sc); svr4_ino_t *ino = (svr4_ino_t *) &dev[1]; - skp = svr4_find_socket(p, fp, *dev, *ino); + skp = (struct sockaddr *)svr4_find_socket( + p, fp, *dev, *ino); if (skp == NULL) { - skp = &saun; + skp = (struct sockaddr *)&saun; /* I guess we have it by name */ - netaddr_to_sockaddr_un(skp, &sc); + netaddr_to_sockaddr_un( + (struct sockaddr_un *)skp, &sc); } - sasize = sizeof(saun); } break; @@ -1488,24 +1486,19 @@ svr4_sys_putmsg(struct lwp *l, const str goto out; } - nam = m_get(M_WAIT, MT_SONAME); - nam->m_len = sasize; - memcpy(mtod(nam, void *), skp, sasize); - switch (st->s_cmd = sc.cmd) { case SVR4_TI_CONNECT_REQUEST: /* connect */ KERNEL_UNLOCK_ONE(NULL); - return do_sys_connect(l, SCARG(uap, fd), - mtod(nam, struct sockaddr *)); + return do_sys_connect(l, SCARG(uap, fd), skp); case SVR4_TI_SENDTO_REQUEST: /* sendto */ KERNEL_UNLOCK_ONE(NULL); - msg.msg_name = nam; - msg.msg_namelen = sasize; + msg.msg_name = skp; + msg.msg_namelen = skp->sa_len; msg.msg_iov = &aiov; msg.msg_iovlen = 1; msg.msg_control = NULL; - msg.msg_flags = MSG_NAMEMBUF; + msg.msg_flags = 0; aiov.iov_base = NETBSD32PTR(dat.buf); aiov.iov_len = dat.len; error = do_sys_sendmsg(l, SCARG(uap, fd), &msg, @@ -1513,9 +1506,7 @@ svr4_sys_putmsg(struct lwp *l, const str *retval = 0; return error; - default: - m_free(nam); DPRINTF(("putmsg: Unimplemented command %lx\n", sc.cmd)); error = ENOSYS; goto out;