From e1c71046fe8d731415e8a4e628181c17eb8fde21 Mon Sep 17 00:00:00 2001 From: henri Date: Sun, 29 Jan 2012 15:30:59 +0000 Subject: [PATCH] Changed update_events() to make it directly filter out events that belong to both event sets (events to add and events to remove). This removes the need callers had to do that filtering, it is safer and makes code easier to read and maintain. This section of code is described in a nmap-dev thread, that led to the development of this patch: http://seclists.org/nmap-dev/2012/q1/243 --- nsock/src/nsock_core.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/nsock/src/nsock_core.c b/nsock/src/nsock_core.c index ef8702136..88301c974 100644 --- a/nsock/src/nsock_core.c +++ b/nsock/src/nsock_core.c @@ -183,7 +183,9 @@ static int socket_count_dec_ssl_desire(msevent *nse) { static void update_events(msiod * iod, mspool *ms, int ev_inc, int ev_dec) { int setmask, clrmask; - assert((ev_inc & ev_dec) == 0); + /* Filter out events that belong to both sets. */ + ev_inc = X_EV(ev_inc, ev_dec); + ev_dec = X_EV(ev_dec, ev_inc); setmask = ev_inc; clrmask = EV_NONE; @@ -532,14 +534,14 @@ void handle_write_result(mspool *ms, msevent *nse, enum nse_status status) { evclr = socket_count_dec_ssl_desire(nse); socket_count_read_inc(iod); - update_events(iod, ms, X_EV(EV_READ, evclr), X_EV(evclr, EV_READ)); + update_events(iod, ms, EV_READ, evclr); nse->sslinfo.ssl_desire = err; } else if (err == SSL_ERROR_WANT_WRITE) { int evclr; evclr = socket_count_dec_ssl_desire(nse); socket_count_write_inc(iod); - update_events(iod, ms, X_EV(EV_WRITE, evclr), X_EV(evclr, EV_WRITE)); + update_events(iod, ms, EV_WRITE, evclr); nse->sslinfo.ssl_desire = err; } else { /* Unexpected error */ @@ -682,14 +684,14 @@ static int do_actual_read(mspool *ms, msevent *nse) { evclr = socket_count_dec_ssl_desire(nse); socket_count_read_inc(iod); - update_events(iod, ms, X_EV(EV_READ, evclr), X_EV(evclr, EV_READ)); + update_events(iod, ms, EV_READ, evclr); nse->sslinfo.ssl_desire = err; } else if (err == SSL_ERROR_WANT_WRITE) { int evclr; evclr = socket_count_dec_ssl_desire(nse); socket_count_write_inc(iod); - update_events(iod, ms, X_EV(EV_WRITE, evclr), X_EV(evclr, EV_WRITE)); + update_events(iod, ms, EV_WRITE, evclr); nse->sslinfo.ssl_desire = err; } else { /* Unexpected error */