From a46045e107193d79c0aa776cb5aed1131d2a74cc Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Wed, 28 Jan 2009 10:35:35 +0100 Subject: [PATCH] Avoid valgrind errors In event handlers, we might destroy other events that are pending in the lists. We can only run one event safely per select call. Yes, I've seen these valgrind errors :-) Jeremy, with ccdd921e61 you had checked in the change to run multiple events. Do you remember why it was necessary and could not be solved in a different way? Volker (cherry picked from commit 910cbc5d6e932fa8ed0066d407a40195b6629a37) --- source/lib/events.c | 38 ++++++++++---------------------------- 1 file changed, 10 insertions(+), 28 deletions(-) diff --git a/source/lib/events.c b/source/lib/events.c index 0dd87279088..cd20ceb43f8 100644 --- a/source/lib/events.c +++ b/source/lib/events.c @@ -218,22 +218,13 @@ bool event_add_to_select_args(struct event_context *event_ctx, bool run_events(struct event_context *event_ctx, int selrtn, fd_set *read_fds, fd_set *write_fds) { - bool fired = False; - struct fd_event *fde, *next; - - /* Run all events that are pending, not just one (as we - did previously. */ + struct fd_event *fde; + struct timeval now; - while (event_ctx->timed_events) { - struct timeval now; - GetTimeOfDay(&now); + GetTimeOfDay(&now); - if (timeval_compare( - &now, &event_ctx->timed_events->when) < 0) { - /* Nothing to do yet */ - DEBUG(11, ("run_events: Nothing to do\n")); - break; - } + if ((event_ctx->timed_events != NULL) + && (timeval_compare(&now, &event_ctx->timed_events->when) >= 0)) { DEBUG(10, ("Running event \"%s\" %lx\n", event_ctx->timed_events->event_name, @@ -244,38 +235,29 @@ bool run_events(struct event_context *event_ctx, event_ctx->timed_events, now, event_ctx->timed_events->private_data); - fired = True; - } - - if (fired) { - /* - * We might have changed the socket status during the timed - * events, return to run select again. - */ - return True; + return true; } if (selrtn == 0) { /* * No fd ready */ - return fired; + return false; } - for (fde = event_ctx->fd_events; fde; fde = next) { + for (fde = event_ctx->fd_events; fde; fde = fde->next) { uint16 flags = 0; - next = fde->next; if (FD_ISSET(fde->fd, read_fds)) flags |= EVENT_FD_READ; if (FD_ISSET(fde->fd, write_fds)) flags |= EVENT_FD_WRITE; if (flags & fde->flags) { fde->handler(event_ctx, fde, flags, fde->private_data); - fired = True; + return true; } } - return fired; + return false; } -- 2.11.4.GIT