@@ -188,12 +188,17 @@ CHIP_ERROR Register(void * context, DnssdPublishCallback callback, uint32_t inte
188
188
auto err = sdCtx->mHostNameRegistrar .Init (hostname, addressType, interfaceId);
189
189
VerifyOrReturnError (kDNSServiceErr_NoError == err, sdCtx->Finalize (err));
190
190
191
- DNSServiceRef sdRef;
192
- err = DNSServiceRegister (&sdRef, registerFlags, interfaceId, name, type, kLocalDot , hostname, htons (port), record.size (),
193
- record.data (), OnRegister, sdCtx);
194
- VerifyOrReturnError (kDNSServiceErr_NoError == err, sdCtx->Finalize (err));
191
+ err = DNSServiceRegister (&sdCtx->serviceRef , registerFlags, interfaceId, name, type, kLocalDot , hostname, htons (port),
192
+ record.size (), record.data (), OnRegister, sdCtx);
193
+ if (err != kDNSServiceErr_NoError )
194
+ {
195
+ // Just in case DNSServiceCreateConnection put garbage in the outparam
196
+ // on failure.
197
+ sdCtx->serviceRef = nullptr ;
198
+ return sdCtx->Finalize (err);
199
+ }
195
200
196
- return MdnsContexts::GetInstance ().Add (sdCtx, sdRef );
201
+ return MdnsContexts::GetInstance ().Add (sdCtx);
197
202
}
198
203
199
204
static void OnBrowse (DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceId, DNSServiceErrorType err, const char * name,
@@ -216,16 +221,23 @@ CHIP_ERROR BrowseOnDomain(BrowseHandler * sdCtx, uint32_t interfaceId, const cha
216
221
CHIP_ERROR Browse (BrowseHandler * sdCtx, uint32_t interfaceId, const char * type)
217
222
{
218
223
auto err = DNSServiceCreateConnection (&sdCtx->serviceRef );
219
- VerifyOrReturnError (kDNSServiceErr_NoError == err, sdCtx->Finalize (err));
224
+ if (err != kDNSServiceErr_NoError )
225
+ {
226
+ // Just in case DNSServiceCreateConnection put garbage in the outparam
227
+ // on failure.
228
+ sdCtx->serviceRef = nullptr ;
229
+ return sdCtx->Finalize (err);
230
+ }
220
231
221
232
// We will browse on both the local domain and the SRP domain.
233
+ // BrowseOnDomain guarantees it will Finalize() on failure.
222
234
ChipLogProgress (Discovery, " Browsing for: %s on local domain" , StringOrNullMarker (type));
223
235
ReturnErrorOnFailure (BrowseOnDomain (sdCtx, interfaceId, type, kLocalDot ));
224
236
225
237
ChipLogProgress (Discovery, " Browsing for: %s on %s domain" , StringOrNullMarker (type), kSRPDot );
226
238
ReturnErrorOnFailure (BrowseOnDomain (sdCtx, interfaceId, type, kSRPDot ));
227
239
228
- return MdnsContexts::GetInstance ().Add (sdCtx, sdCtx-> serviceRef );
240
+ return MdnsContexts::GetInstance ().Add (sdCtx);
229
241
}
230
242
231
243
CHIP_ERROR Browse (void * context, DnssdBrowseCallback callback, uint32_t interfaceId, const char * type,
@@ -380,10 +392,17 @@ static CHIP_ERROR Resolve(ResolveContext * sdCtx, uint32_t interfaceId, chip::In
380
392
StringOrNullMarker (name), StringOrNullMarker (domain), interfaceId);
381
393
382
394
auto err = DNSServiceCreateConnection (&sdCtx->serviceRef );
383
- VerifyOrReturnError (kDNSServiceErr_NoError == err, sdCtx->Finalize (err));
395
+ if (err != kDNSServiceErr_NoError )
396
+ {
397
+ // Just in case DNSServiceCreateConnection put garbage in the outparam
398
+ // on failure.
399
+ sdCtx->serviceRef = nullptr ;
400
+ return sdCtx->Finalize (err);
401
+ }
384
402
385
403
// If we have a single domain from a browse, we will use that for the Resolve.
386
404
// Otherwise we will try to resolve using both the local domain and the SRP domain.
405
+ // ResolveWithContext guarantees it will Finalize() on failure.
387
406
if (domain != nullptr )
388
407
{
389
408
ReturnErrorOnFailure (ResolveWithContext (sdCtx, interfaceId, type, name, domain, &sdCtx->resolveContextWithNonSRPType ));
@@ -400,7 +419,7 @@ static CHIP_ERROR Resolve(ResolveContext * sdCtx, uint32_t interfaceId, chip::In
400
419
sdCtx->shouldStartSRPTimerForResolve = true ;
401
420
}
402
421
403
- auto retval = MdnsContexts::GetInstance ().Add (sdCtx, sdCtx-> serviceRef );
422
+ auto retval = MdnsContexts::GetInstance ().Add (sdCtx);
404
423
if (retval == CHIP_NO_ERROR)
405
424
{
406
425
(*(sdCtx->consumerCounter ))++;
0 commit comments