Avahi Implementation: Fix double-free on errors in GROUP_UNCOMMITED stage

This commit is contained in:
JonathanS
2018-04-11 09:40:45 +02:00
parent 40cf6adf8e
commit 40ef144f14

View File

@ -55,8 +55,6 @@ public:
static void groupCallback(AvahiEntryGroup *g, AvahiEntryGroupState state, AVAHI_GCC_UNUSED void *userdata) static void groupCallback(AvahiEntryGroup *g, AvahiEntryGroupState state, AVAHI_GCC_UNUSED void *userdata)
{ {
qint32 ret;
QZeroConfPrivate *ref = static_cast<QZeroConfPrivate *>(userdata); QZeroConfPrivate *ref = static_cast<QZeroConfPrivate *>(userdata);
switch (state) { switch (state) {
case AVAHI_ENTRY_GROUP_ESTABLISHED: case AVAHI_ENTRY_GROUP_ESTABLISHED:
@ -72,22 +70,7 @@ public:
ref->group = NULL; ref->group = NULL;
emit ref->pub->error(QZeroConf::serviceRegistrationFailed); emit ref->pub->error(QZeroConf::serviceRegistrationFailed);
break; break;
case AVAHI_ENTRY_GROUP_UNCOMMITED: case AVAHI_ENTRY_GROUP_UNCOMMITED: break;
ret = avahi_entry_group_add_service_strlst(g, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, AVAHI_PUBLISH_UPDATE, ref->name.toUtf8(), ref->type.toUtf8(), ref->domain.toUtf8(), NULL, ref->port, ref->txt);
if (ret < 0) {
avahi_entry_group_free(g);
ref->group = NULL;
emit ref->pub->error(QZeroConf::serviceRegistrationFailed);
return;
}
ret = avahi_entry_group_commit(g);
if (ret < 0) {
avahi_entry_group_free(g);
ref->group = NULL;
emit ref->pub->error(QZeroConf::serviceRegistrationFailed);
}
break;
case AVAHI_ENTRY_GROUP_REGISTERING: break; case AVAHI_ENTRY_GROUP_REGISTERING: break;
} }
} }
@ -259,6 +242,26 @@ void QZeroConf::startServicePublish(const char *name, const char *type, const ch
pri->port = port; pri->port = port;
pri->group = avahi_entry_group_new(pri->client, QZeroConfPrivate::groupCallback, pri); pri->group = avahi_entry_group_new(pri->client, QZeroConfPrivate::groupCallback, pri);
int ret = avahi_entry_group_add_service_strlst(pri->group,
AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, AVAHI_PUBLISH_UPDATE,
pri->name.toUtf8(), pri->type.toUtf8(), pri->domain.toUtf8(),
NULL, pri->port, pri->txt);
if (ret < 0) {
avahi_entry_group_free(pri->group);
pri->group = NULL;
emit error(QZeroConf::serviceRegistrationFailed);
return;
}
ret = avahi_entry_group_commit(pri->group);
if (ret < 0) {
pri->group = NULL;
avahi_entry_group_free(pri->group);
emit error(QZeroConf::serviceRegistrationFailed);
}
if (!pri->group) if (!pri->group)
emit error(QZeroConf::serviceRegistrationFailed); emit error(QZeroConf::serviceRegistrationFailed);
} }