Fix a bug in sendmsg() and two compatibility versions of sendmsg().
authorMatthew Dillon <dillon@dragonflybsd.org>
Sat, 16 Sep 2006 03:37:15 +0000 (03:37 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Sat, 16 Sep 2006 03:37:15 +0000 (03:37 +0000)
iovec_free() should not be called when iovec_copyin() fails.

Reported-by: Ilja van Sprundel
Found-using: A trivial system call fuzzer

sys/emulation/43bsd/43bsd_socket.c
sys/emulation/linux/linux_socket.c
sys/kern/uipc_syscalls.c

index ded64f9..07e541f 100644 (file)
@@ -32,7 +32,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $DragonFly: src/sys/emulation/43bsd/43bsd_socket.c,v 1.8 2006/06/13 21:04:14 dillon Exp $
+ * $DragonFly: src/sys/emulation/43bsd/43bsd_socket.c,v 1.9 2006/09/16 03:37:13 dillon Exp $
  *     from: DragonFly kern/uipc_syscalls.c,v 1.13
  *
  * The original versions of these syscalls used to live in
@@ -233,7 +233,7 @@ sys_osendmsg(struct osendmsg_args *uap)
        error = iovec_copyin(msg.msg_iov, &iov, aiov, msg.msg_iovlen,
                             &auio.uio_resid);
        if (error)
-               goto cleanup;
+               goto cleanup2;
        auio.uio_iov = iov;
        auio.uio_iovcnt = msg.msg_iovlen;
        auio.uio_offset = 0;
@@ -284,9 +284,10 @@ sys_osendmsg(struct osendmsg_args *uap)
            &uap->sysmsg_result);
 
 cleanup:
+       iovec_free(&iov, aiov);
+cleanup2:
        if (sa)
                FREE(sa, M_SONAME);
-       iovec_free(&iov, aiov);
        return (error);
 }
 
index 498fe52..a94d644 100644 (file)
@@ -26,7 +26,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/compat/linux/linux_socket.c,v 1.19.2.8 2001/11/07 20:33:55 marcel Exp $
- * $DragonFly: src/sys/emulation/linux/linux_socket.c,v 1.25 2006/06/13 21:04:15 dillon Exp $
+ * $DragonFly: src/sys/emulation/linux/linux_socket.c,v 1.26 2006/09/16 03:37:15 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -834,7 +834,7 @@ linux_sendmsg(struct linux_sendmsg_args *args, int *res)
        error = iovec_copyin(msg.msg_iov, &iov, aiov, msg.msg_iovlen,
                             &auio.uio_resid);
        if (error)
-               goto cleanup;
+               goto cleanup2;
        auio.uio_iov = iov;
        auio.uio_iovcnt = msg.msg_iovlen;
        auio.uio_offset = 0;
@@ -882,9 +882,10 @@ linux_sendmsg(struct linux_sendmsg_args *args, int *res)
            linux_args.flags, res);
 
 cleanup:
+       iovec_free(&iov, aiov);
+cleanup2:
        if (sa)
                FREE(sa, M_SONAME);
-       iovec_free(&iov, aiov);
        return (error);
 }
 
index 6631a73..b06bcde 100644 (file)
@@ -35,7 +35,7 @@
  *
  *     @(#)uipc_syscalls.c     8.4 (Berkeley) 2/21/94
  * $FreeBSD: src/sys/kern/uipc_syscalls.c,v 1.65.2.17 2003/04/04 17:11:16 tegge Exp $
- * $DragonFly: src/sys/kern/uipc_syscalls.c,v 1.75 2006/09/05 00:55:45 dillon Exp $
+ * $DragonFly: src/sys/kern/uipc_syscalls.c,v 1.76 2006/09/16 03:37:12 dillon Exp $
  */
 
 #include "opt_ktrace.h"
@@ -743,7 +743,7 @@ sys_sendmsg(struct sendmsg_args *uap)
        error = iovec_copyin(msg.msg_iov, &iov, aiov, msg.msg_iovlen,
                             &auio.uio_resid);
        if (error)
-               goto cleanup;
+               goto cleanup2;
        auio.uio_iov = iov;
        auio.uio_iovcnt = msg.msg_iovlen;
        auio.uio_offset = 0;
@@ -778,9 +778,10 @@ sys_sendmsg(struct sendmsg_args *uap)
            &uap->sysmsg_result);
 
 cleanup:
+       iovec_free(&iov, aiov);
+cleanup2:
        if (sa)
                FREE(sa, M_SONAME);
-       iovec_free(&iov, aiov);
        return (error);
 }