diff options
Diffstat (limited to 'net/kldap/files/patch-UB.diff')
-rw-r--r-- | net/kldap/files/patch-UB.diff | 68 |
1 files changed, 0 insertions, 68 deletions
diff --git a/net/kldap/files/patch-UB.diff b/net/kldap/files/patch-UB.diff deleted file mode 100644 index 6a8c2057156f..000000000000 --- a/net/kldap/files/patch-UB.diff +++ /dev/null @@ -1,68 +0,0 @@ -commit 1683a9d0749550b81ba3fd7ddeba4fc0884acb47 -Author: Adriaan de Groot <groot@kde.org> -Date: Mon Jan 24 11:27:29 2022 +0100 - - 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> - - ~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. -diff --git src/widgets/ldapclient.cpp src/widgets/ldapclient.cpp -index cf94ea9..012b3a7 100644 ---- src/widgets/ldapclient.cpp -+++ src/widgets/ldapclient.cpp -@@ -31,9 +31,11 @@ public: - - ~LdapClientPrivate() - { -- q->cancelQuery(); -+ cancelQuery(); - } - -+ void cancelQuery(); -+ - void startParseLDIF(); - void parseLDIF(const QByteArray &data); - void endParseLDIF(); -@@ -133,12 +135,17 @@ void LdapClient::startQuery(const QString &filter) - - void LdapClient::cancelQuery() - { -- if (d->mJob) { -- d->mJob->kill(); -- d->mJob = nullptr; -+ d->cancelQuery(); -+} -+ -+void LdapClient::LdapClientPrivate::cancelQuery() -+{ -+ if (mJob) { -+ mJob->kill(); -+ mJob = nullptr; - } - -- d->mActive = false; -+ mActive = false; - } - - void LdapClient::LdapClientPrivate::slotData(KIO::Job *, const QByteArray &data) |