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: