• Vicențiu Ciorbaru's avatar
    MDEV-29458: Role grant commands do not propagate all grants · 7735ba76
    Vicențiu Ciorbaru authored
    There was an issue in updating in-memory role datastructures when
    propagating role grants.
    
    The issue is that changing a particular role's privilege (on any
    privilege level, global, database, etc.)
    was done such that it overwrote the entire set of bits for that
    particular level of privileges.
    
    For example:
    grant select on *.* to r1 -> sets the access bits to r1 to select,
    regardless of what bits were present for role r1 (inherited from any
    other roles).
    
    Before this fix, the rights of role r1 were propagated to any roles r1
    was granted to, however the propagated rights did *not* include the
    complete rights r1 inherited from its own grants.
    
    For example:
      grant r2 to r1;
      grant select on *.* to r2;
      grant insert on *.* to r1; # This command completely disregards the
                                 # select privilege from r2.
    
    In order to correct this, ensure that before rights are propagated
    onwards, that the current's role rights have been updated from its
    grants.
    
    Additionally, the patch exposed a flaw in the DROP ROLE code.
    When deleting a role we removed all its previous grants, but what
    remained was the actual links of roles granted to the dropped role.
    Having these links present when propagating grants meant that we would
    have leftover ACL_xxx entries.
    
    Ensure that the links are removed before propagating grants.
    7735ba76
sql_acl.cc 427 KB