From f89c73695ee0e9bc495edcfc48f5b4e7e988c456 Mon Sep 17 00:00:00 2001 From: Jonathan Bagg Date: Wed, 3 Nov 2021 21:30:37 -0400 Subject: [PATCH] Android: Fix missing or corrupt service name The publish service name and type are passed to startServicePublish() as char pointers. startServicePublish() calls runOnAndroidThread which asks the java code to run registerService(). If name and type are objects on the stack, they could get freed / deleted before the registerService() is run in the java thread which would cause registerService() to use deleted objects. Fix --> make permanent objects for name and type. --- androidnsd.cpp | 6 ++++-- androidnsd_p.h | 2 ++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/androidnsd.cpp b/androidnsd.cpp index 5b61771..88ab4b8 100644 --- a/androidnsd.cpp +++ b/androidnsd.cpp @@ -77,6 +77,8 @@ QZeroConfPrivate::~QZeroConfPrivate() void QZeroConfPrivate::startServicePublish(const char *name, const char *type, quint16 port) { QAndroidJniObject ref(nsdManager); + publishName = name; + publishType = type; QtAndroid::runOnAndroidThread([=](){ QAndroidJniObject txtMap("java/util/HashMap"); foreach (const QByteArray &key, txtRecords.keys()) { @@ -86,8 +88,8 @@ void QZeroConfPrivate::startServicePublish(const char *name, const char *type, q } ref.callMethod("registerService", "(Ljava/lang/String;Ljava/lang/String;ILjava/util/Map;)V", - QAndroidJniObject::fromString(QString(name)).object(), - QAndroidJniObject::fromString(QString(type)).object(), + QAndroidJniObject::fromString(publishName).object(), + QAndroidJniObject::fromString(publishType).object(), port, txtMap.object()); }); diff --git a/androidnsd_p.h b/androidnsd_p.h index 3277cdd..f0f6da6 100644 --- a/androidnsd_p.h +++ b/androidnsd_p.h @@ -54,6 +54,8 @@ public: bool browserExists = false; bool publisherExists = false; QMap txtRecords; + QString publishName; + QString publishType; private slots: