Fix crash in destructor when using libcxx (Clang STL, FreeBSD)
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
- LdapClient::cancelQuery
- (accesses to members of LdapClientPrivate
d
)
With libcxx, the pointer in d
is already set to nullptr and
SEGV happens. It is 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 UB.