]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-index: Add and use mail_index_ext_name_is_valid()
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Fri, 24 Sep 2021 13:27:40 +0000 (16:27 +0300)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Tue, 5 Oct 2021 07:44:52 +0000 (07:44 +0000)
Use it in mail_index_ext_register() instead of the more relaxed
str_sanitize() check.

src/lib-index/mail-index-private.h
src/lib-index/mail-index.c

index 1384f1343977b3e6a9b509a0ebc5f63c9684066e..7efaf6bf5dc88dda9f01234c85487f60341ceefe 100644 (file)
@@ -41,6 +41,7 @@ struct mail_index_sync_map_ctx;
         (u)->modseq_inc_flag == 0)
 
 #define MAIL_INDEX_EXT_KEYWORDS "keywords"
+#define MAIL_INDEX_EXT_NAME_MAX_LENGTH 64
 
 typedef int mail_index_expunge_handler_t(struct mail_index_sync_map_ctx *ctx,
                                         const void *data, void **sync_context);
@@ -367,6 +368,7 @@ void mail_index_fchown(struct mail_index *index, int fd, const char *path);
 
 bool mail_index_map_lookup_ext(struct mail_index_map *map, const char *name,
                               uint32_t *idx_r);
+bool mail_index_ext_name_is_valid(const char *name);
 uint32_t
 mail_index_map_register_ext(struct mail_index_map *map,
                            const char *name, uint32_t ext_offset,
index 9796c394be57e49297ac5e0fb6d75f7073df04c6..8f89309cf5b374c34111ad10fbb8b6f200012190 100644 (file)
@@ -24,6 +24,7 @@
 #include <stddef.h>
 #include <time.h>
 #include <sys/stat.h>
+#include <ctype.h>
 
 struct mail_index_module_register mail_index_module_register = { 0 };
 
@@ -244,6 +245,19 @@ void mail_index_set_ext_init_data(struct mail_index *index, uint32_t ext_id,
        memcpy(index->set.ext_hdr_init_data, data, size);
 }
 
+bool mail_index_ext_name_is_valid(const char *name)
+{
+       size_t i;
+
+       for (i = 0; name[i] != '\0'; i++) {
+               if (!i_isalnum(name[i]) && name[i] != '-' && name[i] != '_' &&
+                   name[i] != ' ')
+                       return FALSE;
+
+       }
+       return i == 0 || i < MAIL_INDEX_EXT_NAME_MAX_LENGTH;
+}
+
 uint32_t mail_index_ext_register(struct mail_index *index, const char *name,
                                 uint32_t default_hdr_size,
                                 uint16_t default_record_size,
@@ -252,7 +266,7 @@ uint32_t mail_index_ext_register(struct mail_index *index, const char *name,
        struct mail_index_registered_ext rext;
        uint32_t ext_id;
 
-       if (*name == '\0' || strcmp(name, str_sanitize(name, SIZE_MAX)) != 0)
+       if (!mail_index_ext_name_is_valid(name))
                i_panic("mail_index_ext_register(%s): Invalid name", name);
 
        if (default_record_size != 0 && default_record_align == 0) {