From: Timo Sirainen Date: Tue, 22 Dec 2020 08:22:38 +0000 (+0200) Subject: lib-master, stats: Fix sending and parsing UPDATE commands X-Git-Tag: 2.3.13^0 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fheads%2Frelease-2.3.13;p=thirdparty%2Fdovecot%2Fcore.git lib-master, stats: Fix sending and parsing UPDATE commands These commands were parsed completely wrong, resulting in errors like: Client sent invalid input for UPDATE: Invalid tv_created: Invalid timeval microseconds parameter --- diff --git a/src/lib-master/stats-client.c b/src/lib-master/stats-client.c index 8a43f86c59..0e95ab0b78 100644 --- a/src/lib-master/stats-client.c +++ b/src/lib-master/stats-client.c @@ -164,6 +164,7 @@ stats_event_write(struct event *event, const struct failure_context *ctx, { struct event *merged_event; struct event *parent_event; + bool update = FALSE; merged_event = begin ? event_ref(event) : event_minimize(event); parent_event = merged_event->parent; @@ -176,16 +177,17 @@ stats_event_write(struct event *event, const struct failure_context *ctx, } if (begin) { i_assert(event == merged_event); - const char *cmd = event->sent_to_stats_id == 0 ? - "BEGIN" : "UPDATE"; + update = (event->sent_to_stats_id != 0); + const char *cmd = !update ? "BEGIN" : "UPDATE"; str_printfa(str, "%s\t%"PRIu64"\t", cmd, event->id); event->sent_to_stats_id = event->change_id; } else { str_append(str, "EVENT\t"); } - str_printfa(str, "%"PRIu64"\t%u\t", - parent_event == NULL ? 0 : parent_event->id, - ctx->type); + str_printfa(str, "%"PRIu64"\t", + parent_event == NULL ? 0 : parent_event->id); + if (!update) + str_printfa(str, "%u\t", ctx->type); event_export(merged_event, str); str_append_c(str, '\n'); event_unref(&merged_event); diff --git a/src/lib-master/test-event-stats.c b/src/lib-master/test-event-stats.c index ecf7dcd963..7d21154295 100644 --- a/src/lib-master/test-event-stats.c +++ b/src/lib-master/test-event-stats.c @@ -589,7 +589,7 @@ static void test_parent_update_post_send(void) " stest-event-stats.c %d" " l1 0 ctest2" " Ib 2\n" /* second e_info() */ - "UPDATE %"PRIu64" 0 1 0 0" + "UPDATE %"PRIu64" 0 0 0" " stest-event-stats.c %d ctest1" " Ia 1000\n" "BEGIN %"PRIu64" %"PRIu64" 1 0 0" diff --git a/src/stats/client-writer.c b/src/stats/client-writer.c index bf3f621a09..4079568754 100644 --- a/src/stats/client-writer.c +++ b/src/stats/client-writer.c @@ -206,7 +206,7 @@ writer_client_input_event_update(struct writer_client *client, *error_r = "Event unexpectedly changed parent"; return FALSE; } - return event_import_unescaped(stats_event->event, args, error_r); + return event_import_unescaped(stats_event->event, args+2, error_r); } static bool