From: Timo Sirainen Date: Fri, 2 Dec 2022 13:54:07 +0000 (+0200) Subject: global: Check for enum/array size mismatches with static_assert_array_size() X-Git-Tag: 2.4.0~3292 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cfb6d59806906206e42177e71f93e147d15e7793;p=thirdparty%2Fdovecot%2Fcore.git global: Check for enum/array size mismatches with static_assert_array_size() --- diff --git a/src/auth/auth-request-var-expand.c b/src/auth/auth-request-var-expand.c index aad851a254..b485977808 100644 --- a/src/auth/auth-request-var-expand.c +++ b/src/auth/auth-request-var-expand.c @@ -11,7 +11,7 @@ struct auth_request_var_expand_ctx { }; const struct var_expand_table -auth_request_var_expand_static_tab[AUTH_REQUEST_VAR_TAB_COUNT+1] = { +auth_request_var_expand_static_tab[] = { { 'u', NULL, "user" }, { 'n', NULL, "username" }, { 'd', NULL, "domain" }, @@ -65,6 +65,8 @@ auth_request_var_expand_static_tab[AUTH_REQUEST_VAR_TAB_COUNT+1] = { /* be sure to update AUTH_REQUEST_VAR_TAB_COUNT */ { '\0', NULL, NULL } }; +static_assert_array_size(auth_request_var_expand_static_tab, + AUTH_REQUEST_VAR_TAB_COUNT+1); static const char * escape_none(const char *string, diff --git a/src/auth/mech-digest-md5.c b/src/auth/mech-digest-md5.c index c64559a3b1..a4abd134ec 100644 --- a/src/auth/mech-digest-md5.c +++ b/src/auth/mech-digest-md5.c @@ -19,6 +19,7 @@ #define IS_LWS(c) ((c) == ' ' || (c) == '\t') static const char *qop_names[] = { "auth", "auth-int", "auth-conf" }; +static_assert_array_size(qop_names, QOP_COUNT); static string_t *get_digest_challenge(struct digest_auth_request *request) { diff --git a/src/doveadm/doveadm-mail-mailbox.c b/src/doveadm/doveadm-mail-mailbox.c index 8a85737905..a86fb28810 100644 --- a/src/doveadm/doveadm-mail-mailbox.c +++ b/src/doveadm/doveadm-mail-mailbox.c @@ -65,6 +65,7 @@ static const char *mailbox_list_path_type_names[] = { "dir", "alt-dir", "mailbox", "alt-mailbox", "control", "index", "index-private", "index-cache", "list-index", }; +static_assert_array_size(mailbox_list_path_type_names, MAILBOX_LIST_PATH_TYPE_COUNT); static void doveadm_mailbox_arg_check(const char *arg) { diff --git a/src/doveadm/dsync/dsync-brain-mails.c b/src/doveadm/dsync/dsync-brain-mails.c index 7865148062..1ee8659357 100644 --- a/src/doveadm/dsync/dsync-brain-mails.c +++ b/src/doveadm/dsync/dsync-brain-mails.c @@ -8,7 +8,7 @@ #include "dsync-mailbox-export.h" #include "dsync-brain-private.h" -const char *dsync_box_state_names[DSYNC_BOX_STATE_DONE+1] = { +const char *dsync_box_state_names[] = { "mailbox", "changes", "attributes", @@ -17,6 +17,7 @@ const char *dsync_box_state_names[DSYNC_BOX_STATE_DONE+1] = { "recv_last_common", "done" }; +static_assert_array_size(dsync_box_state_names, DSYNC_BOX_STATE_DONE+1); static bool dsync_brain_master_sync_recv_mailbox(struct dsync_brain *brain) { diff --git a/src/doveadm/dsync/dsync-brain.c b/src/doveadm/dsync/dsync-brain.c index a47e85c36b..c5adabb929 100644 --- a/src/doveadm/dsync/dsync-brain.c +++ b/src/doveadm/dsync/dsync-brain.c @@ -39,6 +39,7 @@ static const char *dsync_state_names[] = { "finish", "done" }; +static_assert_array_size(dsync_state_names, DSYNC_STATE_DONE+1); #define BRAIN_MASTER TRUE #define BRAIN_SLAVE FALSE diff --git a/src/doveadm/dsync/dsync-ibc-stream.c b/src/doveadm/dsync/dsync-ibc-stream.c index 17115b0833..585e74117f 100644 --- a/src/doveadm/dsync/dsync-ibc-stream.c +++ b/src/doveadm/dsync/dsync-ibc-stream.c @@ -64,7 +64,7 @@ static const struct { const char *required_keys; const char *optional_keys; unsigned int min_minor_version; -} items[ITEM_END_OF_LIST+1] = { +} items[] = { { NULL, '\0', NULL, NULL, 0 }, { .name = "done", .chr = 'X', @@ -139,6 +139,7 @@ static const struct { { "end_of_list", '\0', NULL, NULL, 0 } }; +static_assert_array_size(items, ITEM_END_OF_LIST+1); struct dsync_ibc_stream { struct dsync_ibc ibc; diff --git a/src/imap-login/imap-proxy.c b/src/imap-login/imap-proxy.c index a615aca4f1..fd7916bac1 100644 --- a/src/imap-login/imap-proxy.c +++ b/src/imap-login/imap-proxy.c @@ -17,14 +17,19 @@ #include "imap-quote.h" #include "imap-proxy.h" -static const char *imap_proxy_sent_state_names[IMAP_PROXY_SENT_STATE_COUNT] = { +static const char *imap_proxy_sent_state_names[] = { "id", "starttls", "capability", "authenticate", "auth-continue", "login" }; -static const char *imap_proxy_rcvd_state_names[IMAP_PROXY_RCVD_STATE_COUNT] = { +static_assert_array_size(imap_proxy_sent_state_names, + IMAP_PROXY_SENT_STATE_COUNT); + +static const char *imap_proxy_rcvd_state_names[] = { "none", "banner", "id", "starttls", "capability", "auth-continue", "login" }; +static_assert_array_size(imap_proxy_rcvd_state_names, + IMAP_PROXY_RCVD_STATE_COUNT); static void proxy_write_id(struct imap_client *client, string_t *str) { @@ -575,6 +580,7 @@ const char *imap_proxy_get_state(struct client *client) } } str_append_c(str, '/'); + str_append(str, imap_proxy_rcvd_state_names[imap_client->proxy_rcvd_state]); return str_c(str); } diff --git a/src/imap/imap-client.c b/src/imap/imap-client.c index 2b0fcb07db..05fe135975 100644 --- a/src/imap/imap-client.c +++ b/src/imap/imap-client.c @@ -44,7 +44,7 @@ unsigned int imap_client_count = 0; unsigned int imap_feature_condstore = UINT_MAX; unsigned int imap_feature_qresync = UINT_MAX; -static const char *client_command_state_names[CLIENT_COMMAND_STATE_DONE+1] = { +static const char *client_command_state_names[] = { "wait-input", "wait-output", "wait-external", @@ -52,6 +52,8 @@ static const char *client_command_state_names[CLIENT_COMMAND_STATE_DONE+1] = { "wait-sync", "done" }; +static_assert_array_size(client_command_state_names, + CLIENT_COMMAND_STATE_DONE+1); static void client_idle_timeout(struct client *client) { diff --git a/src/lib-fs/fs-randomfail.c b/src/lib-fs/fs-randomfail.c index e945bb33ed..95962d2384 100644 --- a/src/lib-fs/fs-randomfail.c +++ b/src/lib-fs/fs-randomfail.c @@ -12,10 +12,11 @@ #define RANDOMFAIL_ERROR "Random failure injection" -static const char *fs_op_names[FS_OP_COUNT] = { +static const char *fs_op_names[] = { "wait", "metadata", "prefetch", "read", "write", "lock", "exists", "stat", "copy", "rename", "delete", "iter" }; +static_assert_array_size(fs_op_names, FS_OP_COUNT); struct randomfail_fs { struct fs fs; diff --git a/src/lib-index/test-mail-cache.c b/src/lib-index/test-mail-cache.c index 1b5ad24971..9938e737c9 100644 --- a/src/lib-index/test-mail-cache.c +++ b/src/lib-index/test-mail-cache.c @@ -21,7 +21,7 @@ enum { TEST_FIELD_YES_FORCED, TEST_FIELD_COUNT, }; -static const struct mail_cache_field decision_cache_fields[TEST_FIELD_COUNT] = { +static const struct mail_cache_field decision_cache_fields[] = { { .name = "no", .type = MAIL_CACHE_FIELD_STRING, @@ -53,6 +53,7 @@ static const struct mail_cache_field decision_cache_fields[TEST_FIELD_COUNT] = { .decision = MAIL_CACHE_DECISION_YES | MAIL_CACHE_DECISION_FORCED, }, }; +static_assert_array_size(decision_cache_fields, TEST_FIELD_COUNT); static void test_mail_cache_fields(void) { diff --git a/src/lib-sql/driver-cassandra.c b/src/lib-sql/driver-cassandra.c index 40409202ed..948c792ab6 100644 --- a/src/lib-sql/driver-cassandra.c +++ b/src/lib-sql/driver-cassandra.c @@ -47,7 +47,7 @@ enum cassandra_counter_type { CASSANDRA_COUNTER_COUNT }; -static const char *counter_names[CASSANDRA_COUNTER_COUNT] = { +static const char *counter_names[] = { "sent", "recv_ok", "recv_err_no_hosts", @@ -58,6 +58,7 @@ static const char *counter_names[CASSANDRA_COUNTER_COUNT] = { "recv_err_other", "slow", }; +static_assert_array_size(counter_names, CASSANDRA_COUNTER_COUNT); enum cassandra_query_type { CASSANDRA_QUERY_TYPE_READ, @@ -68,9 +69,11 @@ enum cassandra_query_type { CASSANDRA_QUERY_TYPE_COUNT }; -static const char *cassandra_query_type_names[CASSANDRA_QUERY_TYPE_COUNT] = { +static const char *cassandra_query_type_names[] = { "read", "read-more", "write", "delete" }; +static_assert_array_size(cassandra_query_type_names, + CASSANDRA_QUERY_TYPE_COUNT); struct cassandra_callback { unsigned int id; diff --git a/src/lib-storage/index/index-mail.c b/src/lib-storage/index/index-mail.c index 49c73acf6b..12079a1751 100644 --- a/src/lib-storage/index/index-mail.c +++ b/src/lib-storage/index/index-mail.c @@ -26,7 +26,7 @@ #define BODY_SNIPPET_ALGO_V1 "1" #define BODY_SNIPPET_MAX_CHARS 200 -static struct mail_cache_field global_cache_fields[MAIL_INDEX_CACHE_FIELD_COUNT] = { +static struct mail_cache_field global_cache_fields[] = { { .name = "flags", .type = MAIL_CACHE_FIELD_BITMASK, .field_size = sizeof(uint32_t) }, @@ -68,6 +68,7 @@ static struct mail_cache_field global_cache_fields[MAIL_INDEX_CACHE_FIELD_COUNT] index-status.c when adding more fields. those fields should probably just be moved here to the same struct. */ }; +static_assert_array_size(global_cache_fields, MAIL_INDEX_CACHE_FIELD_COUNT); static void index_mail_init_data(struct index_mail *mail); static int index_mail_parse_body(struct index_mail *mail, diff --git a/src/lib/event-filter.c b/src/lib/event-filter.c index e33dcb2b06..ac1d312675 100644 --- a/src/lib/event-filter.c +++ b/src/lib/event-filter.c @@ -33,6 +33,7 @@ static const struct log_type_map { [LOG_TYPE_FATAL] = { EVENT_FILTER_LOG_TYPE_FATAL, "fatal" }, [LOG_TYPE_PANIC] = { EVENT_FILTER_LOG_TYPE_PANIC, "panic" }, }; +static_assert_array_size(event_filter_log_type_map, LOG_TYPE_COUNT); struct event_filter_query_internal { struct event_filter_node *expr; diff --git a/src/lib/failures.c b/src/lib/failures.c index 4ea7675098..5990a750f5 100644 --- a/src/lib/failures.c +++ b/src/lib/failures.c @@ -22,7 +22,7 @@ #define LOG_TYPE_FLAG_PREFIX_LEN 0x40 #define LOG_TYPE_FLAG_DISABLE_LOG_PREFIX 0x80 -const char *failure_log_type_prefixes[LOG_TYPE_COUNT] = { +const char *failure_log_type_prefixes[] = { "Debug: ", "Info: ", "Warning: ", @@ -30,6 +30,7 @@ const char *failure_log_type_prefixes[LOG_TYPE_COUNT] = { "Fatal: ", "Panic: " }; +static_assert_array_size(failure_log_type_prefixes, LOG_TYPE_COUNT); const char *failure_log_type_names[LOG_TYPE_COUNT] = { "debug", "info", "warning", "error", "fatal", "panic" diff --git a/src/lib/var-expand-if.c b/src/lib/var-expand-if.c index aa0a9b3e9d..0387840a4a 100644 --- a/src/lib/var-expand-if.c +++ b/src/lib/var-expand-if.c @@ -34,7 +34,7 @@ enum var_expand_if_op { static enum var_expand_if_op var_expand_if_str_to_comp(const char *op) { - const char *ops[OP_COUNT] = { + const char *ops[] = { NULL, "==", "<", @@ -53,6 +53,7 @@ static enum var_expand_if_op var_expand_if_str_to_comp(const char *op) "~", "!~", }; + static_assert_array_size(ops, OP_COUNT); for(enum var_expand_if_op i = 1; i < OP_COUNT; i++) { i_assert(ops[i] != NULL); if (strcmp(op, ops[i]) == 0) diff --git a/src/plugins/acl/acl-mailbox-list.c b/src/plugins/acl/acl-mailbox-list.c index 4d3eb761c6..596bcbb07a 100644 --- a/src/plugins/acl/acl-mailbox-list.c +++ b/src/plugins/acl/acl-mailbox-list.c @@ -25,7 +25,7 @@ struct acl_mailbox_list_iterate_context { bool autocreate_acls_checked:1; }; -static const char *acl_storage_right_names[ACL_STORAGE_RIGHT_COUNT] = { +static const char *acl_storage_right_names[] = { MAIL_ACL_LOOKUP, MAIL_ACL_READ, MAIL_ACL_WRITE, @@ -38,6 +38,7 @@ static const char *acl_storage_right_names[ACL_STORAGE_RIGHT_COUNT] = { MAIL_ACL_DELETE, MAIL_ACL_ADMIN }; +static_assert_array_size(acl_storage_right_names, ACL_STORAGE_RIGHT_COUNT); #define ACL_LIST_ITERATE_CONTEXT(obj) \ MODULE_CONTEXT_REQUIRE(obj, acl_mailbox_list_module) diff --git a/src/pop3-login/pop3-proxy.c b/src/pop3-login/pop3-proxy.c index 33786971f2..2641da8c28 100644 --- a/src/pop3-login/pop3-proxy.c +++ b/src/pop3-login/pop3-proxy.c @@ -14,9 +14,10 @@ #include "client.h" #include "pop3-proxy.h" -static const char *pop3_proxy_state_names[POP3_PROXY_STATE_COUNT] = { +static const char *pop3_proxy_state_names[] = { "banner", "starttls", "xclient", "login1", "login2" }; +static_assert_array_size(pop3_proxy_state_names, POP3_PROXY_STATE_COUNT); static int proxy_send_login(struct pop3_client *client, struct ostream *output) { diff --git a/src/submission-login/submission-proxy.c b/src/submission-login/submission-proxy.c index a98d0bd59d..fac0b52ccc 100644 --- a/src/submission-login/submission-proxy.c +++ b/src/submission-login/submission-proxy.c @@ -17,9 +17,11 @@ #include -static const char *submission_proxy_state_names[SUBMISSION_PROXY_STATE_COUNT] = { +static const char *submission_proxy_state_names[] = { "banner", "ehlo", "starttls", "tls-ehlo", "xclient", "xclient-ehlo", "authenticate" }; +static_assert_array_size(submission_proxy_state_names, + SUBMISSION_PROXY_STATE_COUNT); static void submission_proxy_success_reply_sent(