2
0
mirror of https://github.com/sudo-project/sudo.git synced 2025-08-28 12:57:50 +00:00

Store the event base in the client closure.

Explicitly passing the event base removes the need to set a default base.
This commit is contained in:
Todd C. Miller 2020-03-01 13:36:59 -07:00
parent bf2bc931ab
commit f561e2cafe
4 changed files with 36 additions and 34 deletions

View File

@ -117,7 +117,7 @@ connection_closure_free(struct connection_closure *closure)
free(closure); free(closure);
if (shutting_down && TAILQ_EMPTY(&connections)) if (shutting_down && TAILQ_EMPTY(&connections))
sudo_ev_loopbreak(NULL); sudo_ev_loopbreak(closure->evbase);
} }
debug_return; debug_return;
@ -273,7 +273,7 @@ handle_accept(AcceptMessage *msg, struct connection_closure *closure)
/* Send log ID to client for restarting connections. */ /* Send log ID to client for restarting connections. */
if (!fmt_log_id_message(closure->details.iolog_path, &closure->write_buf)) if (!fmt_log_id_message(closure->details.iolog_path, &closure->write_buf))
debug_return_bool(false); debug_return_bool(false);
if (sudo_ev_add(NULL, closure->write_ev, if (sudo_ev_add(closure->evbase, closure->write_ev,
logsrvd_conf_get_sock_timeout(), false) == -1) { logsrvd_conf_get_sock_timeout(), false) == -1) {
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
"unable to add server write event"); "unable to add server write event");
@ -356,7 +356,7 @@ handle_exit(ExitMessage *msg, struct connection_closure *closure)
/* No more data, command exited. */ /* No more data, command exited. */
closure->state = EXITED; closure->state = EXITED;
sudo_ev_del(NULL, closure->read_ev); sudo_ev_del(closure->evbase, closure->read_ev);
sudo_debug_printf(SUDO_DEBUG_INFO, "%s: elapsed time: %lld, %ld", sudo_debug_printf(SUDO_DEBUG_INFO, "%s: elapsed time: %lld, %ld",
__func__, (long long)closure->elapsed_time.tv_sec, __func__, (long long)closure->elapsed_time.tv_sec,
@ -371,7 +371,7 @@ handle_exit(ExitMessage *msg, struct connection_closure *closure)
} }
/* Schedule the final commit point event immediately. */ /* Schedule the final commit point event immediately. */
if (sudo_ev_add(NULL, closure->commit_ev, &tv, false) == -1) { if (sudo_ev_add(closure->evbase, closure->commit_ev, &tv, false) == -1) {
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
"unable to add commit point event"); "unable to add commit point event");
debug_return_bool(false); debug_return_bool(false);
@ -399,8 +399,8 @@ handle_restart(RestartMessage *msg, struct connection_closure *closure)
/* XXX - structured error message so client can send from beginning */ /* XXX - structured error message so client can send from beginning */
if (!fmt_error_message(closure->errstr, &closure->write_buf)) if (!fmt_error_message(closure->errstr, &closure->write_buf))
debug_return_bool(false); debug_return_bool(false);
sudo_ev_del(NULL, closure->read_ev); sudo_ev_del(closure->evbase, closure->read_ev);
if (sudo_ev_add(NULL, closure->write_ev, if (sudo_ev_add(closure->evbase, closure->write_ev,
logsrvd_conf_get_sock_timeout(), false) == -1) { logsrvd_conf_get_sock_timeout(), false) == -1) {
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
"unable to add server write event"); "unable to add server write event");
@ -462,7 +462,7 @@ handle_iobuf(int iofd, IoBuffer *msg, struct connection_closure *closure)
/* Schedule a commit point in 10 sec if one is not already pending. */ /* Schedule a commit point in 10 sec if one is not already pending. */
if (!ISSET(closure->commit_ev->flags, SUDO_EVQ_INSERTED)) { if (!ISSET(closure->commit_ev->flags, SUDO_EVQ_INSERTED)) {
struct timespec tv = { ACK_FREQUENCY, 0 }; struct timespec tv = { ACK_FREQUENCY, 0 };
if (sudo_ev_add(NULL, closure->commit_ev, &tv, false) == -1) { if (sudo_ev_add(closure->evbase, closure->commit_ev, &tv, false) == -1) {
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
"unable to add commit point event"); "unable to add commit point event");
debug_return_bool(false); debug_return_bool(false);
@ -660,7 +660,7 @@ server_msg_cb(int fd, int what, void *v)
/* Delete write event if it was only due to SSL_read(). */ /* Delete write event if it was only due to SSL_read(). */
if (closure->temporary_write_event) { if (closure->temporary_write_event) {
closure->temporary_write_event = false; closure->temporary_write_event = false;
sudo_ev_del(NULL, closure->write_ev); sudo_ev_del(closure->evbase, closure->write_ev);
} }
client_msg_cb(fd, what, v); client_msg_cb(fd, what, v);
debug_return; debug_return;
@ -721,7 +721,7 @@ server_msg_cb(int fd, int what, void *v)
"%s: finished sending %u bytes to client", __func__, buf->len); "%s: finished sending %u bytes to client", __func__, buf->len);
buf->off = 0; buf->off = 0;
buf->len = 0; buf->len = 0;
sudo_ev_del(NULL, closure->write_ev); sudo_ev_del(closure->evbase, closure->write_ev);
if (closure->state == FLUSHED || closure->state == SHUTDOWN || if (closure->state == FLUSHED || closure->state == SHUTDOWN ||
closure->state == ERROR) closure->state == ERROR)
goto finished; goto finished;
@ -780,7 +780,7 @@ client_msg_cb(int fd, int what, void *v)
"SSL_read returns SSL_ERROR_WANT_WRITE"); "SSL_read returns SSL_ERROR_WANT_WRITE");
if (!sudo_ev_pending(closure->write_ev, SUDO_EV_WRITE, NULL)) { if (!sudo_ev_pending(closure->write_ev, SUDO_EV_WRITE, NULL)) {
/* Enable a temporary write event. */ /* Enable a temporary write event. */
if (sudo_ev_add(NULL, closure->write_ev, if (sudo_ev_add(closure->evbase, closure->write_ev,
logsrvd_conf_get_sock_timeout(), false) == -1) { logsrvd_conf_get_sock_timeout(), false) == -1) {
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
"unable to add event to queue"); "unable to add event to queue");
@ -860,8 +860,8 @@ send_error:
if (closure->errstr == NULL) if (closure->errstr == NULL)
goto finished; goto finished;
if (fmt_error_message(closure->errstr, &closure->write_buf)) { if (fmt_error_message(closure->errstr, &closure->write_buf)) {
sudo_ev_del(NULL, closure->read_ev); sudo_ev_del(closure->evbase, closure->read_ev);
if (sudo_ev_add(NULL, closure->write_ev, if (sudo_ev_add(closure->evbase, closure->write_ev,
logsrvd_conf_get_sock_timeout(), false) == -1) { logsrvd_conf_get_sock_timeout(), false) == -1) {
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
"unable to add server write event"); "unable to add server write event");
@ -900,7 +900,7 @@ server_commit_cb(int unused, int what, void *v)
"unable to format ServerMessage (commit point)"); "unable to format ServerMessage (commit point)");
goto bad; goto bad;
} }
if (sudo_ev_add(NULL, closure->write_ev, if (sudo_ev_add(closure->evbase, closure->write_ev,
logsrvd_conf_get_sock_timeout(), false) == -1) { logsrvd_conf_get_sock_timeout(), false) == -1) {
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
"unable to add server write event"); "unable to add server write event");
@ -1226,7 +1226,6 @@ static void
tls_handshake_cb(int fd, int what, void *v) tls_handshake_cb(int fd, int what, void *v)
{ {
struct connection_closure *closure = v; struct connection_closure *closure = v;
struct sudo_event_base *base = closure->ssl_accept_ev->base;
debug_decl(tls_handshake_cb, SUDO_DEBUG_UTIL); debug_decl(tls_handshake_cb, SUDO_DEBUG_UTIL);
@ -1256,7 +1255,7 @@ tls_handshake_cb(int fd, int what, void *v)
goto bad; goto bad;
} }
} }
if (sudo_ev_add(base, closure->ssl_accept_ev, if (sudo_ev_add(closure->evbase, closure->ssl_accept_ev,
logsrvd_conf_get_sock_timeout(), false) == -1) { logsrvd_conf_get_sock_timeout(), false) == -1) {
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
"unable to add ssl_accept_ev to queue"); "unable to add ssl_accept_ev to queue");
@ -1275,7 +1274,7 @@ tls_handshake_cb(int fd, int what, void *v)
goto bad; goto bad;
} }
} }
if (sudo_ev_add(base, closure->ssl_accept_ev, if (sudo_ev_add(closure->evbase, closure->ssl_accept_ev,
logsrvd_conf_get_sock_timeout(), false) == -1) { logsrvd_conf_get_sock_timeout(), false) == -1) {
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
"unable to add ssl_accept_ev to queue"); "unable to add ssl_accept_ev to queue");
@ -1291,7 +1290,7 @@ tls_handshake_cb(int fd, int what, void *v)
} }
/* Enable reader for ClientMessage */ /* Enable reader for ClientMessage */
if (sudo_ev_add(base, closure->read_ev, NULL, false) == -1) { if (sudo_ev_add(closure->evbase, closure->read_ev, NULL, false) == -1) {
sudo_warn(U_("unable to add event to queue")); sudo_warn(U_("unable to add event to queue"));
} }
@ -1311,7 +1310,7 @@ bad:
* Allocate a new connection closure. * Allocate a new connection closure.
*/ */
static struct connection_closure * static struct connection_closure *
connection_closure_alloc(int sock) connection_closure_alloc(int sock, struct sudo_event_base *base)
{ {
struct connection_closure *closure; struct connection_closure *closure;
debug_decl(connection_closure_alloc, SUDO_DEBUG_UTIL); debug_decl(connection_closure_alloc, SUDO_DEBUG_UTIL);
@ -1321,6 +1320,7 @@ connection_closure_alloc(int sock)
closure->iolog_dir_fd = -1; closure->iolog_dir_fd = -1;
closure->sock = sock; closure->sock = sock;
closure->evbase = base;
TAILQ_INSERT_TAIL(&connections, closure, entries); TAILQ_INSERT_TAIL(&connections, closure, entries);
@ -1368,7 +1368,7 @@ new_connection(int sock, const struct sockaddr *sa, struct sudo_event_base *base
debug_decl(new_connection, SUDO_DEBUG_UTIL); debug_decl(new_connection, SUDO_DEBUG_UTIL);
if ((closure = connection_closure_alloc(sock)) == NULL) if ((closure = connection_closure_alloc(sock, base)) == NULL)
goto bad; goto bad;
/* Format and write ServerHello message. */ /* Format and write ServerHello message. */
@ -1782,7 +1782,6 @@ main(int argc, char *argv[])
if ((evbase = sudo_ev_base_alloc()) == NULL) if ((evbase = sudo_ev_base_alloc()) == NULL)
sudo_fatal(NULL); sudo_fatal(NULL);
sudo_ev_base_setdef(evbase);
/* Initialize listeners and TLS context. */ /* Initialize listeners and TLS context. */
server_setup(evbase); server_setup(evbase);

View File

@ -87,6 +87,7 @@ struct connection_closure {
struct timespec elapsed_time; struct timespec elapsed_time;
struct connection_buffer read_buf; struct connection_buffer read_buf;
struct connection_buffer write_buf; struct connection_buffer write_buf;
struct sudo_event_base *evbase;
struct sudo_event *commit_ev; struct sudo_event *commit_ev;
struct sudo_event *read_ev; struct sudo_event *read_ev;
struct sudo_event *write_ev; struct sudo_event *write_ev;

View File

@ -435,7 +435,7 @@ client_closure_free(struct client_closure *closure)
* Initialize a new client closure * Initialize a new client closure
*/ */
static struct client_closure * static struct client_closure *
client_closure_alloc(int sock, client_closure_alloc(int sock, struct sudo_event_base *base,
struct timespec *elapsed, struct timespec *restart, const char *iolog_id, struct timespec *elapsed, struct timespec *restart, const char *iolog_id,
struct iolog_info *log_info) struct iolog_info *log_info)
{ {
@ -446,6 +446,7 @@ client_closure_alloc(int sock,
debug_return_ptr(NULL); debug_return_ptr(NULL);
closure->sock = sock; closure->sock = sock;
closure->evbase = base;
TAILQ_INSERT_TAIL(&connections, closure, entries); TAILQ_INSERT_TAIL(&connections, closure, entries);
@ -721,7 +722,7 @@ fmt_accept_message(struct client_closure *closure)
client_msg.type_case = CLIENT_MESSAGE__TYPE_ACCEPT_MSG; client_msg.type_case = CLIENT_MESSAGE__TYPE_ACCEPT_MSG;
ret = fmt_client_message(&closure->write_buf, &client_msg); ret = fmt_client_message(&closure->write_buf, &client_msg);
if (ret) { if (ret) {
if (sudo_ev_add(NULL, closure->write_ev, NULL, false) == -1) if (sudo_ev_add(closure->evbase, closure->write_ev, NULL, false) == -1)
ret = false; ret = false;
} }
@ -763,7 +764,7 @@ fmt_restart_message(struct client_closure *closure)
client_msg.type_case = CLIENT_MESSAGE__TYPE_RESTART_MSG; client_msg.type_case = CLIENT_MESSAGE__TYPE_RESTART_MSG;
ret = fmt_client_message(&closure->write_buf, &client_msg); ret = fmt_client_message(&closure->write_buf, &client_msg);
if (ret) { if (ret) {
if (sudo_ev_add(NULL, closure->write_ev, NULL, false) == -1) if (sudo_ev_add(closure->evbase, closure->write_ev, NULL, false) == -1)
ret = false; ret = false;
} }
@ -1017,7 +1018,7 @@ client_message_completion(struct client_closure *closure)
break; break;
case SEND_EXIT: case SEND_EXIT:
/* Done writing, just waiting for final commit point. */ /* Done writing, just waiting for final commit point. */
sudo_ev_del(NULL, closure->write_ev); sudo_ev_del(closure->evbase, closure->write_ev);
closure->state = CLOSING; closure->state = CLOSING;
break; break;
default: default:
@ -1185,10 +1186,10 @@ handle_server_message(uint8_t *buf, size_t len,
case SERVER_MESSAGE__TYPE_COMMIT_POINT: case SERVER_MESSAGE__TYPE_COMMIT_POINT:
ret = handle_commit_point(msg->commit_point, closure); ret = handle_commit_point(msg->commit_point, closure);
if (sudo_timespeccmp(&closure->elapsed, &closure->committed, ==)) { if (sudo_timespeccmp(&closure->elapsed, &closure->committed, ==)) {
sudo_ev_del(NULL, closure->read_ev); sudo_ev_del(closure->evbase, closure->read_ev);
closure->state = FINISHED; closure->state = FINISHED;
if (++finished_transmissions == nr_of_conns) if (++finished_transmissions == nr_of_conns)
sudo_ev_loopexit(NULL); sudo_ev_loopexit(closure->evbase);
} }
break; break;
case SERVER_MESSAGE__TYPE_LOG_ID: case SERVER_MESSAGE__TYPE_LOG_ID:
@ -1259,7 +1260,7 @@ server_msg_cb(int fd, int what, void *v)
"SSL_read returns SSL_ERROR_WANT_WRITE"); "SSL_read returns SSL_ERROR_WANT_WRITE");
if (!sudo_ev_pending(closure->write_ev, SUDO_EV_WRITE, NULL)) { if (!sudo_ev_pending(closure->write_ev, SUDO_EV_WRITE, NULL)) {
/* Enable a temporary write event. */ /* Enable a temporary write event. */
if (sudo_ev_add(NULL, closure->write_ev, NULL, false) == -1) { if (sudo_ev_add(closure->evbase, closure->write_ev, NULL, false) == -1) {
sudo_warnx(U_("unable to add event to queue")); sudo_warnx(U_("unable to add event to queue"));
goto bad; goto bad;
} }
@ -1345,7 +1346,7 @@ client_msg_cb(int fd, int what, void *v)
/* Delete write event if it was only due to SSL_read(). */ /* Delete write event if it was only due to SSL_read(). */
if (closure->temporary_write_event) { if (closure->temporary_write_event) {
closure->temporary_write_event = false; closure->temporary_write_event = false;
sudo_ev_del(NULL, closure->write_ev); sudo_ev_del(closure->evbase, closure->write_ev);
} }
server_msg_cb(fd, what, v); server_msg_cb(fd, what, v);
debug_return; debug_return;
@ -1589,7 +1590,6 @@ main(int argc, char *argv[])
if ((evbase = sudo_ev_base_alloc()) == NULL) if ((evbase = sudo_ev_base_alloc()) == NULL)
sudo_fatal(NULL); sudo_fatal(NULL);
sudo_ev_base_setdef(evbase);
if (testrun) if (testrun)
printf("connecting clients...\n"); printf("connecting clients...\n");
@ -1602,8 +1602,9 @@ main(int argc, char *argv[])
if (!testrun) if (!testrun)
printf("Connected to %s:%s\n", host, port); printf("Connected to %s:%s\n", host, port);
closure = client_closure_alloc(sock, &elapsed, &restart, iolog_id, log_info); closure = client_closure_alloc(sock, evbase, &elapsed, &restart,
if (!closure) iolog_id, log_info);
if (closure == NULL)
goto bad; goto bad;
/* Open the I/O log files and seek to restart point if there is one. */ /* Open the I/O log files and seek to restart point if there is one. */

View File

@ -50,6 +50,7 @@ struct client_closure {
struct timespec elapsed; struct timespec elapsed;
struct timespec committed; struct timespec committed;
struct timing_closure timing; struct timing_closure timing;
struct sudo_event_base *evbase;
struct connection_buffer read_buf; struct connection_buffer read_buf;
struct connection_buffer write_buf; struct connection_buffer write_buf;
#if defined(HAVE_OPENSSL) #if defined(HAVE_OPENSSL)