]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
delay write_handler until listener is KNOWN
authorAlan T. DeKok <aland@freeradius.org>
Tue, 6 Aug 2024 13:23:10 +0000 (09:23 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Tue, 6 Aug 2024 13:23:10 +0000 (09:23 -0400)
src/include/listen.h
src/main/process.c

index a82b91d2962eaec079faf7ed7a5d31086e381400..15d00d1ba1a80c2fa33b5d2b5052d7008cc793d2 100644 (file)
@@ -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,
index 3f6bdd50824d9bf17be34b30bba6c8c2cd6b9e3c..67b42b0d501b53ecbe96f72d46ba4b8d2f3277a8 100644 (file)
@@ -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;
+                       }
                }
 
                /*