Skip to content
  • Adriaan de Groot's avatar
    Fix crash in destructor when using libcxx (Clang STL, FreeBSD) · 1683a9d0
    Adriaan de Groot authored
    This code crashes in the destructor of LdapClient on FreeBSD.
    The crash is visible to uses who
    - start KOrganizer
    - click the "New Event" button
    
    The underlying issue is a lot like the one described in
    	https://blogs.kde.org/2021/02/20/uniqueptr-difference-between-libstdc-and-libc-crashes-your-application
    There is a convoluted call-chain on destruction of LdapClient:
    - ~LdapClient
    - ~std::unique_ptr<LdapClientPrivate>
    - ~LdapClientPrivate
    - LdapClient::cancelQuery
    - (accesses to members of LdapClientPrivate `d`)
    
    With libcxx, the pointer in `d` is already set to nullptr and
    SEGV happens. I'm not sure it isn't UB, anyway, since the
    destructor body for LdapClient has already run.
    
    The fix moves the implementation of `cancelQuery()` into
    the private class. This means that the LdapClient class does
    a little less poking-and-prodding in the private class,
    but also cuts out the call-from-private-back-to-destroyed-
    owning-LdapClient, fixing the SEGV and possible UB.
    1683a9d0