]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: event_logv() - Make sure errno is preserved
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Wed, 10 Mar 2021 11:50:00 +0000 (13:50 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Thu, 11 Mar 2021 13:00:53 +0000 (13:00 +0000)
It already should have been, but this change makes it clearer and more
future-safe.

src/lib/event-log.c
src/lib/test-event-log.c

index d62d0efd16af76071019c60dcef32d097b5b16a1..8564497a81dc8f8142c5bff4bf71d1c48d9f5940 100644 (file)
@@ -300,7 +300,6 @@ event_logv_params(struct event *event, const struct event_log_params *params,
                .type = params->log_type,
        };
        bool abort_after_event = FALSE;
-       int old_errno = errno;
 
        i_assert(!params->no_send || params->base_str_out != NULL);
 
@@ -344,7 +343,6 @@ event_logv_params(struct event *event, const struct event_log_params *params,
        }
        if (abort_after_event)
                abort();
-       errno = old_errno;
 }
 
 void event_logv(struct event *event, const struct event_log_params *params,
@@ -352,6 +350,7 @@ void event_logv(struct event *event, const struct event_log_params *params,
 {
        const char *orig_source_filename = event->source_filename;
        unsigned int orig_source_linenum = event->source_linenum;
+       int old_errno = errno;
 
        if (params->source_filename != NULL) {
                event_set_source(event, params->source_filename,
@@ -367,6 +366,7 @@ void event_logv(struct event *event, const struct event_log_params *params,
        event_set_source(event, orig_source_filename,
                         orig_source_linenum, TRUE);
        event_unref(&event);
+       errno = old_errno;
 }
 
 struct event *event_set_forced_debug(struct event *event, bool force)
index 99c9b6a94123e00e8841e9cf979fa7f958586a04..1be4c9ee1e53eace4e8a78a6680e409b24dc7cf5 100644 (file)
@@ -2503,6 +2503,7 @@ static void test_event_log_level(void)
 
        struct event *event = event_create(NULL);
        event_set_min_log_level(event, LOG_TYPE_WARNING);
+       errno = EACCES;
        e_info(event, "Info event");
        test_assert(test_output == NULL);
        e_warning(event, "Warning event");
@@ -2511,6 +2512,7 @@ static void test_event_log_level(void)
        i_set_info_handler(orig_info);
        i_set_error_handler(orig_error);
        i_free(test_output);
+       test_assert(errno == EACCES);
        test_end();
 }