• David Howells's avatar
    KEYS: Fix keyring quota misaccounting on key replacement and unlink · 034faeb9
    David Howells authored
    If a key is displaced from a keyring by a matching one, then four more bytes
    of quota are allocated to the keyring - despite the fact that the keyring does
    not change in size.
    
    Further, when a key is unlinked from a keyring, the four bytes of quota
    allocated the link isn't recovered and returned to the user's pool.
    
    The first can be tested by repeating:
    
    	keyctl add big_key a fred @s
    	cat /proc/key-users
    
    (Don't put it in a shell loop otherwise the garbage collector won't have time
    to clear the displaced keys, thus affecting the result).
    
    This was causing the kerberos keyring to run out of room fairly quickly.
    
    The second can be tested by:
    
    	cat /proc/key-users
    	a=`keyctl add user a a @s`
    	cat /proc/key-users
    	keyctl unlink $a
    	sleep 1 # Give RCU a chance to delete the key
    	cat /proc/key-users
    
    assuming no system activity that otherwise adds/removes keys, the amount of
    key data allocated should go up (say 40/20000 -> 47/20000) and then return to
    the original value at the end.
    Reported-by: default avatarStephen Gallagher <sgallagh@redhat.com>
    Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
    034faeb9
keyring.c 35.4 KB