• Dmitry Lenev's avatar
    Fix for bug#36544 "DROP USER does not remove stored function · b169b8d8
    Dmitry Lenev authored
    privileges".
    
    The first problem was that DROP USER didn't properly remove privileges 
    on stored functions from in-memory structures. So the dropped user
    could have called stored functions on which he had privileges before
    being dropped while his connection was still around.
    Even worse if a new user with the same name was created he would
    inherit privileges on stored functions from the dropped user.
    Similar thing happened with old user name and function privileges
    during RENAME USER.
    
    This problem stemmed from the fact that the handle_grant_data() function
    which handled DROP/RENAME USER didn't take any measures to update
    in-memory hash with information about function privileges after
    updating them on disk.
    
    This patch solves this problem by adding code doing just that.
    
    The second problem was that RENAME USER didn't properly update in-memory
    structures describing table-level privileges and privileges on stored 
    procedures. As result such privileges could have been lost after a rename
    (i.e. not associated with the new name of user) and inherited by a new
    user with the same name as the old name of the original user.
    
    This problem was caused by code handling RENAME USER in
    handle_grant_struct() which [sic!]:
    a) tried to update wrong (tables) hash when updating stored procedure
       privileges for new user name.
    b) passed wrong arguments to function performing the hash update and
       didn't take into account the way in which such update could have
       changed the order of the hash elements.
    
    This patch solves this problem by ensuring that a) the correct hash
    is updated, b) correct arguments are used for the hash_update()
    function and c) we take into account possible changes in the order
    of hash elements.
    
    mysql-test/r/grant.result:
      Added test coverage for bug#36544 "DROP USER does not remove stored
      function privileges".
    mysql-test/suite/funcs_1/r/innodb_storedproc_06.result:
      Since after fixing bug#36544 "DROP USER does not remove stored function
      privileges" in-memory structures are correctly updated by DROP USER,
      DROP FUNCTION performed after DROP USER for its definer no longer
      produces unwarranted warning/error messages.
    mysql-test/suite/funcs_1/r/memory_storedproc_06.result:
      Since after fixing bug#36544 "DROP USER does not remove stored function
      privileges" in-memory structures are correctly updated by DROP USER,
      DROP FUNCTION performed after DROP USER for its definer no longer
      produces unwarranted warning/error messages.
    mysql-test/suite/funcs_1/r/myisam_storedproc_06.result:
      Since after fixing bug#36544 "DROP USER does not remove stored function
      privileges" in-memory structures are correctly updated by DROP USER,
      DROP FUNCTION performed after DROP USER for its definer no longer
      produces unwarranted warning/error messages.
    mysql-test/t/grant.test:
      Added test coverage for bug#36544 "DROP USER does not remove stored
      function privileges".
    sql/sql_acl.cc:
      Changed handle_grant_data() to also update hash with function 
      privileges. This allows DROP/RENAME USER correctly keep this 
      in-memory structure up-to-date.
      
      To do this extended handle_grant_struct() to support updating of this
      hash. In addition fixed code in this function which is responsible for 
      handling of column and routine hashes during RENAME USER, ensured that
      we correctly update these hashes after changing user name and that we
      don't skip elements while iterating through the hash and doing updates.
    b169b8d8
sql_acl.cc 186 KB