From: Alan T. DeKok Date: Tue, 6 Aug 2024 13:23:10 +0000 (-0400) Subject: delay write_handler until listener is KNOWN X-Git-Tag: release_3_2_6~15 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dadcf32aa16119c02a458f9e53c5b69634d9eb02;p=thirdparty%2Ffreeradius-server.git delay write_handler until listener is KNOWN --- diff --git a/src/include/listen.h b/src/include/listen.h index a82b91d2962..15d00d1ba1a 100644 --- a/src/include/listen.h +++ b/src/include/listen.h @@ -187,6 +187,8 @@ typedef struct listen_socket_t { pthread_mutex_t mutex; uint8_t *data; size_t partial; + + fr_event_fd_handler_t write_handler; enum { LISTEN_TLS_INIT = 0, LISTEN_TLS_CHECKING, diff --git a/src/main/process.c b/src/main/process.c index 3f6bdd50824..67b42b0d501 100644 --- a/src/main/process.c +++ b/src/main/process.c @@ -622,7 +622,12 @@ void proxy_listener_freeze(rad_listen_t *listener, fr_event_fd_handler_t write_h listener->blocked = true; - if (fr_event_fd_write_handler(el, 0, listener->fd, write_handler, listener) <= 0) { + if (listener->status == RAD_LISTEN_STATUS_INIT) { + listen_socket_t *sock = listener->data; + + sock->write_handler = write_handler; + + } else if (fr_event_fd_write_handler(el, 0, listener->fd, write_handler, listener) <= 0) { ERROR("Fatal error freezing socket: %s", fr_strerror()); fr_exit(1); } @@ -5701,7 +5706,13 @@ static void event_new_fd(rad_listen_t *this) if (fr_event_fd_insert(el, 0, this->fd, event_socket_handler, this)) { this->status = RAD_LISTEN_STATUS_KNOWN; - return; + + if (!sock->write_handler) return; + + if (fr_event_fd_write_handler(el, 0, this->fd, sock->write_handler, this)) { + sock->write_handler = NULL; + return; + } } /*