Module Name: src Committed By: he Date: Wed Mar 3 08:20:39 UTC 2010
Modified Files: src/sys/compat/common: vfs_syscalls_30.c src/sys/compat/ibcs2: ibcs2_misc.c src/sys/compat/irix: irix_dirent.c src/sys/compat/linux/common: linux_file64.c linux_misc.c src/sys/compat/linux32/common: linux32_dirent.c src/sys/compat/osf1: osf1_file.c src/sys/compat/sunos: sunos_misc.c src/sys/compat/sunos32: sunos32_misc.c src/sys/compat/svr4: svr4_misc.c src/sys/compat/svr4_32: svr4_32_misc.c Log Message: 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.30 -r1.31 src/sys/compat/common/vfs_syscalls_30.c cvs rdiff -u -r1.109 -r1.110 src/sys/compat/ibcs2/ibcs2_misc.c cvs rdiff -u -r1.23 -r1.24 src/sys/compat/irix/irix_dirent.c cvs rdiff -u -r1.49 -r1.50 src/sys/compat/linux/common/linux_file64.c cvs rdiff -u -r1.213 -r1.214 src/sys/compat/linux/common/linux_misc.c cvs rdiff -u -r1.9 -r1.10 src/sys/compat/linux32/common/linux32_dirent.c cvs rdiff -u -r1.37 -r1.38 src/sys/compat/osf1/osf1_file.c cvs rdiff -u -r1.165 -r1.166 src/sys/compat/sunos/sunos_misc.c cvs rdiff -u -r1.68 -r1.69 src/sys/compat/sunos32/sunos32_misc.c cvs rdiff -u -r1.148 -r1.149 src/sys/compat/svr4/svr4_misc.c cvs rdiff -u -r1.67 -r1.68 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.30 src/sys/compat/common/vfs_syscalls_30.c:1.31 --- src/sys/compat/common/vfs_syscalls_30.c:1.30 Mon Jan 26 13:00:04 2009 +++ src/sys/compat/common/vfs_syscalls_30.c Wed Mar 3 08:20:38 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: vfs_syscalls_30.c,v 1.30 2009/01/26 13:00:04 njoly Exp $ */ +/* $NetBSD: vfs_syscalls_30.c,v 1.31 2010/03/03 08:20:38 he 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.30 2009/01/26 13:00:04 njoly Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vfs_syscalls_30.c,v 1.31 2010/03/03 08:20:38 he 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(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.109 src/sys/compat/ibcs2/ibcs2_misc.c:1.110 --- src/sys/compat/ibcs2/ibcs2_misc.c:1.109 Wed Nov 4 21:23:02 2009 +++ src/sys/compat/ibcs2/ibcs2_misc.c Wed Mar 3 08:20:39 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: ibcs2_misc.c,v 1.109 2009/11/04 21:23:02 rmind Exp $ */ +/* $NetBSD: ibcs2_misc.c,v 1.110 2010/03/03 08:20:39 he Exp $ */ /* * Copyright (c) 1992, 1993 @@ -95,7 +95,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ibcs2_misc.c,v 1.109 2009/11/04 21:23:02 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ibcs2_misc.c,v 1.110 2010/03/03 08:20:39 he Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -472,8 +472,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: @@ -602,8 +606,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.24 --- 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 3 08:20:38 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.24 2010/03/03 08:20:38 he 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.24 2010/03/03 08:20:38 he 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.49 src/sys/compat/linux/common/linux_file64.c:1.50 --- src/sys/compat/linux/common/linux_file64.c:1.49 Fri May 15 17:02:54 2009 +++ src/sys/compat/linux/common/linux_file64.c Wed Mar 3 08:20:38 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_file64.c,v 1.49 2009/05/15 17:02:54 pooka Exp $ */ +/* $NetBSD: linux_file64.c,v 1.50 2010/03/03 08:20:38 he 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.49 2009/05/15 17:02:54 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux_file64.c,v 1.50 2010/03/03 08:20:38 he 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.213 src/sys/compat/linux/common/linux_misc.c:1.214 --- src/sys/compat/linux/common/linux_misc.c:1.213 Sat Dec 5 20:11:17 2009 +++ src/sys/compat/linux/common/linux_misc.c Wed Mar 3 08:20:38 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: linux_misc.c,v 1.213 2009/12/05 20:11:17 pooka Exp $ */ +/* $NetBSD: linux_misc.c,v 1.214 2010/03/03 08:20:38 he 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.213 2009/12/05 20:11:17 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux_misc.c,v 1.214 2010/03/03 08:20:38 he Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -803,8 +803,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.9 src/sys/compat/linux32/common/linux32_dirent.c:1.10 --- src/sys/compat/linux32/common/linux32_dirent.c:1.9 Wed Jul 22 15:49:29 2009 +++ src/sys/compat/linux32/common/linux32_dirent.c Wed Mar 3 08:20:38 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: linux32_dirent.c,v 1.9 2009/07/22 15:49:29 njoly Exp $ */ +/* $NetBSD: linux32_dirent.c,v 1.10 2010/03/03 08:20:38 he 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.9 2009/07/22 15:49:29 njoly Exp $"); +__KERNEL_RCSID(0, "$NetBSD: linux32_dirent.c,v 1.10 2010/03/03 08:20:38 he Exp $"); #include <sys/types.h> #include <sys/param.h> @@ -229,8 +229,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/osf1/osf1_file.c diff -u src/sys/compat/osf1/osf1_file.c:1.37 src/sys/compat/osf1/osf1_file.c:1.38 --- src/sys/compat/osf1/osf1_file.c:1.37 Sun Aug 9 22:49:01 2009 +++ src/sys/compat/osf1/osf1_file.c Wed Mar 3 08:20:38 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: osf1_file.c,v 1.37 2009/08/09 22:49:01 haad Exp $ */ +/* $NetBSD: osf1_file.c,v 1.38 2010/03/03 08:20:38 he Exp $ */ /* * Copyright (c) 1999 Christopher G. Demetriou. All rights reserved. @@ -58,7 +58,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: osf1_file.c,v 1.37 2009/08/09 22:49:01 haad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: osf1_file.c,v 1.38 2010/03/03 08:20:38 he Exp $"); #if defined(_KERNEL_OPT) #include "opt_syscall_debug.h" @@ -232,8 +232,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/sunos/sunos_misc.c diff -u src/sys/compat/sunos/sunos_misc.c:1.165 src/sys/compat/sunos/sunos_misc.c:1.166 --- src/sys/compat/sunos/sunos_misc.c:1.165 Mon Jun 29 05:08:16 2009 +++ src/sys/compat/sunos/sunos_misc.c Wed Mar 3 08:20:39 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: sunos_misc.c,v 1.165 2009/06/29 05:08:16 dholland Exp $ */ +/* $NetBSD: sunos_misc.c,v 1.166 2010/03/03 08:20:39 he Exp $ */ /* * Copyright (c) 1992, 1993 @@ -50,7 +50,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sunos_misc.c,v 1.165 2009/06/29 05:08:16 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sunos_misc.c,v 1.166 2010/03/03 08:20:39 he Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -459,8 +459,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.68 src/sys/compat/sunos32/sunos32_misc.c:1.69 --- src/sys/compat/sunos32/sunos32_misc.c:1.68 Tue Mar 2 21:09:21 2010 +++ src/sys/compat/sunos32/sunos32_misc.c Wed Mar 3 08:20:39 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: sunos32_misc.c,v 1.68 2010/03/02 21:09:21 pooka Exp $ */ +/* $NetBSD: sunos32_misc.c,v 1.69 2010/03/03 08:20:39 he 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.68 2010/03/02 21:09:21 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sunos32_misc.c,v 1.69 2010/03/03 08:20:39 he Exp $"); #define COMPAT_SUNOS 1 @@ -696,8 +696,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.148 src/sys/compat/svr4/svr4_misc.c:1.149 --- src/sys/compat/svr4/svr4_misc.c:1.148 Thu Nov 5 18:39:38 2009 +++ src/sys/compat/svr4/svr4_misc.c Wed Mar 3 08:20:38 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: svr4_misc.c,v 1.148 2009/11/05 18:39:38 rafal Exp $ */ +/* $NetBSD: svr4_misc.c,v 1.149 2010/03/03 08:20:38 he 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.148 2009/11/05 18:39:38 rafal Exp $"); +__KERNEL_RCSID(0, "$NetBSD: svr4_misc.c,v 1.149 2010/03/03 08:20:38 he Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -304,8 +304,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: @@ -425,8 +429,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.67 src/sys/compat/svr4_32/svr4_32_misc.c:1.68 --- src/sys/compat/svr4_32/svr4_32_misc.c:1.67 Thu Nov 5 18:39:38 2009 +++ src/sys/compat/svr4_32/svr4_32_misc.c Wed Mar 3 08:20:39 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: svr4_32_misc.c,v 1.67 2009/11/05 18:39:38 rafal Exp $ */ +/* $NetBSD: svr4_32_misc.c,v 1.68 2010/03/03 08:20:39 he 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.67 2009/11/05 18:39:38 rafal Exp $"); +__KERNEL_RCSID(0, "$NetBSD: svr4_32_misc.c,v 1.68 2010/03/03 08:20:39 he Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -304,8 +304,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: @@ -425,8 +429,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: