• Davi Arnaut's avatar
    Bug#51023: Mysql server crashes on SIGHUP and destroys InnoDB files · 82dade88
    Davi Arnaut authored
    From a user perspective, the problem is that a FLUSH LOGS or SIGHUP
    signal could end up associating the stdout and stderr to random
    files. In the case of this bug report, the streams would end up
    associated to InnoDB ibd files.
    
    The freopen(3) function is not thread-safe on FreeBSD. What this
    means is that if another thread calls open(2) during freopen()
    is executing that another thread's fd returned by open(2) may get
    re-associated with the file being passed to freopen(3). See FreeBSD
    PR number 79887 for reference:
    
      http://www.freebsd.org/cgi/query-pr.cgi?pr=79887
    
    This problem is worked around by substituting a internal hook within
    the FILE structure. This avoids the loss of atomicity by not having
    the original fd closed before its duplicated.
    
    Patch based on the original work by Vasil Dimov.
    
    include/my_sys.h:
      Export my_freopen.
    mysys/my_fopen.c:
      Add a my_freopen abstraction to workaround bugs in specific OSes.
      Add a prototype for getosreldate() as older FreeBSD versions did
      not define one.
    sql/log.cc:
      Move freopen abstraction code over to mysys.
      The streams are now only reopened for writing.
    82dade88
my_fopen.c 8.7 KB