• Praveenkumar Hulakund's avatar
    Bug#18487951 - QUERY_CACHE_MIN_RES_UNIT SET TO ZERO, CRASHES IN QUERY_CACHE::FIND_BIN · 7ce304df
    Praveenkumar Hulakund authored
    Valid min value for query_cache_min_res_unit is 512. But attempt
    to set value greater than or equal to the ULONG_MAX(max value) is
    resulting query_cache_min_res_unit value to 0. This result in
    crash while searching for memory block lesser than the valid
    min value to store query results.
    
    Free memory blocks in query cache are stored in bins according
    to their size. The bins are stored in size descending order.
    For the memory block request the appropriate bin is searched using
    binary search algorithm. The minimum free memory block request
    expected is 512 bytes. And the appropriate bin is searched for block
    greater than or equals to 512 bytes.
    
    Because of the bug the query_cache_min_res_unit is set to 0. Due
    to which there is a chance of request for memory blocks lesser
    than the minimum size in free memory block bins. Search for bin
    for this invalid input size fails and returns garbage index.
    Accessing bins array element with this index is causing the issue
    reported.
    
    The valid value range for the query_cache_min_res_unit is
    512 to ULONG_MAX(when value is greater than the max allowed value,
    max allowed value is used i.e ULONG_MAX). While setting result unit
    block size (query_cache_min_res_unit), size is memory aligned by
    using a macro ALIGN_SIZE. The ALIGN_SIZE logic is as below,
    
      (input_size + sizeof(double) - 1) & ~(sizeof(double) - 1)
    
    For unsigned long type variable when input_size is greater than
    equal to ULONG_MAX-(sizeof(double)-1), above expression is
    resulting in value 0.
    
    Fix:
    -----
    Comparing value set for query_cache_min_res_unit with max
    aligned value which can be stored in ulong type variable.
    If it is greater then setting it to the max aligned value for
    ulong type variable.
    7ce304df
sql_cache.cc 148 KB