Module Name:    src
Committed By:   snj
Date:           Wed Mar 17 02:59:53 UTC 2010

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

Log Message:
Pull up following revision(s) (requested by he in ticket #1323):
        sys/compat/common/vfs_syscalls_30.c: revision 1.31
        sys/compat/ibcs2/ibcs2_misc.c: revision 1.110
        sys/compat/irix/irix_dirent.c: revision 1.24
        sys/compat/linux/common/linux_file64.c: revision 1.50
        sys/compat/linux/common/linux_misc.c: revision 1.214
        sys/compat/linux32/common/linux32_dirent.c: revision 1.10
        sys/compat/sunos/sunos_misc.c: revision 1.166
        sys/compat/sunos32/sunos32_misc.c: revision 1.69
        sys/compat/svr4/svr4_misc.c: revision 1.149
        sys/compat/svr4_32/svr4_32_misc.c: revision 1.68
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.28 -r1.28.6.1 src/sys/compat/common/vfs_syscalls_30.c
cvs rdiff -u -r1.104 -r1.104.6.1 src/sys/compat/ibcs2/ibcs2_misc.c
cvs rdiff -u -r1.23 -r1.23.10.1 src/sys/compat/irix/irix_dirent.c
cvs rdiff -u -r1.48 -r1.48.6.1 src/sys/compat/linux/common/linux_file64.c
cvs rdiff -u -r1.201 -r1.201.6.1 src/sys/compat/linux/common/linux_misc.c
cvs rdiff -u -r1.6 -r1.6.4.1 src/sys/compat/linux32/common/linux32_dirent.c
cvs rdiff -u -r1.161 -r1.161.4.1 src/sys/compat/sunos/sunos_misc.c
cvs rdiff -u -r1.62 -r1.62.4.1 src/sys/compat/sunos32/sunos32_misc.c
cvs rdiff -u -r1.144 -r1.144.6.1 src/sys/compat/svr4/svr4_misc.c
cvs rdiff -u -r1.63 -r1.63.6.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.28 src/sys/compat/common/vfs_syscalls_30.c:1.28.6.1
--- src/sys/compat/common/vfs_syscalls_30.c:1.28	Tue Jun 24 11:18:15 2008
+++ src/sys/compat/common/vfs_syscalls_30.c	Wed Mar 17 02:59:51 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: vfs_syscalls_30.c,v 1.28 2008/06/24 11:18:15 ad Exp $	*/
+/*	$NetBSD: vfs_syscalls_30.c,v 1.28.6.1 2010/03/17 02:59:51 snj Exp $	*/
 
 /*-
  * Copyright (c) 2005, 2008 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_syscalls_30.c,v 1.28 2008/06/24 11:18:15 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_syscalls_30.c,v 1.28.6.1 2010/03/17 02:59:51 snj Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -310,8 +310,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.104 src/sys/compat/ibcs2/ibcs2_misc.c:1.104.6.1
--- src/sys/compat/ibcs2/ibcs2_misc.c:1.104	Tue Jun 24 11:18:15 2008
+++ src/sys/compat/ibcs2/ibcs2_misc.c	Wed Mar 17 02:59:51 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: ibcs2_misc.c,v 1.104 2008/06/24 11:18:15 ad Exp $	*/
+/*	$NetBSD: ibcs2_misc.c,v 1.104.6.1 2010/03/17 02:59:51 snj Exp $	*/
 
 /*
  * Copyright (c) 1992, 1993
@@ -95,7 +95,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ibcs2_misc.c,v 1.104 2008/06/24 11:18:15 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ibcs2_misc.c,v 1.104.6.1 2010/03/17 02:59:51 snj Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -473,8 +473,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:
@@ -603,8 +607,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.23 src/sys/compat/irix/irix_dirent.c:1.23.10.1
--- src/sys/compat/irix/irix_dirent.c:1.23	Mon Apr 28 20:23:41 2008
+++ src/sys/compat/irix/irix_dirent.c	Wed Mar 17 02:59:52 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: irix_dirent.c,v 1.23 2008/04/28 20:23:41 martin Exp $ */
+/*	$NetBSD: irix_dirent.c,v 1.23.10.1 2010/03/17 02:59:52 snj Exp $ */
 
 /*-
  * Copyright (c) 1994, 2001, 2008 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: irix_dirent.c,v 1.23 2008/04/28 20:23:41 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: irix_dirent.c,v 1.23.10.1 2010/03/17 02:59:52 snj Exp $");
 
 #include <sys/types.h>
 #include <sys/signal.h>
@@ -173,8 +173,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:
@@ -324,8 +328,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.48 src/sys/compat/linux/common/linux_file64.c:1.48.6.1
--- src/sys/compat/linux/common/linux_file64.c:1.48	Tue Jun 24 11:18:15 2008
+++ src/sys/compat/linux/common/linux_file64.c	Wed Mar 17 02:59:52 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: linux_file64.c,v 1.48 2008/06/24 11:18:15 ad Exp $	*/
+/*	$NetBSD: linux_file64.c,v 1.48.6.1 2010/03/17 02:59:52 snj Exp $	*/
 
 /*-
  * Copyright (c) 1995, 1998, 2000, 2008 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_file64.c,v 1.48 2008/06/24 11:18:15 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_file64.c,v 1.48.6.1 2010/03/17 02:59:52 snj Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -336,8 +336,12 @@
 	}
 
 	/* if we squished out the whole block, try again */
-	if (outp == (void *)SCARG(uap, dent))
+	if (outp == (void *)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.201 src/sys/compat/linux/common/linux_misc.c:1.201.6.1
--- src/sys/compat/linux/common/linux_misc.c:1.201	Tue Jun 24 11:18:15 2008
+++ src/sys/compat/linux/common/linux_misc.c	Wed Mar 17 02:59:52 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: linux_misc.c,v 1.201 2008/06/24 11:18:15 ad Exp $	*/
+/*	$NetBSD: linux_misc.c,v 1.201.6.1 2010/03/17 02:59:52 snj Exp $	*/
 
 /*-
  * Copyright (c) 1995, 1998, 1999, 2008 The NetBSD Foundation, Inc.
@@ -57,7 +57,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_misc.c,v 1.201 2008/06/24 11:18:15 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_misc.c,v 1.201.6.1 2010/03/17 02:59:52 snj Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_ptrace.h"
@@ -804,8 +804,12 @@
 	}
 
 	/* if we squished out the whole block, try again */
-	if (outp == (void *)SCARG(uap, dent))
+	if (outp == (void *)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/linux32/common/linux32_dirent.c
diff -u src/sys/compat/linux32/common/linux32_dirent.c:1.6 src/sys/compat/linux32/common/linux32_dirent.c:1.6.4.1
--- src/sys/compat/linux32/common/linux32_dirent.c:1.6	Thu Sep  4 17:45:00 2008
+++ src/sys/compat/linux32/common/linux32_dirent.c	Wed Mar 17 02:59:52 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: linux32_dirent.c,v 1.6 2008/09/04 17:45:00 njoly Exp $ */
+/*	$NetBSD: linux32_dirent.c,v 1.6.4.1 2010/03/17 02:59:52 snj Exp $ */
 
 /*-
  * Copyright (c) 2006 Emmanuel Dreyfus, all rights reserved.
@@ -33,7 +33,7 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(0, "$NetBSD: linux32_dirent.c,v 1.6 2008/09/04 17:45:00 njoly Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux32_dirent.c,v 1.6.4.1 2010/03/17 02:59:52 snj Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -227,8 +227,12 @@
 	}
 
 	/* if we squished out the whole block, try again */
-	if (outp == (void *)SCARG_P32(uap, dent))
+	if (outp == (void *)SCARG_P32(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.161 src/sys/compat/sunos/sunos_misc.c:1.161.4.1
--- src/sys/compat/sunos/sunos_misc.c:1.161	Thu Aug  7 20:15:32 2008
+++ src/sys/compat/sunos/sunos_misc.c	Wed Mar 17 02:59:52 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: sunos_misc.c,v 1.161 2008/08/07 20:15:32 plunky Exp $	*/
+/*	$NetBSD: sunos_misc.c,v 1.161.4.1 2010/03/17 02:59:52 snj Exp $	*/
 
 /*
  * Copyright (c) 1992, 1993
@@ -50,7 +50,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sunos_misc.c,v 1.161 2008/08/07 20:15:32 plunky Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sunos_misc.c,v 1.161.4.1 2010/03/17 02:59:52 snj Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_nfsserver.h"
@@ -471,8 +471,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.62 src/sys/compat/sunos32/sunos32_misc.c:1.62.4.1
--- src/sys/compat/sunos32/sunos32_misc.c:1.62	Thu Aug  7 20:15:32 2008
+++ src/sys/compat/sunos32/sunos32_misc.c	Wed Mar 17 02:59:52 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: sunos32_misc.c,v 1.62 2008/08/07 20:15:32 plunky Exp $	*/
+/*	$NetBSD: sunos32_misc.c,v 1.62.4.1 2010/03/17 02:59:52 snj Exp $	*/
 /* from :NetBSD: sunos_misc.c,v 1.107 2000/12/01 19:25:10 jdolecek Exp	*/
 
 /*
@@ -77,7 +77,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sunos32_misc.c,v 1.62 2008/08/07 20:15:32 plunky Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sunos32_misc.c,v 1.62.4.1 2010/03/17 02:59:52 snj Exp $");
 
 #define COMPAT_SUNOS 1
 
@@ -712,8 +712,12 @@
 	}
 
 	/* if we squished out the whole block, try again */
-	if (outp == SCARG_P32(uap, buf))
+	if (outp == SCARG_P32(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.144 src/sys/compat/svr4/svr4_misc.c:1.144.6.1
--- src/sys/compat/svr4/svr4_misc.c:1.144	Tue Jun 24 11:18:15 2008
+++ src/sys/compat/svr4/svr4_misc.c	Wed Mar 17 02:59:52 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: svr4_misc.c,v 1.144 2008/06/24 11:18:15 ad Exp $	 */
+/*	$NetBSD: svr4_misc.c,v 1.144.6.1 2010/03/17 02:59:52 snj Exp $	 */
 
 /*-
  * Copyright (c) 1994, 2008 The NetBSD Foundation, Inc.
@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: svr4_misc.c,v 1.144 2008/06/24 11:18:15 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: svr4_misc.c,v 1.144.6.1 2010/03/17 02:59:52 snj Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -305,8 +305,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:
@@ -426,8 +430,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.63 src/sys/compat/svr4_32/svr4_32_misc.c:1.63.6.1
--- src/sys/compat/svr4_32/svr4_32_misc.c:1.63	Tue Jun 24 11:18:15 2008
+++ src/sys/compat/svr4_32/svr4_32_misc.c	Wed Mar 17 02:59:53 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: svr4_32_misc.c,v 1.63 2008/06/24 11:18:15 ad Exp $	 */
+/*	$NetBSD: svr4_32_misc.c,v 1.63.6.1 2010/03/17 02:59:53 snj Exp $	 */
 
 /*-
  * Copyright (c) 1994, 2008 The NetBSD Foundation, Inc.
@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: svr4_32_misc.c,v 1.63 2008/06/24 11:18:15 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: svr4_32_misc.c,v 1.63.6.1 2010/03/17 02:59:53 snj Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -305,8 +305,12 @@
 	}
 
 	/* if we squished out the whole block, try again */
-	if (outp == SCARG_P32(uap, dp))
+	if (outp == SCARG_P32(uap, dp)) {
+		if (cookiebuf)
+			free(cookiebuf, M_TEMP);
+		cookiebuf = NULL;
 		goto again;
+	}
 	fp->f_offset = off;	/* update the vnode offset */
 
 eof:
@@ -426,8 +430,12 @@
 	}
 
 	/* if we squished out the whole block, try again */
-	if (outp == SCARG_P32(uap, buf))
+	if (outp == SCARG_P32(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