struct stream *stream = NULL;
char **hostname_dn;
int hostname_dn_len, query_type;
+ int req_was_new = 0;
enter_resolver_code();
switch (requester_type) {
if (!requester_locked)
HA_SPIN_LOCK(SERVER_LOCK, &srv->lock);
+ req_was_new = !srv->resolv_requester;
req = resolv_get_requester(&srv->resolv_requester,
&srv->obj_type,
snr_resolution_cb,
case OBJ_TYPE_SRVRQ:
srvrq = (struct resolv_srvrq *)requester;
+ req_was_new = !srvrq->requester;
req = resolv_get_requester(&srvrq->requester,
&srvrq->obj_type,
snr_resolution_cb,
case OBJ_TYPE_STREAM:
stream = (struct stream *)requester;
+ req_was_new = !stream->resolv_ctx.requester;
req = resolv_get_requester(&stream->resolv_ctx.requester,
&stream->obj_type,
act_resolution_cb,
case OBJ_TYPE_ACME_RSLV: {
struct acme_rslv *acme_rslv = (struct acme_rslv *)requester;
+ req_was_new = !acme_rslv->requester;
req = resolv_get_requester(&acme_rslv->requester,
&acme_rslv->obj_type,
acme_rslv->success_cb,
leave_resolver_code();
return 0;
- err:
+err:
if (res && LIST_ISEMPTY(&res->requesters))
resolv_free_resolution(res);
+ if (req_was_new) {
+ switch (requester_type) {
+ case OBJ_TYPE_SERVER:
+ srv->resolv_requester = NULL;
+ pool_free(resolv_requester_pool, req);
+ break;
+ case OBJ_TYPE_SRVRQ:
+ srvrq->requester = NULL;
+ pool_free(resolv_requester_pool, req);
+ break;
+ case OBJ_TYPE_STREAM:
+ stream->resolv_ctx.requester = NULL;
+ pool_free(resolv_requester_pool, req);
+ break;
+#if defined(HAVE_ACME)
+ case OBJ_TYPE_ACME_RSLV: {
+ struct acme_rslv *acme_rslv = (struct acme_rslv *)requester;
+ acme_rslv->requester = NULL;
+ pool_free(resolv_requester_pool, req);
+ break;
+ }
+#endif
+ default:
+ break;
+ }
+ }
+
leave_resolver_code();
return -1;
}