Module Name: src Committed By: njoly Date: Tue Jul 17 14:22:43 UTC 2012
Modified Files: src/sys/kern: uipc_syscalls.c Log Message: Avoid kmem_alloc KASSERT for 0 byte allocation, when tracing processes that use empty messages with sendmsg/recvmsg. To generate a diff of this commit: cvs rdiff -u -r1.155 -r1.156 src/sys/kern/uipc_syscalls.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/kern/uipc_syscalls.c diff -u src/sys/kern/uipc_syscalls.c:1.155 src/sys/kern/uipc_syscalls.c:1.156 --- src/sys/kern/uipc_syscalls.c:1.155 Fri Jun 22 18:26:35 2012 +++ src/sys/kern/uipc_syscalls.c Tue Jul 17 14:22:42 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: uipc_syscalls.c,v 1.155 2012/06/22 18:26:35 christos Exp $ */ +/* $NetBSD: uipc_syscalls.c,v 1.156 2012/07/17 14:22:42 njoly Exp $ */ /*- * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. @@ -61,7 +61,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: uipc_syscalls.c,v 1.155 2012/06/22 18:26:35 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uipc_syscalls.c,v 1.156 2012/07/17 14:22:42 njoly Exp $"); #include "opt_pipe.h" @@ -604,7 +604,7 @@ do_sys_sendmsg_so(struct lwp *l, int s, } } - if (ktrpoint(KTR_GENIO)) { + if (ktrpoint(KTR_GENIO) && iovsz > 0) { ktriov = kmem_alloc(iovsz, KM_SLEEP); memcpy(ktriov, auio.uio_iov, iovsz); } @@ -634,9 +634,10 @@ do_sys_sendmsg_so(struct lwp *l, int s, *retsize = len - auio.uio_resid; bad: - if (ktriov != NULL) { + if (ktrpoint(KTR_GENIO)) { ktrgeniov(s, UIO_WRITE, ktriov, *retsize, error); - kmem_free(ktriov, iovsz); + if (ktriov != NULL) + kmem_free(ktriov, iovsz); } if (iov != aiov) @@ -897,7 +898,7 @@ static int do_sys_recvmsg_so(struct lwp *l, int s, struct socket *so, struct msghdr *mp, struct mbuf **from, struct mbuf **control, register_t *retsize) { - struct iovec aiov[UIO_SMALLIOV], *iov = aiov, *tiov, *ktriov; + struct iovec aiov[UIO_SMALLIOV], *iov = aiov, *tiov, *ktriov = NULL; struct uio auio; size_t len, iovsz; int i, error; @@ -947,8 +948,7 @@ do_sys_recvmsg_so(struct lwp *l, int s, } } - ktriov = NULL; - if (ktrpoint(KTR_GENIO)) { + if (ktrpoint(KTR_GENIO) && iovsz > 0) { ktriov = kmem_alloc(iovsz, KM_SLEEP); memcpy(ktriov, auio.uio_iov, iovsz); } @@ -964,9 +964,10 @@ do_sys_recvmsg_so(struct lwp *l, int s, /* Some data transferred */ error = 0; - if (ktriov != NULL) { + if (ktrpoint(KTR_GENIO)) { ktrgeniov(s, UIO_READ, ktriov, len, error); - kmem_free(ktriov, iovsz); + if (ktriov != NULL) + kmem_free(ktriov, iovsz); } if (error != 0) {