Module Name:    src
Committed By:   riz
Date:           Sat Jun 12 18:38:02 UTC 2010

Modified Files:
        src/sys/compat/common [netbsd-4]: vfs_syscalls_30.c
        src/sys/compat/ibcs2 [netbsd-4]: ibcs2_misc.c
        src/sys/compat/irix [netbsd-4]: irix_dirent.c
        src/sys/compat/linux/common [netbsd-4]: linux_file64.c linux_misc.c
        src/sys/compat/sunos [netbsd-4]: sunos_misc.c
        src/sys/compat/sunos32 [netbsd-4]: sunos32_misc.c
        src/sys/compat/svr4 [netbsd-4]: svr4_misc.c
        src/sys/compat/svr4_32 [netbsd-4]: svr4_32_misc.c

Log Message:
Pull up following revision(s) (requested by he in ticket #1387):
        sys/compat/svr4/svr4_misc.c: revision 1.149
        sys/compat/linux/common/linux_misc.c: revision 1.214
        sys/compat/common/vfs_syscalls_30.c: revision 1.31
        sys/compat/sunos/sunos_misc.c: revision 1.166
        sys/compat/linux/common/linux_file64.c: revision 1.50
        sys/compat/svr4_32/svr4_32_misc.c: revision 1.68
        sys/compat/ibcs2/ibcs2_misc.c: revision 1.110
        sys/compat/linux32/common/linux32_dirent.c: revision 1.10
        sys/compat/sunos32/sunos32_misc.c: revision 1.69
        sys/compat/irix/irix_dirent.c: revision 1.24
        sys/compat/osf1/osf1_file.c: revision 1.38
When implementing "read directory", when there are too many empty entries
in a row, and we need to try to read the next block, and have passed a
non-NULL cookie pointer to VOP_READDIR, ensure that we free the cookie
buffer before re-doing VOP_READDIR, so that we don't leak memory.
This fix is similar to nfs_serv.c revisions 1.115 + 1.124.
This should fix the long-standing problem observed by e.g. using Linux-
emulated programs to take backup of servers, which is one of the problems
which were reported in PR#42661.
Thanks to pooka@ for the hints for traversing the VOP* layer.


To generate a diff of this commit:
cvs rdiff -u -r1.18 -r1.18.2.1 src/sys/compat/common/vfs_syscalls_30.c
cvs rdiff -u -r1.81 -r1.81.2.1 src/sys/compat/ibcs2/ibcs2_misc.c
cvs rdiff -u -r1.16 -r1.16.18.1 src/sys/compat/irix/irix_dirent.c
cvs rdiff -u -r1.34 -r1.34.8.1 src/sys/compat/linux/common/linux_file64.c
cvs rdiff -u -r1.165.2.2 -r1.165.2.3 src/sys/compat/linux/common/linux_misc.c
cvs rdiff -u -r1.143 -r1.143.2.1 src/sys/compat/sunos/sunos_misc.c
cvs rdiff -u -r1.42 -r1.42.2.1 src/sys/compat/sunos32/sunos32_misc.c
cvs rdiff -u -r1.121 -r1.121.2.1 src/sys/compat/svr4/svr4_misc.c
cvs rdiff -u -r1.39 -r1.39.2.1 src/sys/compat/svr4_32/svr4_32_misc.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/common/vfs_syscalls_30.c
diff -u src/sys/compat/common/vfs_syscalls_30.c:1.18 src/sys/compat/common/vfs_syscalls_30.c:1.18.2.1
--- src/sys/compat/common/vfs_syscalls_30.c:1.18	Thu Nov 16 01:32:41 2006
+++ src/sys/compat/common/vfs_syscalls_30.c	Sat Jun 12 18:38:01 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: vfs_syscalls_30.c,v 1.18 2006/11/16 01:32:41 christos Exp $	*/
+/*	$NetBSD: vfs_syscalls_30.c,v 1.18.2.1 2010/06/12 18:38:01 riz Exp $	*/
 
 /*-
  * Copyright (c) 2005 The NetBSD Foundation, Inc.
@@ -36,7 +36,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_syscalls_30.c,v 1.18 2006/11/16 01:32:41 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_syscalls_30.c,v 1.18.2.1 2010/06/12 18:38:01 riz Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -335,8 +335,12 @@
 	}
 
 	/* if we squished out the whole block, try again */
-	if (outp == SCARG(uap, buf))
+	if (outp == SCARG(uap, buf)) {
+		if (cookiebuf)
+			free(cookiebuf, M_TEMP);
+		cookiebuf = NULL;
 		goto again;
+	}
 	fp->f_offset = off;	/* update the vnode offset */
 
 eof:

Index: src/sys/compat/ibcs2/ibcs2_misc.c
diff -u src/sys/compat/ibcs2/ibcs2_misc.c:1.81 src/sys/compat/ibcs2/ibcs2_misc.c:1.81.2.1
--- src/sys/compat/ibcs2/ibcs2_misc.c:1.81	Thu Nov 16 01:32:42 2006
+++ src/sys/compat/ibcs2/ibcs2_misc.c	Sat Jun 12 18:38:01 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: ibcs2_misc.c,v 1.81 2006/11/16 01:32:42 christos Exp $	*/
+/*	$NetBSD: ibcs2_misc.c,v 1.81.2.1 2010/06/12 18:38:01 riz Exp $	*/
 
 /*
  * Copyright (c) 1992, 1993
@@ -95,7 +95,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ibcs2_misc.c,v 1.81 2006/11/16 01:32:42 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ibcs2_misc.c,v 1.81.2.1 2010/06/12 18:38:01 riz Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -504,8 +504,12 @@
 	}
 
 	/* if we squished out the whole block, try again */
-	if (outp == SCARG(uap, buf))
+	if (outp == SCARG(uap, buf)) {
+		if (cookiebuf)
+			free(cookiebuf, M_TEMP);
+		cookiebuf = NULL;
 		goto again;
+	}
 	fp->f_offset = off;	/* update the vnode offset */
 
 eof:
@@ -638,8 +642,12 @@
 		resid -= ibcs2_reclen;
 	}
 	/* if we squished out the whole block, try again */
-	if (outp == SCARG(uap, buf))
+	if (outp == SCARG(uap, buf)) {
+		if (cookiebuf)
+			free(cookiebuf, M_TEMP);
+		cookiebuf = NULL;
 		goto again;
+	}
 	fp->f_offset = off;		/* update the vnode offset */
 eof:
 	*retval = SCARG(uap, nbytes) - resid;

Index: src/sys/compat/irix/irix_dirent.c
diff -u src/sys/compat/irix/irix_dirent.c:1.16 src/sys/compat/irix/irix_dirent.c:1.16.18.1
--- src/sys/compat/irix/irix_dirent.c:1.16	Wed Mar  1 12:38:12 2006
+++ src/sys/compat/irix/irix_dirent.c	Sat Jun 12 18:38:01 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: irix_dirent.c,v 1.16 2006/03/01 12:38:12 yamt Exp $ */
+/*	$NetBSD: irix_dirent.c,v 1.16.18.1 2010/06/12 18:38:01 riz Exp $ */
 
 /*-
  * Copyright (c) 1994, 2001 The NetBSD Foundation, Inc.
@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: irix_dirent.c,v 1.16 2006/03/01 12:38:12 yamt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: irix_dirent.c,v 1.16.18.1 2010/06/12 18:38:01 riz Exp $");
 
 #include <sys/types.h>
 #include <sys/signal.h>
@@ -184,8 +184,12 @@
 	}
 
 	/* if we squished out the whole block, try again */
-	if (outp == (char *)SCARG(uap, buf))
+	if (outp == (char *)SCARG(uap, buf)) {
+		if (cookiebuf)
+			free(cookiebuf, M_TEMP);
+		cookiebuf = NULL;
 		goto again;
+	}
 	fp->f_offset = off;	/* update the vnode offset */
 
 eof:
@@ -342,8 +346,12 @@
 	}
 
 	/* if we squished out the whole block, try again */
-	if (outp == (char *)SCARG(uap, buf))
+	if (outp == (char *)SCARG(uap, buf)) {
+		if (cookiebuf)
+			free(cookiebuf, M_TEMP);
+		cookiebuf = NULL;
 		goto again;
+	}
 	fp->f_offset = off;	/* update the vnode offset */
 
 eof:

Index: src/sys/compat/linux/common/linux_file64.c
diff -u src/sys/compat/linux/common/linux_file64.c:1.34 src/sys/compat/linux/common/linux_file64.c:1.34.8.1
--- src/sys/compat/linux/common/linux_file64.c:1.34	Sun Jul 23 22:06:09 2006
+++ src/sys/compat/linux/common/linux_file64.c	Sat Jun 12 18:38:00 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: linux_file64.c,v 1.34 2006/07/23 22:06:09 ad Exp $	*/
+/*	$NetBSD: linux_file64.c,v 1.34.8.1 2010/06/12 18:38:00 riz Exp $	*/
 
 /*-
  * Copyright (c) 1995, 1998, 2000 The NetBSD Foundation, Inc.
@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_file64.c,v 1.34 2006/07/23 22:06:09 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_file64.c,v 1.34.8.1 2010/06/12 18:38:00 riz Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -517,8 +517,12 @@
 	}
 
 	/* if we squished out the whole block, try again */
-	if (outp == (caddr_t)SCARG(uap, dent))
+	if (outp == (caddr_t)SCARG(uap, dent)) {
+		if (cookiebuf)
+			free(cookiebuf, M_TEMP);
+		cookiebuf = NULL;
 		goto again;
+	}
 	fp->f_offset = off;	/* update the vnode offset */
 
 eof:

Index: src/sys/compat/linux/common/linux_misc.c
diff -u src/sys/compat/linux/common/linux_misc.c:1.165.2.2 src/sys/compat/linux/common/linux_misc.c:1.165.2.3
--- src/sys/compat/linux/common/linux_misc.c:1.165.2.2	Fri Apr 20 20:26:04 2007
+++ src/sys/compat/linux/common/linux_misc.c	Sat Jun 12 18:38:00 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: linux_misc.c,v 1.165.2.2 2007/04/20 20:26:04 bouyer Exp $	*/
+/*	$NetBSD: linux_misc.c,v 1.165.2.3 2010/06/12 18:38:00 riz Exp $	*/
 
 /*-
  * Copyright (c) 1995, 1998, 1999 The NetBSD Foundation, Inc.
@@ -64,7 +64,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_misc.c,v 1.165.2.2 2007/04/20 20:26:04 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_misc.c,v 1.165.2.3 2010/06/12 18:38:00 riz Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_ptrace.h"
@@ -899,8 +899,12 @@
 	}
 
 	/* if we squished out the whole block, try again */
-	if (outp == (caddr_t)SCARG(uap, dent))
+	if (outp == (caddr_t)SCARG(uap, dent)) {
+		if (cookiebuf)
+			free(cookiebuf, M_TEMP);
+		cookiebuf = NULL;
 		goto again;
+	}
 	fp->f_offset = off;	/* update the vnode offset */
 
 	if (oldcall)

Index: src/sys/compat/sunos/sunos_misc.c
diff -u src/sys/compat/sunos/sunos_misc.c:1.143 src/sys/compat/sunos/sunos_misc.c:1.143.2.1
--- src/sys/compat/sunos/sunos_misc.c:1.143	Tue Nov 14 13:34:30 2006
+++ src/sys/compat/sunos/sunos_misc.c	Sat Jun 12 18:38:01 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: sunos_misc.c,v 1.143 2006/11/14 13:34:30 elad Exp $	*/
+/*	$NetBSD: sunos_misc.c,v 1.143.2.1 2010/06/12 18:38:01 riz Exp $	*/
 
 /*
  * Copyright (c) 1992, 1993
@@ -50,7 +50,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sunos_misc.c,v 1.143 2006/11/14 13:34:30 elad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sunos_misc.c,v 1.143.2.1 2010/06/12 18:38:01 riz Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_nfsserver.h"
@@ -594,8 +594,12 @@
 	}
 
 	/* if we squished out the whole block, try again */
-	if (outp == SCARG(uap, buf))
+	if (outp == SCARG(uap, buf)) {
+		if (cookiebuf)
+			free(cookiebuf, M_TEMP);
+		cookiebuf = NULL;
 		goto again;
+	}
 	fp->f_offset = off;		/* update the vnode offset */
 
 eof:

Index: src/sys/compat/sunos32/sunos32_misc.c
diff -u src/sys/compat/sunos32/sunos32_misc.c:1.42 src/sys/compat/sunos32/sunos32_misc.c:1.42.2.1
--- src/sys/compat/sunos32/sunos32_misc.c:1.42	Tue Nov 14 13:34:30 2006
+++ src/sys/compat/sunos32/sunos32_misc.c	Sat Jun 12 18:38:01 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: sunos32_misc.c,v 1.42 2006/11/14 13:34:30 elad Exp $	*/
+/*	$NetBSD: sunos32_misc.c,v 1.42.2.1 2010/06/12 18:38:01 riz Exp $	*/
 /* from :NetBSD: sunos_misc.c,v 1.107 2000/12/01 19:25:10 jdolecek Exp	*/
 
 /*
@@ -79,7 +79,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sunos32_misc.c,v 1.42 2006/11/14 13:34:30 elad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sunos32_misc.c,v 1.42.2.1 2010/06/12 18:38:01 riz Exp $");
 
 #define COMPAT_SUNOS 1
 
@@ -821,8 +821,12 @@
 	}
 
 	/* if we squished out the whole block, try again */
-	if (outp == (caddr_t)(u_long)SCARG(uap, buf))
+	if (outp == (caddr_t)(u_long)SCARG(uap, buf)) {
+		if (cookiebuf)
+			free(cookiebuf, M_TEMP);
+		cookiebuf = NULL;
 		goto again;
+	}
 	fp->f_offset = off;		/* update the vnode offset */
 
 eof:

Index: src/sys/compat/svr4/svr4_misc.c
diff -u src/sys/compat/svr4/svr4_misc.c:1.121 src/sys/compat/svr4/svr4_misc.c:1.121.2.1
--- src/sys/compat/svr4/svr4_misc.c:1.121	Thu Nov 16 01:32:44 2006
+++ src/sys/compat/svr4/svr4_misc.c	Sat Jun 12 18:38:00 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: svr4_misc.c,v 1.121 2006/11/16 01:32:44 christos Exp $	 */
+/*	$NetBSD: svr4_misc.c,v 1.121.2.1 2010/06/12 18:38:00 riz Exp $	 */
 
 /*-
  * Copyright (c) 1994 The NetBSD Foundation, Inc.
@@ -44,7 +44,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: svr4_misc.c,v 1.121 2006/11/16 01:32:44 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: svr4_misc.c,v 1.121.2.1 2010/06/12 18:38:00 riz Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -358,8 +358,12 @@
 	}
 
 	/* if we squished out the whole block, try again */
-	if (outp == (char *) SCARG(uap, dp))
+	if (outp == (char *) SCARG(uap, dp)) {
+		if (cookiebuf)
+			free(cookiebuf, M_TEMP);
+		cookiebuf = NULL;
 		goto again;
+	}
 	fp->f_offset = off;	/* update the vnode offset */
 
 eof:
@@ -484,8 +488,12 @@
 	}
 
 	/* if we squished out the whole block, try again */
-	if (outp == SCARG(uap, buf))
+	if (outp == SCARG(uap, buf)) {
+		if (cookiebuf)
+			free(cookiebuf, M_TEMP);
+		cookiebuf = NULL;
 		goto again;
+	}
 	fp->f_offset = off;	/* update the vnode offset */
 
 eof:

Index: src/sys/compat/svr4_32/svr4_32_misc.c
diff -u src/sys/compat/svr4_32/svr4_32_misc.c:1.39 src/sys/compat/svr4_32/svr4_32_misc.c:1.39.2.1
--- src/sys/compat/svr4_32/svr4_32_misc.c:1.39	Mon Oct 16 20:18:55 2006
+++ src/sys/compat/svr4_32/svr4_32_misc.c	Sat Jun 12 18:38:01 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: svr4_32_misc.c,v 1.39 2006/10/16 20:18:55 martin Exp $	 */
+/*	$NetBSD: svr4_32_misc.c,v 1.39.2.1 2010/06/12 18:38:01 riz Exp $	 */
 
 /*-
  * Copyright (c) 1994 The NetBSD Foundation, Inc.
@@ -44,7 +44,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: svr4_32_misc.c,v 1.39 2006/10/16 20:18:55 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: svr4_32_misc.c,v 1.39.2.1 2010/06/12 18:38:01 riz Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -365,8 +365,12 @@
 	}
 
 	/* if we squished out the whole block, try again */
-	if (outp == (char *)(u_long) SCARG(uap, dp))
+	if (outp == (char *)(u_long) SCARG(uap, dp)) {
+		if (cookiebuf)
+			free(cookiebuf, M_TEMP);
+		cookiebuf = NULL;
 		goto again;
+	}
 	fp->f_offset = off;	/* update the vnode offset */
 
 eof:
@@ -491,8 +495,12 @@
 	}
 
 	/* if we squished out the whole block, try again */
-	if (outp == (caddr_t)(u_long)SCARG(uap, buf))
+	if (outp == (caddr_t)(u_long)SCARG(uap, buf)) {
+		if (cookiebuf)
+			free(cookiebuf, M_TEMP);
+		cookiebuf = NULL;
 		goto again;
+	}
 	fp->f_offset = off;	/* update the vnode offset */
 
 eof:

Reply via email to