summaryrefslogtreecommitdiff
path: root/logsrvd/logsrvd.c
diff options
context:
space:
mode:
authorTodd C. Miller <Todd.Miller@sudo.ws>2021-05-03 19:18:10 -0600
committerTodd C. Miller <Todd.Miller@sudo.ws>2021-05-03 19:18:10 -0600
commite0bf62d87fcfed4679594c6f232e742838b731e4 (patch)
tree53dfc4593e61b1adf6a7c434a4fbdd7a83989450 /logsrvd/logsrvd.c
parent415ea7f57bd754858880fc3a5354188017d01aaa (diff)
downloadsudo-e0bf62d87fcfed4679594c6f232e742838b731e4.tar.gz
Disable reading from client or relay when sending error to client.
We treat an error from the relay as fatal and must stop processing data from both client and relay to make sure we don't get out of sync.
Diffstat (limited to 'logsrvd/logsrvd.c')
-rw-r--r--logsrvd/logsrvd.c25
1 files changed, 15 insertions, 10 deletions
diff --git a/logsrvd/logsrvd.c b/logsrvd/logsrvd.c
index 95cdb3bfd..cdf7ee2e5 100644
--- a/logsrvd/logsrvd.c
+++ b/logsrvd/logsrvd.c
@@ -395,25 +395,32 @@ fmt_error_message(const char *errstr, struct connection_closure *closure)
bool
schedule_error_message(const char *errstr, struct connection_closure *closure)
{
+ bool ret = false;
debug_decl(schedule_error_message, SUDO_DEBUG_UTIL);
- if (errstr == NULL || closure->state == ERROR || closure->write_ev == NULL)
- debug_return_bool(false);
+ sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
+ "send error to client: %s", errstr ? errstr : "none");
- /* Set state to ERROR regardless of whether we can send the message. */
- closure->state = ERROR;
+ /* Prevent further reads from the client, just write the error. */
+ sudo_ev_del(closure->evbase, closure->read_ev);
+
+ if (errstr == NULL || closure->state == ERROR || closure->write_ev == NULL)
+ goto done;
/* Format error message and add to the write queue. */
if (!fmt_error_message(errstr, closure))
- debug_return_bool(false);
+ goto done;
if (sudo_ev_add(closure->evbase, closure->write_ev,
- logsrvd_conf_server_timeout(), false) == -1) {
+ logsrvd_conf_server_timeout(), true) == -1) {
sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
"unable to add server write event");
- debug_return_bool(false);
+ goto done;
}
+ ret = true;
- debug_return_bool(true);
+done:
+ closure->state = ERROR;
+ debug_return_bool(ret);
}
/*
@@ -571,7 +578,6 @@ handle_restart(RestartMessage *msg, uint8_t *buf, size_t len,
/* Report error to client before closing the connection. */
sudo_debug_printf(SUDO_DEBUG_WARN, "%s: unable to restart I/O log",
__func__);
- sudo_ev_del(closure->evbase, closure->read_ev);
if (!schedule_error_message(closure->errstr, closure))
ret = false;
}
@@ -1118,7 +1124,6 @@ send_error:
/*
* Try to send client an error message before closing the connection.
*/
- sudo_ev_del(closure->evbase, closure->read_ev);
if (!schedule_error_message(closure->errstr, closure))
goto close_connection;
debug_return;