kutils: check if the avahi client pointer is null before using it in KDNSSD

should fix crashes due to internal avahi asserts in some cases (e.g. when
the daemon is not running)

Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
This commit is contained in:
Ivailo Monev 2024-05-10 23:05:13 +03:00
parent 476b1a291d
commit ceaddee1dd

View file

@ -149,6 +149,9 @@ KDNSSDPrivate::~KDNSSDPrivate()
bool KDNSSDPrivate::publishService(const QByteArray &servicetype, const uint serviceport, const QString &servicename)
{
#if defined(HAVE_AVAHI)
if (!m_avahiclient) {
return false;
}
if (m_avahigroup) {
avahi_entry_group_reset(m_avahigroup);
}
@ -158,7 +161,6 @@ bool KDNSSDPrivate::publishService(const QByteArray &servicetype, const uint ser
return false;
}
const QByteArray servicenamebytes = servicename.toUtf8();
// qDebug() << Q_FUNC_INFO << servicenamebytes << servicetype;
int avahiresult = avahi_entry_group_add_service(
m_avahigroup,
AVAHI_IF_UNSPEC, s_avahiproto,
@ -201,8 +203,9 @@ bool KDNSSDPrivate::unpublishService()
bool KDNSSDPrivate::startBrowse(const QByteArray &servicetype)
{
#if defined(HAVE_AVAHI)
// qDebug() << Q_FUNC_INFO << servicetype;
if (!m_avahiclient) {
return false;
}
m_pollcounter = 0;
QList<QByteArray> servicetypes;
if (servicetype.isEmpty()) {
@ -220,7 +223,6 @@ bool KDNSSDPrivate::startBrowse(const QByteArray &servicetype)
m_pollcounter++;
m_servicetypes.clear();
while (m_pollcounter) {
// qDebug() << Q_FUNC_INFO << m_pollcounter;
avahi_simple_poll_iterate(m_avahipoll, 0);
}
@ -247,7 +249,6 @@ bool KDNSSDPrivate::startBrowse(const QByteArray &servicetype)
m_pollcounter++;
while (m_pollcounter) {
// qDebug() << Q_FUNC_INFO << m_pollcounter;
avahi_simple_poll_iterate(m_avahipoll, 0);
}
@ -277,8 +278,6 @@ QString KDNSSDPrivate::errorString() const
#if defined(HAVE_AVAHI)
void KDNSSDPrivate::groupCallback(AvahiEntryGroup *avahigroup, AvahiEntryGroupState avahistate, void *userdata)
{
// qDebug() << Q_FUNC_INFO << avahigroup << avahistate << userdata;
if (avahistate == AVAHI_ENTRY_GROUP_FAILURE) {
KDNSSDPrivate *kdnssdprivate = static_cast<KDNSSDPrivate*>(userdata);
kdnssdprivate->m_errorstring = getAvahiClientError(avahi_entry_group_get_client(avahigroup));
@ -287,8 +286,6 @@ void KDNSSDPrivate::groupCallback(AvahiEntryGroup *avahigroup, AvahiEntryGroupSt
void KDNSSDPrivate::clientCallback(AvahiClient *avahiclient, AvahiClientState avahistate, void *userdata)
{
// qDebug() << Q_FUNC_INFO << avahistate << userdata;
if (avahistate == AVAHI_CLIENT_FAILURE) {
KDNSSDPrivate *kdnssdprivate = static_cast<KDNSSDPrivate*>(userdata);
kdnssdprivate->m_errorstring = getAvahiClientError(avahiclient);
@ -303,8 +300,6 @@ void KDNSSDPrivate::browseCallback(AvahiServiceBrowser *avahibrowser, AvahiIfInd
{
Q_UNUSED(avahiflags);
// qDebug() << Q_FUNC_INFO << avahievent << avahiname << avahitype << avahidomain << userdata;
KDNSSDPrivate *kdnssdprivate = static_cast<KDNSSDPrivate*>(userdata);
AvahiClient *avahiclient = avahi_service_browser_get_client(avahibrowser);
switch (avahievent) {
@ -357,8 +352,6 @@ void KDNSSDPrivate::resolveCallback(AvahiServiceResolver *avahiresolver, AvahiIf
Q_UNUSED(avahiflags);
Q_UNUSED(avahiflags);
// qDebug() << Q_FUNC_INFO << avahievent << avahiname << avahitype << avahidomain << userdata;
KDNSSDPrivate *kdnssdprivate = static_cast<KDNSSDPrivate*>(userdata);
switch (avahievent) {
case AVAHI_RESOLVER_FOUND: {
@ -429,8 +422,6 @@ void KDNSSDPrivate::serviceCallback(AvahiServiceTypeBrowser *avahiservice,
Q_UNUSED(avahiprotocol);
Q_UNUSED(avahiflags);
// qDebug() << Q_FUNC_INFO << avahievent << avahitype << avahidomain << userdata;
KDNSSDPrivate *kdnssdprivate = static_cast<KDNSSDPrivate*>(userdata);
AvahiClient *avahiclient = avahi_service_type_browser_get_client(avahiservice);
switch (avahievent) {