• Sergey Vojtovich's avatar
    BUG#54989 - With null_audit installed, server hangs on an · b51c8cab
    Sergey Vojtovich authored
                attempt to install a plugin twice
    
    Server crashes when [UN]INSTALL PLUGIN fails (returns an
    error) and general log is disabled and there are audit
    plugins interested in MYSQL_AUDIT_GENERAL_CLASS. 
    
    When audit event is triggered, audit subsystem acquires interested
    plugins by walking through plugin list. Evidently plugin list
    iterator protects plugin list by acquiring LOCK_plugin, see
    plugin_foreach_with_mask().
    
    On the other hand [UN]INSTALL PLUGIN is acquiring LOCK_plugin
    rather for a long time.
    
    When audit event is triggered during [UN]INSTALL PLUGIN, plugin
    list iterator acquires the same lock (within the same thread)
    second time.
    
    Repeatable only with general_log disabled, because general_log
    triggers MYSQL_AUDIT_GENERAL_LOG event, which acquires audit
    plugins before [UN]INSTALL PLUGIN acquired LOCK_plugin.
    
    With this fix we pre-acquire audit plugins for events that
    may potentially occur during [UN]INSTALL PLUGIN.
    
    This hack should be removed when LOCK_plugin is fixed so it
    protects only what it supposed to protect.
    
    No test case for this fix - we do not have facility to test
    audit plugins yet.
    
    sql/sql_audit.cc:
      Move "acquire audit plugin" logics to a separate
      function.
    sql/sql_audit.h:
      Move "acquire audit plugin" logics to a separate
      function.
    sql/sql_plugin.cc:
      Pre-acquire audit plugins for events that may potentially occur
      during [UN]INSTALL PLUGIN.
    b51c8cab
sql_audit.cc 11.7 KB