[lkml]   [2009]   [Jun]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
    Patch in this message
    Subject[patch 60/87] keys: Handle there being no fallback destination keyring for request_key()
    2.6.29-stable review patch.  If anyone has any objections, please let us know.


    From: David Howells <>

    commit 34574dd10b6d0697b86703388d6d6af9cbf4bb48 upstream.

    When request_key() is called, without there being any standard process
    keyrings on which to fall back if a destination keyring is not specified, an
    oops is liable to occur when construct_alloc_key() calls down_write() on
    dest_keyring's semaphore.

    Due to function inlining this may be seen as an oops in down_write() as called
    from request_key_and_link().

    This situation crops up during boot, where request_key() is called from within
    the kernel (such as in CIFS mounts) where nobody is actually logged in, and so
    PAM has not had a chance to create a session keyring and user keyrings to act
    as the fallback.

    To fix this, make construct_alloc_key() not attempt to cache a key if there is
    no fallback key if no destination keyring is given specifically.

    Signed-off-by: David Howells <>
    Tested-by: Jeff Layton <>
    Signed-off-by: Linus Torvalds <>
    Cc: Chuck Ebbert <>
    Signed-off-by: Greg Kroah-Hartman <>

    security/keys/request_key.c | 9 ++++++---
    1 file changed, 6 insertions(+), 3 deletions(-)

    --- a/security/keys/request_key.c
    +++ b/security/keys/request_key.c
    @@ -311,7 +311,8 @@ static int construct_alloc_key(struct ke

    set_bit(KEY_FLAG_USER_CONSTRUCT, &key->flags);

    - down_write(&dest_keyring->sem);
    + if (dest_keyring)
    + down_write(&dest_keyring->sem);

    /* attach the key to the destination keyring under lock, but we do need
    * to do another check just in case someone beat us to it whilst we
    @@ -322,10 +323,12 @@ static int construct_alloc_key(struct ke
    if (!IS_ERR(key_ref))
    goto key_already_present;

    - __key_link(dest_keyring, key);
    + if (dest_keyring)
    + __key_link(dest_keyring, key);

    - up_write(&dest_keyring->sem);
    + if (dest_keyring)
    + up_write(&dest_keyring->sem);
    *_key = key;
    kleave(" = 0 [%d]", key_serial(key));

     \ /
      Last update: 2009-06-09 13:03    [W:0.046 / U:32.720 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site