summaryrefslogtreecommitdiff
path: root/logsrvd/logsrvd.c
diff options
context:
space:
mode:
authorTodd C. Miller <Todd.Miller@sudo.ws>2021-04-23 16:56:20 -0600
committerTodd C. Miller <Todd.Miller@sudo.ws>2021-04-23 16:56:20 -0600
commit557caa4474eac2bf80cccbb88842dc200e8e99b3 (patch)
tree464ccb7aef89d2528b3b6d192ed17cb6dc9e00dd /logsrvd/logsrvd.c
parent33316bce17e3dab054075167494563189d323f73 (diff)
downloadsudo-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.c57
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;