mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-08-28 21:17:54 +00:00
1062. [bug] If the control channel listener socket was shut
down before server exit, the listener object could be freed twice. [RT #1916]
This commit is contained in:
parent
3b19037ccd
commit
32d248107a
4
CHANGES
4
CHANGES
@ -1,3 +1,7 @@
|
||||
1062. [bug] If the control channel listener socket was shut
|
||||
down before server exit, the listener object could
|
||||
be freed twice. [RT #1916]
|
||||
|
||||
1061. [bug] If periodic cache cleaning happened to start
|
||||
while cleaning due to reaching the configured
|
||||
maximum cache size was in progress, the server
|
||||
|
@ -15,7 +15,7 @@
|
||||
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: controlconf.c,v 1.33 2001/10/19 19:05:42 gson Exp $ */
|
||||
/* $Id: controlconf.c,v 1.34 2001/10/19 21:00:12 gson Exp $ */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
@ -171,11 +171,14 @@ maybe_free_connection(controlconnection_t *conn) {
|
||||
|
||||
static void
|
||||
shutdown_listener(controllistener_t *listener) {
|
||||
isc_boolean_t destroy = ISC_TRUE;
|
||||
controlconnection_t *conn;
|
||||
controlconnection_t *next;
|
||||
|
||||
if (!listener->exiting) {
|
||||
char socktext[ISC_SOCKADDR_FORMATSIZE];
|
||||
|
||||
ISC_LIST_UNLINK(listener->controls->listeners, listener, link);
|
||||
|
||||
isc_sockaddr_format(&listener->address, socktext,
|
||||
sizeof(socktext));
|
||||
isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL,
|
||||
@ -184,23 +187,19 @@ shutdown_listener(controllistener_t *listener) {
|
||||
listener->exiting = ISC_TRUE;
|
||||
}
|
||||
|
||||
if (!ISC_LIST_EMPTY(listener->connections)) {
|
||||
controlconnection_t *conn;
|
||||
for (conn = ISC_LIST_HEAD(listener->connections);
|
||||
conn != NULL;
|
||||
conn = ISC_LIST_NEXT(conn, link))
|
||||
maybe_free_connection(conn);
|
||||
destroy = ISC_FALSE;
|
||||
for (conn = ISC_LIST_HEAD(listener->connections);
|
||||
conn != NULL;
|
||||
conn = next)
|
||||
{
|
||||
next = ISC_LIST_NEXT(conn, link);
|
||||
maybe_free_connection(conn);
|
||||
}
|
||||
|
||||
if (listener->sock != NULL) {
|
||||
if (listener->listening)
|
||||
isc_socket_cancel(listener->sock, listener->task,
|
||||
ISC_SOCKCANCEL_ACCEPT);
|
||||
destroy = ISC_FALSE;
|
||||
}
|
||||
|
||||
if (destroy)
|
||||
free_listener(listener);
|
||||
maybe_free_listener(listener);
|
||||
}
|
||||
|
||||
static isc_boolean_t
|
||||
@ -513,10 +512,10 @@ control_newconn(isc_task_t *task, isc_event_t *event) {
|
||||
|
||||
UNUSED(task);
|
||||
|
||||
listener->listening = ISC_FALSE;
|
||||
|
||||
if (nevent->result != ISC_R_SUCCESS) {
|
||||
if (nevent->result == ISC_R_CANCELED) {
|
||||
isc_socket_detach(&listener->sock);
|
||||
listener->listening = ISC_FALSE;
|
||||
shutdown_listener(listener);
|
||||
goto cleanup;
|
||||
}
|
||||
@ -566,7 +565,6 @@ controls_shutdown(ns_controls_t *controls) {
|
||||
* call their callbacks.
|
||||
*/
|
||||
next = ISC_LIST_NEXT(listener, link);
|
||||
ISC_LIST_UNLINK(controls->listeners, listener, link);
|
||||
shutdown_listener(listener);
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user