mirror of
https://github.com/isc-projects/bind9.git
synced 2026-06-04 20:22:03 -04:00
Ensure that ns_client_*() are only called from the client's task.
This commit is contained in:
parent
d780c35e54
commit
de154f65f6
3 changed files with 45 additions and 18 deletions
|
|
@ -15,7 +15,7 @@
|
|||
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: update.c,v 1.78 2000/12/16 00:58:01 gson Exp $ */
|
||||
/* $Id: update.c,v 1.79 2000/12/28 01:29:09 marka Exp $ */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
|
|
@ -147,7 +147,7 @@ struct update_event {
|
|||
ISC_EVENT_COMMON(update_event_t);
|
||||
dns_zone_t *zone;
|
||||
isc_result_t result;
|
||||
|
||||
dns_message_t *answer;
|
||||
};
|
||||
|
||||
/**************************************************************************/
|
||||
|
|
@ -158,6 +158,7 @@ struct update_event {
|
|||
static void update_action(isc_task_t *task, isc_event_t *event);
|
||||
static void updatedone_action(isc_task_t *task, isc_event_t *event);
|
||||
static isc_result_t send_forward_event(ns_client_t *client, dns_zone_t *zone);
|
||||
static void forward_done(isc_task_t *task, isc_event_t *event);
|
||||
|
||||
/**************************************************************************/
|
||||
/*
|
||||
|
|
@ -2472,19 +2473,44 @@ updatedone_action(isc_task_t *task, isc_event_t *event) {
|
|||
*/
|
||||
|
||||
static void
|
||||
forward_fail(ns_client_t *client, isc_result_t result) {
|
||||
UNUSED(result);
|
||||
forward_fail(isc_task_t *task, isc_event_t *event) {
|
||||
ns_client_t *client = (ns_client_t *)event->ev_arg;
|
||||
|
||||
UNUSED(task);
|
||||
|
||||
respond(client, DNS_R_SERVFAIL);
|
||||
ns_client_detach(&client);
|
||||
isc_event_free((isc_event_t **)&event);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
forward_callback(void *arg, isc_result_t result, dns_message_t *answer) {
|
||||
ns_client_t *client = arg;
|
||||
update_event_t *uev = arg;
|
||||
ns_client_t *client = uev->ev_arg;
|
||||
|
||||
if (result != ISC_R_SUCCESS)
|
||||
forward_fail(client, result);
|
||||
else
|
||||
ns_client_sendraw(client, answer);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
INSIST(answer == NULL);
|
||||
uev->ev_type = DNS_EVENT_UPDATEDONE;
|
||||
uev->ev_action = forward_fail;
|
||||
} else {
|
||||
uev->ev_type = DNS_EVENT_UPDATEDONE;
|
||||
uev->ev_action = forward_done;
|
||||
uev->answer = answer;
|
||||
}
|
||||
isc_task_send(client->task, (isc_event_t**)&uev);
|
||||
}
|
||||
|
||||
static void
|
||||
forward_done(isc_task_t *task, isc_event_t *event) {
|
||||
update_event_t *uev = (update_event_t *) event;
|
||||
ns_client_t *client = (ns_client_t *)event->ev_arg;
|
||||
|
||||
UNUSED(task);
|
||||
|
||||
ns_client_sendraw(client, uev->answer);
|
||||
dns_message_destroy(&uev->answer);
|
||||
isc_event_free((isc_event_t **)&event);
|
||||
ns_client_detach(&client);
|
||||
}
|
||||
|
||||
|
|
@ -2496,13 +2522,13 @@ forward_action(isc_task_t *task, isc_event_t *event) {
|
|||
isc_result_t result;
|
||||
|
||||
result = dns_zone_forwardupdate(zone, client->message,
|
||||
forward_callback, client);
|
||||
forward_callback, event);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
forward_fail(client, result);
|
||||
ns_client_detach(&client);
|
||||
uev->ev_type = DNS_EVENT_UPDATEDONE;
|
||||
uev->ev_action = forward_fail;
|
||||
isc_task_send(client->task, &event);
|
||||
}
|
||||
dns_zone_detach(&zone);
|
||||
isc_event_free(&event);
|
||||
isc_task_detach(&task);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: zone.h,v 1.94 2000/12/13 00:15:39 tale Exp $ */
|
||||
/* $Id: zone.h,v 1.95 2000/12/28 01:29:08 marka Exp $ */
|
||||
|
||||
#ifndef DNS_ZONE_H
|
||||
#define DNS_ZONE_H 1
|
||||
|
|
@ -1047,8 +1047,9 @@ dns_zone_forwardupdate(dns_zone_t *zone, dns_message_t *msg,
|
|||
* Forward 'msg' to each master in turn until we get an answer or we
|
||||
* have exausted the list of masters. 'callback' will be called with
|
||||
* ISC_R_SUCCESS if we get an answer and the returned message will be
|
||||
* passed, otherwise a non ISC_R_SUCCESS result code will be passed and
|
||||
* msg will be NULL.
|
||||
* passed as 'answer_message', otherwise a non ISC_R_SUCCESS result code
|
||||
* will be passed and answer_message will be NULL. The callback function
|
||||
* is responsible for destroying 'answer_message'.
|
||||
* (callback)(callback_arg, result, answer_message);
|
||||
*
|
||||
* Require:
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: zone.c,v 1.282 2000/12/22 05:55:20 marka Exp $ */
|
||||
/* $Id: zone.c,v 1.283 2000/12/28 01:29:06 marka Exp $ */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
|
|
@ -5014,7 +5014,7 @@ forward_callback(isc_task_t *task, isc_event_t *event) {
|
|||
|
||||
/* call callback */
|
||||
(forward->callback)(forward->callback_arg, ISC_R_SUCCESS, msg);
|
||||
dns_message_destroy(&msg);
|
||||
msg = NULL;
|
||||
dns_request_destroy(&forward->request);
|
||||
forward_destroy(forward);
|
||||
isc_event_free(&event);
|
||||
|
|
|
|||
Loading…
Reference in a new issue