Bug: python-sip segmentation fault

Phil Thompson phil at riverbankcomputing.com
Thu Jan 13 10:42:01 GMT 2022


On 12/01/2022 20:42, artem rus wrote:
> Hello.
> 
> It seems I found a use-after-free problem in sip4 and after code
> inspection I suspect the problem exists in sip5 and sip6.
> 
> The bug is reported to debian bug tracker:
> https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=998897
> 
> The problem is two lines in objmap.c:
> sip_api_instance_destroyed(sw);
> sipSetNotInMap(sw);
> 
> Originally lines was in different order, but by changeset
> 1526:b493c6f3e015 4.18-maint
> from repo https://www.riverbankcomputing.com/hg/sip
> lines exchanged:
> 
> --- a/siplib/objmap.c    Tue Jun 21 14:14:37 2016 +0100
> +++ b/siplib/objmap.c    Sun Jul 03 23:32:48 2016 +0100
> @@ -270,9 +270,21 @@
>                  }
>                  else
>                  {
> -                    /* We are removing it from the map here. */
> +                    /*
> +                     * We are removing it from the map here.  However, 
> note
> +                     * that we first have to call the destructor 
> before marking
> +                     * it as not being in the map, as the destructor 
> itself
> +                     * might end up trying to remove the wrapper and 
> its
> +                     * aliases from the map.  In that case, if the 
> wrapper is
> +                     * already marked as not in the map, the removal 
> will just
> +                     * return early, leaving any potential aliases as 
> stale
> +                     * entries in the map.  If we later try to wrap a 
> different
> +                     * object at the same address, we end up 
> retrieving the
> +                     * stale alias entry from the object map, 
> triggering a
> +                     * use-after-free when accessing its C++ object.
> +                     */
> +                    sip_api_common_dtor(sw);
>                      sipSetNotInMap(sw);
> -                    sip_api_common_dtor(sw);
>                  }
> 
>                  sw = next;
> 
> Now line sip_api_instance_destroyed(sw) decreases refcounter and frees
> memory (for my system refcounter after this line is always 0). Next
> line tries to use freed memory and sometimes makes a segmentation
> fault.
> 
> Can you check the problem in the latest sip and if it exists, fix it ?
>  Can you give me a patch for sip4 ?
> 
> Best regards
> Artem Rusanov

Can you try just removing the call to sipSetNotInMap()?

Phil


More information about the PyQt mailing list