• Meir Shpilraien (Spielrein)'s avatar
    Avoid crash on crash report when a bad function pointer was called (#11298) · b1ede212
    Meir Shpilraien (Spielrein) authored
    If Redis crashes due to calling an invalid function pointer,
    the `backtrace` function will try to dereference this invalid pointer
    which will cause a crash inside the crash report and will kill
    the processes without having all the crash report information.
    
    Example:
    
    ```
    === REDIS BUG REPORT START: Cut & paste starting from here ===
    198672:M 19 Sep 2022 18:06:12.936 # Redis 255.255.255 crashed by signal: 11, si_code: 1
    198672:M 19 Sep 2022 18:06:12.936 # Accessing address: 0x1
    198672:M 19 Sep 2022 18:06:12.936 # Crashed running the instruction at: 0x1
    // here the processes is crashing
    ```
    
    This PR tries to fix this crash be:
    1. Identify the issue when it happened.
    2. Replace the invalid pointer with a pointer to some dummy function
       so that `backtrace` will not crash.
    
    I identification is done by comparing `eip` to `info->si_addr`, if they
    are the same we know that the crash happened on the same address it tries to
    accesses and we can conclude that it tries to call and invalid function pointer.
    
    To replace the invalid pointer we introduce a new function, `setMcontextEip`,
    which is very similar to `getMcontextEip` and it knows to set the Eip for the
    different supported OS's. After printing the trace we retrieve the old `Eip` value.
    
    (cherry picked from commit 0bf90d94)
    b1ede212
debug.c 82.5 KB