From: Arran Cudbard-Bell Date: Thu, 6 Jul 2017 15:50:15 +0000 (-0400) Subject: Add talloc context bindings for file descriptor based events X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2f3e11bc8de71cc81f1e77dc64f24b095048f980;p=thirdparty%2Ffreeradius-server.git Add talloc context bindings for file descriptor based events --- diff --git a/src/include/event.h b/src/include/event.h index 6e3abf8162e..7eac6be1bf1 100644 --- a/src/include/event.h +++ b/src/include/event.h @@ -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, diff --git a/src/lib/io/network.c b/src/lib/io/network.c index f5f4375c830..72ec047318f 100644 --- a/src/lib/io/network.c +++ b/src/lib/io/network.c @@ -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, diff --git a/src/lib/util/event.c b/src/lib/util/event.c index 6d124fa3a3d..7b8df788158 100644 --- a/src/lib/util/event.c +++ b/src/lib/util/event.c @@ -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; } diff --git a/src/main/connection.c b/src/main/connection.c index c819f27765e..79cba2a2d65 100644 --- a/src/main/connection.c +++ b/src/main/connection.c @@ -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; diff --git a/src/main/process.c b/src/main/process.c index c7c450c020d..030223e18fd 100644 --- a/src/main/process.c +++ b/src/main/process.c @@ -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; } diff --git a/src/main/radsniff.c b/src/main/radsniff.c index d66ad7a2dde..f6881cb2439 100644 --- a/src/main/radsniff.c +++ b/src/main/radsniff.c @@ -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; } diff --git a/src/main/threads.c b/src/main/threads.c index 2bb156d45b5..be677e18179 100644 --- a/src/main/threads.c +++ b/src/main/threads.c @@ -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; } diff --git a/src/main/unlang_interpret.c b/src/main/unlang_interpret.c index 8794af3f08e..d37c8bf3d37 100644 --- a/src/main/unlang_interpret.c +++ b/src/main/unlang_interpret.c @@ -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) { diff --git a/src/modules/proto_bfd/proto_bfd.c b/src/modules/proto_bfd/proto_bfd.c index 4a3b40bb812..686221f9a2a 100644 --- a/src/modules/proto_bfd/proto_bfd.c +++ b/src/modules/proto_bfd/proto_bfd.c @@ -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; } diff --git a/src/modules/rlm_logtee/rlm_logtee.c b/src/modules/rlm_logtee/rlm_logtee.c index 8cc5528f70e..446859faf77 100644 --- a/src/modules/rlm_logtee/rlm_logtee.c +++ b/src/modules/rlm_logtee/rlm_logtee.c @@ -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"); } diff --git a/src/modules/rlm_rest/io.c b/src/modules/rlm_rest/io.c index bb1a44d1f68..5c7c8147399 100644 --- a/src/modules/rlm_rest/io.c +++ b/src/modules/rlm_rest/io.c @@ -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", diff --git a/src/modules/rlm_unbound/rlm_unbound.c b/src/modules/rlm_unbound/rlm_unbound.c index 3cbd458dac7..a2109d90729 100644 --- a/src/modules/rlm_unbound/rlm_unbound.c +++ b/src/modules/rlm_unbound/rlm_unbound.c @@ -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;