diff options
author | Todd C. Miller <Todd.Miller@sudo.ws> | 2021-04-23 16:56:20 -0600 |
---|---|---|
committer | Todd C. Miller <Todd.Miller@sudo.ws> | 2021-04-23 16:56:20 -0600 |
commit | 557caa4474eac2bf80cccbb88842dc200e8e99b3 (patch) | |
tree | 464ccb7aef89d2528b3b6d192ed17cb6dc9e00dd /logsrvd/logsrvd.c | |
parent | 33316bce17e3dab054075167494563189d323f73 (diff) | |
download | sudo-557caa4474eac2bf80cccbb88842dc200e8e99b3.tar.gz |
Add enqueue_error_message() helper function.
Formats and enqueues an error message and enables the write event.
Diffstat (limited to 'logsrvd/logsrvd.c')
-rw-r--r-- | logsrvd/logsrvd.c | 57 |
1 files changed, 35 insertions, 22 deletions
diff --git a/logsrvd/logsrvd.c b/logsrvd/logsrvd.c index f7c92f71c..ca435d3c3 100644 --- a/logsrvd/logsrvd.c +++ b/logsrvd/logsrvd.c @@ -355,7 +355,7 @@ fmt_log_id_message(const char *id, struct connection_closure *closure) debug_return_bool(fmt_server_message(closure, &msg)); } -bool +static bool fmt_error_message(const char *errstr, struct connection_closure *closure) { ServerMessage msg = SERVER_MESSAGE__INIT; @@ -367,6 +367,35 @@ fmt_error_message(const char *errstr, struct connection_closure *closure) debug_return_bool(fmt_server_message(closure, &msg)); } +/* + * Format a ServerMessage with the error string and add it to the write queue. + * Also sets the state to ERROR. + * Returns true if successfully scheduled, else false. + */ +bool +schedule_error_message(const char *errstr, struct connection_closure *closure) +{ + debug_decl(schedule_error_message, SUDO_DEBUG_UTIL); + + if (errstr == NULL || closure->state == ERROR || closure->write_ev == NULL) + debug_return_bool(false); + + /* Set state to ERROR regardless of whether we can send the message. */ + closure->state = ERROR; + + /* Format error message and add to the write queue. */ + if (!fmt_error_message(errstr, closure)) + debug_return_bool(false); + if (sudo_ev_add(closure->evbase, closure->write_ev, + logsrvd_conf_server_timeout(), false) == -1) { + sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, + "unable to add server write event"); + debug_return_bool(false); + } + + debug_return_bool(true); +} + struct logsrvd_info_closure { InfoMessage **info_msgs; size_t infolen; @@ -665,17 +694,9 @@ handle_restart(RestartMessage *msg, uint8_t *buf, size_t len, } if (!restarted) { sudo_debug_printf(SUDO_DEBUG_WARN, "%s: unable to restart I/O log", __func__); - /* XXX - structured error message so client can send from beginning */ - if (!fmt_error_message(closure->errstr, closure)) - debug_return_bool(false); sudo_ev_del(closure->evbase, closure->read_ev); - if (sudo_ev_add(closure->evbase, closure->write_ev, - logsrvd_conf_server_timeout(), false) == -1) { - sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, - "unable to add server write event"); + if (!schedule_error_message(closure->errstr, closure)) debug_return_bool(false); - } - closure->state = ERROR; debug_return_bool(true); } @@ -1272,24 +1293,16 @@ client_msg_cb(int fd, int what, void *v) goto close_connection; debug_return; + send_error: /* - * Try to send client an error message before closing connection. - * If we are already in an error state, just give up. + * Try to send client an error message before closing the connection. */ - if (closure->state == ERROR || closure->write_ev == NULL) - goto close_connection; - if (closure->errstr == NULL || !fmt_error_message(closure->errstr, closure)) - goto close_connection; sudo_ev_del(closure->evbase, closure->read_ev); - if (sudo_ev_add(closure->evbase, closure->write_ev, - logsrvd_conf_server_timeout(), false) == -1) { - sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO, - "unable to add server write event"); + if (!schedule_error_message(closure->errstr, closure)) goto close_connection; - } - closure->state = ERROR; debug_return; + close_connection: connection_close(closure); debug_return; |