• Nirbhay Choubey's avatar
    Bug#11756764 48726: MYSQLD KEEPS CRASHING WITH SIGSEGV · c67a91f1
    Nirbhay Choubey authored
                        WITH MYISAM_USE_MMAP ENABLED
    
    MySQL server can crash due to segmentation fault when
    started with myisam_use_mmap.
    
    The reason behind this being, while making a request to
    unmap (munmap) the previously mapped memory (mmap), the
    size passed was 7 bytes larger than the size requested at
    the time of mapping. This can eventually unmap the adjacent
    memory mapped block, belonging to some other memory-map pool.
    Hence the subsequent call to mmap can map a region which was
    still a valid memory mapped area.
    
    Fixed by removing the extra 7-byte margin which was erroneously
    added to the size, used for unmappping.
    
    
    storage/myisam/mi_close.c:
      Bug#11756764 48726: MYSQLD KEEPS CRASHING WITH SIGSEGV
                          WITH MYISAM_USE_MMAP ENABLED
      
      Added a condition to call _mi_unmap_file() in case
      of compressed records. mi_munmap_file() is called
      otherwise.
    storage/myisam/mi_packrec.c:
      Bug#11756764 48726: MYSQLD KEEPS CRASHING WITH SIGSEGV
                          WITH MYISAM_USE_MMAP ENABLED
      
      mi_dynmap_file() function, after successfully executing
      mmap, stores the total size in info->s->mapped_length
      variable. Now, if mi_dynmap_file() is invoked with a size
      with an extra 7-byte margin (MEMMAP_EXTRA_MARGIN),
      the margin will eventually also get stored in mapped_length.
      So, un-mapping function can simply use the value stored in
      mapped_length in order to unmap the previously mapped
      region.
    c67a91f1
mi_packrec.c 50.2 KB