• Theodore Ts'o's avatar
    random: fix nasty entropy accounting bug · e33ba5fa
    Theodore Ts'o authored
    Commit 0fb7a01a "random: simplify accounting code", introduced in
    v3.15, has a very nasty accounting problem when the entropy pool has
    has fewer bytes of entropy than the number of requested reserved
    bytes.  In that case, "have_bytes - reserved" goes negative, and since
    size_t is unsigned, the expression:
    
           ibytes = min_t(size_t, ibytes, have_bytes - reserved);
    
    ... does not do the right thing.  This is rather bad, because it
    defeats the catastrophic reseeding feature in the
    xfer_secondary_pool() path.
    
    It also can cause the "BUG: spinlock trylock failure on UP" for some
    kernel configurations when prandom_reseed() calls get_random_bytes()
    in the early init, since when the entropy count gets corrupted,
    credit_entropy_bits() erroneously believes that the nonblocking pool
    has been fully initialized (when in fact it is not), and so it calls
    prandom_reseed(true) recursively leading to the spinlock BUG.
    
    The logic is *not* the same it was originally, but in the cases where
    it matters, the behavior is the same, and the resulting code is
    hopefully easier to read and understand.
    
    Fixes: 0fb7a01a "random: simplify accounting code"
    Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
    Cc: Greg Price <price@mit.edu>
    Cc: stable@vger.kernel.org  #v3.15
    e33ba5fa
random.c 51.5 KB