Fix crash when receiving matrix uri

It seems like handling the message in a blocking manner is a no-go. I
have no idea how to fix that, so just use a queued connection for now...
(ASAN does not cooperate and just hides the crash D:)

fixes #842
This commit is contained in:
Nicolas Werner 2021-12-17 05:53:34 +01:00
parent 88521caf0d
commit 09aded2bc8
No known key found for this signature in database
GPG key ID: C8D75E610773F2D9
3 changed files with 20 additions and 13 deletions

View file

@ -1252,10 +1252,10 @@ mxidFromSegments(QStringRef sigil, QStringRef mxid)
} }
bool bool
ChatPage::handleMatrixUri(const QByteArray &uri) ChatPage::handleMatrixUri(QString uri)
{ {
nhlog::ui()->info("Received uri! {}", uri.toStdString()); nhlog::ui()->info("Received uri! {}", uri.toStdString());
QUrl uri_{QString::fromUtf8(uri)}; QUrl uri_{uri};
// Convert matrix.to URIs to proper format // Convert matrix.to URIs to proper format
if (uri_.scheme() == "https" && uri_.host() == "matrix.to") { if (uri_.scheme() == "https" && uri_.host() == "matrix.to") {
@ -1324,7 +1324,8 @@ ChatPage::handleMatrixUri(const QByteArray &uri)
std::vector<std::string> vias; std::vector<std::string> vias;
QString action; QString action;
for (QString item : uri_.query(QUrl::ComponentFormattingOption::FullyEncoded).split('&')) { for (QString item :
uri_.query(QUrl::ComponentFormattingOption::FullyEncoded).split('&', Qt::SkipEmptyParts)) {
nhlog::ui()->info("item: {}", item.toStdString()); nhlog::ui()->info("item: {}", item.toStdString());
if (item.startsWith("action=")) { if (item.startsWith("action=")) {

View file

@ -78,7 +78,7 @@ public:
QString currentRoom() const; QString currentRoom() const;
public slots: public slots:
bool handleMatrixUri(const QByteArray &uri); bool handleMatrixUri(QString uri);
bool handleMatrixUri(const QUrl &uri); bool handleMatrixUri(const QUrl &uri);
void startChat(QString userid); void startChat(QString userid);

View file

@ -277,20 +277,26 @@ main(int argc, char *argv[])
w.activateWindow(); w.activateWindow();
}); });
// It seems like handling the message in a blocking manner is a no-go. I have no idea how to
// fix that, so just use a queued connection for now... (ASAN does not cooperate and just
// hides the crash D:)
QObject::connect( QObject::connect(
&app, &app,
&SingleApplication::receivedMessage, &SingleApplication::receivedMessage,
ChatPage::instance(), ChatPage::instance(),
[&](quint32, QByteArray message) { ChatPage::instance()->handleMatrixUri(message); }); [&](quint32, QByteArray message) {
QString m = QString::fromUtf8(message);
ChatPage::instance()->handleMatrixUri(m);
},
Qt::QueuedConnection);
QMetaObject::Connection uriConnection; QMetaObject::Connection uriConnection;
if (app.isPrimary() && !matrixUri.isEmpty()) { if (app.isPrimary() && !matrixUri.isEmpty()) {
uriConnection = uriConnection = QObject::connect(ChatPage::instance(),
QObject::connect(ChatPage::instance(),
&ChatPage::contentLoaded, &ChatPage::contentLoaded,
ChatPage::instance(), ChatPage::instance(),
[&uriConnection, matrixUri]() { [&uriConnection, matrixUri]() {
ChatPage::instance()->handleMatrixUri(matrixUri.toUtf8()); ChatPage::instance()->handleMatrixUri(matrixUri);
QObject::disconnect(uriConnection); QObject::disconnect(uriConnection);
}); });
} }