[Lucid, Maverick, Natty] SRU: Fix panic after nfs_umount
Andy Whitcroft
apw at canonical.com
Thu Dec 9 17:27:29 UTC 2010
On Thu, Dec 09, 2010 at 04:58:41PM +0100, Stefan Bader wrote:
> SRU justification:
>
> Impact: When trying to mount an export where server and client have no common
> authentication method, the client will abort the mount by sending an advisory
> unmount message to the server. A bug in the RPC client setup causes the sunrpc
> code to access memory outside an allocated array, which will sooner or later
> cause the kernel to crash.
>
> Fix: Patch from upstream (about to be submitted and targeted for stable too)
> changes the setup to use the actual array size instead of a manually entered number.
>
> Testcase:
>
> Server exports a mount with an authentication method the client does not
> support, eg.:
> [/etc/exports] /srv/foo *(rw,sec=krb5)
>
> Client tries to mount this directory with no special authentication method:
> while true; do mount <server>:/srv/foo /mnt; sync; sleep 1; done
>
> *Note*: This fix is not upstream yet, but is likely to go upstream in that form.
> I just wanted to start the SRU process early due to the fact that it triggers
> quite easily and ends in an odd and fatal mess. It is obvious enough to me and
> has been tested locally.
>
> The change causing the regression has been added in the 2.6.32 time. So all
> kernels between that and now are affected.
>
> -Stefan
> From dcc0a9d5d9490680ea9faa7b90de3224c3aba7e3 Mon Sep 17 00:00:00 2001
> From: Chuck Lever <chuck.lever at oracle.com>
> Date: Wed, 8 Dec 2010 19:07:12 -0500
> Subject: [PATCH] NFS: Fix panic after nfs_umount()
>
> After a few unsuccessful NFS mount attempts in which the client and
> server cannot agree on an authentication flavor both support, the
> client panics. nfs_umount() is invoked in the kernel in this case.
>
> Turns out this particular UMNT RPC invocation causes the RPC client to
> write off the end of the rpc_clnt's iostat array. This is because the
> mount client's nrprocs field is initialized with the count of defined
> procedures (two: MNT and UMNT), rather than the size of the client's
> proc array (four).
>
> The fix is to use the same initialization technique used by most other
> upper layer clients in the kernel.
>
> Introduced by commit 0b524123, which failed to update nrprocs when it
> added support for UMNT.
>
> BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=24302
> BugLink: http://bugs.launchpad.net/bugs/683938
>
> Reported-by: Stefan Bader <stefan.bader at canonical.com>
> Tested-by: Stefan Bader <stefan.bader at canonical.com>
> CC: stable at kernel.org # >= 2.6.32
> Signed-off-by: Chuck Lever <chuck.lever at oracle.com>
> ---
> fs/nfs/mount_clnt.c | 4 ++--
> 1 files changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/fs/nfs/mount_clnt.c b/fs/nfs/mount_clnt.c
> index 59047f8..50552c5 100644
> --- a/fs/nfs/mount_clnt.c
> +++ b/fs/nfs/mount_clnt.c
> @@ -503,13 +503,13 @@ static struct rpc_procinfo mnt3_procedures[] = {
>
> static struct rpc_version mnt_version1 = {
> .number = 1,
> - .nrprocs = 2,
> + .nrprocs = ARRAY_SIZE(mnt_procedures),
> .procs = mnt_procedures,
> };
>
> static struct rpc_version mnt_version3 = {
> .number = 3,
> - .nrprocs = 2,
> + .nrprocs = ARRAY_SIZE(mnt_procedures),
> .procs = mnt3_procedures,
In this one I think the ARRAY_SIZE should reference mnt3_procedures. A
quick visual check says that actually they are the same size so the code
will work as it is, but I suspect it is wrong.
Stefan as you have the upstream link could you check.
-apw
More information about the kernel-team
mailing list