]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
Add talloc context bindings for file descriptor based events
authorArran Cudbard-Bell <a.cudbardb@freeradius.org>
Thu, 6 Jul 2017 15:50:15 +0000 (11:50 -0400)
committerArran Cudbard-Bell <a.cudbardb@freeradius.org>
Thu, 6 Jul 2017 15:50:15 +0000 (11:50 -0400)
12 files changed:
src/include/event.h
src/lib/io/network.c
src/lib/util/event.c
src/main/connection.c
src/main/process.c
src/main/radsniff.c
src/main/threads.c
src/main/unlang_interpret.c
src/modules/proto_bfd/proto_bfd.c
src/modules/rlm_logtee/rlm_logtee.c
src/modules/rlm_rest/io.c
src/modules/rlm_unbound/rlm_unbound.c

index 6e3abf8162ec149b7aebc052fd21db7b961767ca..7eac6be1bf15bda066fd585cf6289c39fbe72de8 100644 (file)
@@ -95,7 +95,7 @@ int           fr_event_list_kq(fr_event_list_t *el);
 int            fr_event_list_time(struct timeval *when, fr_event_list_t *el);
 
 int            fr_event_fd_delete(fr_event_list_t *el, int fd);
-int            fr_event_fd_insert(fr_event_list_t *el, int fd,
+int            fr_event_fd_insert(TALLOC_CTX *ctx, fr_event_list_t *el, int fd,
                                   fr_event_fd_handler_t read_fn,
                                   fr_event_fd_handler_t write_fn,
                                   fr_event_fd_error_handler_t error,
index f5f4375c8301241765209ddb27d10a992ad7d590..72ec047318fe5b312005455a4ef50f1205aceb08 100644 (file)
@@ -489,7 +489,7 @@ static void fr_network_socket_callback(void *ctx, void const *data, size_t data_
        rad_assert(app_io->fd);
        fd = app_io->fd(s->listen->app_io_instance);
 
-       if (fr_event_fd_insert(nr->el, fd,
+       if (fr_event_fd_insert(nr, nr->el, fd,
                               fr_network_read,
                               NULL,                    /* app_io->write ? fr_network_write : NULL - FIXME */
                               app_io->error ? fr_network_error : NULL,
index 6d124fa3a3d1bc62654e66c00d2e816f9d9b572c..7b8df788158c62629350359edc915916446a2966 100644 (file)
@@ -81,6 +81,7 @@ typedef struct fr_event_fd_t {
                                                        //!< the handlers complete.
 
        void                    *uctx;                  //!< Context pointer to pass to each file descriptor callback.
+       TALLOC_CTX              *linked_ctx;            //!< talloc ctx this event was bound to.
 } fr_event_fd_t;
 
 /** Callbacks to perform when the event handler is about to check the events.
@@ -315,6 +316,7 @@ static int _fr_event_fd_free(fr_event_fd_t *ef)
 
 /** Associate a callback with an file descriptor
  *
+ * @param[in] ctx      to bind lifetime of the event to.
  * @param[in] el       to insert fd callback into.
  * @param[in] fd       to read from.
  * @param[in] read_fn  function to call when fd is readable.
@@ -325,7 +327,7 @@ static int _fr_event_fd_free(fr_event_fd_t *ef)
  *     - 0 on succes.
  *     - -1 on failure.
  */
-int fr_event_fd_insert(fr_event_list_t *el, int fd,
+int fr_event_fd_insert(TALLOC_CTX *ctx, fr_event_list_t *el, int fd,
                       fr_event_fd_handler_t read_fn,
                       fr_event_fd_handler_t write_fn,
                       fr_event_fd_error_handler_t error,
@@ -360,6 +362,12 @@ int fr_event_fd_insert(fr_event_list_t *el, int fd,
        find.fd = fd;
        ef = rbtree_finddata(el->fds, &find);
 
+       /*
+        *      Need to free the event to change the
+        *      talloc link.
+        */
+       if (ef && (ef->linked_ctx != ctx)) TALLOC_FREE(ef);     /* Also cleans up kevent filters */
+
        /*
         *      No pre-existing event.  Allocate an entry
         *      for insertion into the rbtree, and call
@@ -418,6 +426,7 @@ int fr_event_fd_insert(fr_event_list_t *el, int fd,
                ef->write = write_fn;
                ef->error = error;
                ef->is_registered = true;
+               ef->linked_ctx = ctx;
 
                return 0;
        }
index c819f27765e11298158fd85236c6aeec0066a5bb..79cba2a2d6565071a85ae942c5cd9f19fdfcd92e 100644 (file)
@@ -253,7 +253,7 @@ static void connection_state_init(fr_connection_t *conn, struct timeval *now)
                 *      If connection becomes writable we
                 *      assume it's open.
                 */
-               if (fr_event_fd_insert(conn->el, fd, NULL, _connection_writable, _connection_error, conn) < 0) {
+               if (fr_event_fd_insert(conn, conn->el, fd, NULL, _connection_writable, _connection_error, conn) < 0) {
                        PERROR("Failed inserting file descriptor (%i) into event loop %p", fd, conn->el);
                        connection_state_failed(conn, now);
                        return;
index c7c450c020d7e940e4a9f065112b864e193cc0df..030223e18fd90aa3d8975d9c596e991e99cc7e22 100644 (file)
@@ -390,7 +390,7 @@ int radius_event_start(UNUSED bool have_children)
        }
        DEBUG4("Created signal pipe.  Read end FD %i, write end FD %i", self_pipe[0], self_pipe[1]);
 
-       if (fr_event_fd_insert(event_list, self_pipe[0], event_signal_handler, NULL, NULL, event_list) < 0) {
+       if (fr_event_fd_insert(NULL, event_list, self_pipe[0], event_signal_handler, NULL, NULL, event_list) < 0) {
                PERROR("Failed creating signal pipe handler");
                return -1;
        }
index d66ad7a2dde9586baa4dab09c5452cf9a3a0cd4d..f6881cb2439ac2f5fde7e904fecc71f902309b88 100644 (file)
@@ -2805,7 +2805,7 @@ int main(int argc, char *argv[])
                        exit(EXIT_FAILURE);
                }
 
-               if (fr_event_fd_insert(events, self_pipe[0], rs_signal_action, NULL, NULL, events) < 0) {
+               if (fr_event_fd_insert(NULL, events, self_pipe[0], rs_signal_action, NULL, NULL, events) < 0) {
                        ERROR("Failed inserting signal pipe descriptor: %s", fr_strerror());
                        goto finish;
                }
@@ -2824,7 +2824,7 @@ int main(int argc, char *argv[])
                        event->out = out;
                        event->stats = stats;
 
-                       if (fr_event_fd_insert(events, in_p->fd, rs_got_packet, NULL, NULL, event) < 0) {
+                       if (fr_event_fd_insert(NULL, events, in_p->fd, rs_got_packet, NULL, NULL, event) < 0) {
                                ERROR("Failed inserting file descriptor");
                                goto finish;
                        }
index 2bb156d45b55b540332eeb2f9b370eefdb76fa2f..be677e1817906e5583846c39649d1c3ae4961acb 100644 (file)
@@ -461,7 +461,7 @@ static void *thread_handler(void *arg)
        local_backlog = fr_heap_create(timestamp_cmp, offsetof(REQUEST, heap_id));
        rad_assert(local_backlog != NULL);
 
-       if (fr_event_fd_insert(el, thread->pipe_fd[0], thread_fd_handler, NULL, NULL, thread) < 0) {
+       if (fr_event_fd_insert(thread, el, thread->pipe_fd[0], thread_fd_handler, NULL, NULL, thread) < 0) {
                ERROR("Failed inserting event for self");
                goto done;
        }
index 8794af3f08e19216da5679fc4aa7096e7a8b25fd..d37c8bf3d37303fa99d8f311fb75dca9f253b47d 100644 (file)
@@ -1930,7 +1930,7 @@ int unlang_event_fd_add(REQUEST *request,
        /*
         *      Register for events on the file descriptor
         */
-       if (fr_event_fd_insert(request->el, fd,
+       if (fr_event_fd_insert(request, request->el, fd,
                               ev->fd_read ? unlang_event_fd_read_handler : NULL,
                               ev->fd_write ? unlang_event_fd_write_handler : NULL,
                               ev->fd_error ? unlang_event_fd_error_handler: NULL, ev) < 0) {
index 4a3b40bb812f05a48aa8e49549c2b7c18b85fc1d..686221f9a2add39b0378211d6cb7b0fd31bfad36 100644 (file)
@@ -337,7 +337,7 @@ static int bfd_pthread_create(bfd_state_t *session)
        fcntl(session->pipefd[1], F_SETFL, O_NONBLOCK | FD_CLOEXEC);
 #endif
 
-       if (fr_event_fd_insert(session->el, session->pipefd[0], bfd_pipe_recv, NULL, NULL, session) < 0) {
+       if (fr_event_fd_insert(session, session->el, session->pipefd[0], bfd_pipe_recv, NULL, NULL, session) < 0) {
                PERROR("Failed inserting file descriptor into event list");
                goto close_pipes;
        }
index 8cc5528f70e43e32554b423de2ee30f78b3a5893..446859faf773f1e65a632b79fdbfb8ce3c30d521 100644 (file)
@@ -296,7 +296,7 @@ static void _logtee_conn_writable(UNUSED fr_event_list_t *el, int sock, UNUSED i
 static void logtee_fd_idle(rlm_logtee_thread_t *t)
 {
        DEBUG3("Marking socket (%i) as idle", fr_connection_get_fd(t->conn));
-       if (fr_event_fd_insert(t->el, fr_connection_get_fd(t->conn),
+       if (fr_event_fd_insert(t, t->el, fr_connection_get_fd(t->conn),
                               _logtee_conn_read, NULL, _logtee_conn_error, t) < 0) {
                PERROR("Failed inserting FD event");
        }
@@ -311,7 +311,7 @@ static void logtee_fd_idle(rlm_logtee_thread_t *t)
 static void logtee_fd_active(rlm_logtee_thread_t *t)
 {
        DEBUG3("Marking socket (%i) as active - Draining requests", fr_connection_get_fd(t->conn));
-       if (fr_event_fd_insert(t->el, fr_connection_get_fd(t->conn),
+       if (fr_event_fd_insert(t, t->el, fr_connection_get_fd(t->conn),
                               _logtee_conn_read, _logtee_conn_writable, _logtee_conn_error, t) < 0) {
                PERROR("Failed inserting FD event");
        }
index bb1a44d1f68b4216669241794cbded3e03c925d6..5c7c8147399c6fdfbdfcfa22643fbece6cf8bf9f 100644 (file)
@@ -267,7 +267,7 @@ static int _rest_io_event_modify(UNUSED CURL *easy, curl_socket_t fd, int what,
 
        switch (what) {
        case CURL_POLL_IN:
-               if (fr_event_fd_insert(thread->el, fd,
+               if (fr_event_fd_insert(thread, thread->el, fd,
                                       _rest_io_service_readable, NULL, _rest_io_service_errored,
                                       thread) < 0) {
                        ERROR("multi-handle %p registration failed for read+error events on FD %i: %s",
@@ -278,7 +278,7 @@ static int _rest_io_event_modify(UNUSED CURL *easy, curl_socket_t fd, int what,
                break;
 
        case CURL_POLL_OUT:
-               if (fr_event_fd_insert(thread->el, fd,
+               if (fr_event_fd_insert(thread, thread->el, fd,
                                       NULL, _rest_io_service_writable, _rest_io_service_errored,
                                       thread) < 0) {
                        ERROR("multi-handle %p registration failed for write+error events on FD %i: %s",
@@ -289,7 +289,7 @@ static int _rest_io_event_modify(UNUSED CURL *easy, curl_socket_t fd, int what,
                break;
 
        case CURL_POLL_INOUT:
-               if (fr_event_fd_insert(thread->el, fd,
+               if (fr_event_fd_insert(thread, thread->el, fd,
                                       _rest_io_service_readable, _rest_io_service_writable, _rest_io_service_errored,
                                       thread) < 0) {
                        ERROR("multi-handle %p registration failed for read+write+error events on FD %i: %s",
index 3cbd458dac79aae040ca34e368c0e1ff2f1b680c..a2109d90729a7b4917c2ea2036009ddeffa92f03 100644 (file)
@@ -638,7 +638,7 @@ static int mod_instantiate(void *instance, CONF_SECTION *conf)
 
        inst->log_fd = ub_fd(inst->ub);
        if (inst->log_fd >= 0) {
-               if (fr_event_fd_insert(inst->el, inst->log_fd, ub_fd_handler, NULL, NULL, inst) < 0) {
+               if (fr_event_fd_insert(inst, inst->el, inst->log_fd, ub_fd_handler, NULL, NULL, inst) < 0) {
                        cf_log_err(conf, "could not insert async fd");
                        inst->log_fd = -1;
                        goto error_nores;