KEYS: Fix __key_link_end() quota fixup on error
authorDavid Howells <dhowells@redhat.com>
Tue, 25 Jan 2011 16:34:28 +0000 (16:34 +0000)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 25 Jan 2011 22:58:20 +0000 (08:58 +1000)
commitceb73c12047b8d543570b23353e7848eb7c540a1
treea637dc88d418be1b705a66bea375af955bd14e22
parentf5c66d70ac2a9016a7ad481bd37e39afd7dd7369
KEYS: Fix __key_link_end() quota fixup on error

Fix __key_link_end()'s attempt to fix up the quota if an error occurs.

There are two erroneous cases: Firstly, we always decrease the quota if
the preallocated replacement keyring needs cleaning up, irrespective of
whether or not we should (we may have replaced a pointer rather than
adding another pointer).

Secondly, we never clean up the quota if we added a pointer without the
keyring storage being extended (we allocate multiple pointers at a time,
even if we're not going to use them all immediately).

We handle this by setting the bottom bit of the preallocation pointer in
__key_link_begin() to indicate that the quota needs fixing up, which is
then passed to __key_link() (which clears the whole thing) and
__key_link_end().

Signed-off-by: David Howells <dhowells@redhat.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
security/keys/internal.h
security/keys/key.c
security/keys/keyring.c
security/keys/request_key.c