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: