]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-mail: Change rfc822_parser_context.nul_replacement_char to string
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Wed, 25 Apr 2018 11:11:43 +0000 (14:11 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Thu, 30 Aug 2018 08:18:43 +0000 (11:18 +0300)
src/lib-mail/message-address.c
src/lib-mail/rfc2231-parser.c
src/lib-mail/rfc822-parser.c
src/lib-mail/rfc822-parser.h
src/lib-mail/test-rfc822-parser.c

index f217b87a85843541770199ea88eb4e241d0b7def..0a437e4a30b1e6b3d9586c115dc3cd34bf1e7ecd 100644 (file)
@@ -426,7 +426,7 @@ message_address_parse_real(pool_t pool, const unsigned char *data, size_t size,
        i_zero(&ctx);
 
        rfc822_parser_init(&ctx.parser, data, size, t_str_new(128));
-       ctx.parser.nul_replacement_char = RFC822_NUL_REPLACEMENT_CHAR;
+       ctx.parser.nul_replacement_str = RFC822_NUL_REPLACEMENT_STR;
        ctx.pool = pool;
        ctx.str = t_str_new(128);
        ctx.fill_missing = fill_missing;
index 9b6cd4d360221d62864efc191e813914f19cde80..6aa25470a3d7e497c4690d180fee40920f0578b6 100644 (file)
@@ -47,13 +47,13 @@ int rfc2231_parse(struct rfc822_parser_context *ctx,
        string_t *str;
        unsigned int i, j, count, next, next_idx;
        bool ok, have_extended, broken = FALSE;
-       char prev_replacement_char;
+       const char *prev_replacement_str;
        int ret;
 
        /* Temporarily replace the nul_replacement_char while we're parsing
           the content-params. It'll be restored before we return. */
-       prev_replacement_char = ctx->nul_replacement_char;
-       ctx->nul_replacement_char = RFC822_NUL_REPLACEMENT_CHAR;
+       prev_replacement_str = ctx->nul_replacement_str;
+       ctx->nul_replacement_str = RFC822_NUL_REPLACEMENT_STR;
 
        /* Get a list of all parameters. RFC 2231 uses key*<n>[*]=value pairs,
           which we want to merge to a key[*]=value pair. Save them to a
@@ -103,7 +103,7 @@ int rfc2231_parse(struct rfc822_parser_context *ctx,
                        array_append(&result, &value, 1);
                }
        }
-       ctx->nul_replacement_char = prev_replacement_char;
+       ctx->nul_replacement_str = prev_replacement_str;
 
        if (array_count(&rfc2231_params_arr) == 0) {
                /* No RFC 2231 parameters */
index ed24a606636696a40bdc183db3e1678fc19fdaa0..57a8171a9395d77c1210b9c0553679e540682e66 100644 (file)
@@ -77,11 +77,11 @@ int rfc822_skip_comment(struct rfc822_parser_context *ctx)
                switch (*ctx->data) {
                case '\0':
                        if (ctx->last_comment != NULL &&
-                           ctx->nul_replacement_char != '\0') {
+                           ctx->nul_replacement_str != NULL) {
                                str_append_data(ctx->last_comment, start,
                                                ctx->data - start);
-                               str_append_c(ctx->last_comment,
-                                            ctx->nul_replacement_char);
+                               str_append(ctx->last_comment,
+                                          ctx->nul_replacement_str);
                                start = ctx->data + 1;
                        }
                        break;
@@ -247,9 +247,9 @@ int rfc822_parse_quoted_string(struct rfc822_parser_context *ctx, string_t *str)
        for (start = ctx->data; ctx->data < ctx->end; ctx->data++) {
                switch (*ctx->data) {
                case '\0':
-                       if (ctx->nul_replacement_char != '\0') {
+                       if (ctx->nul_replacement_str != NULL) {
                                str_append_data(str, start, ctx->data - start);
-                               str_append_c(str, ctx->nul_replacement_char);
+                               str_append(str, ctx->nul_replacement_str);
                                start = ctx->data + 1;
                        }
                        break;
@@ -364,9 +364,9 @@ rfc822_parse_domain_literal(struct rfc822_parser_context *ctx, string_t *str)
        for (start = ctx->data++; ctx->data < ctx->end; ctx->data++) {
                switch (*ctx->data) {
                case '\0':
-                       if (ctx->nul_replacement_char != '\0') {
+                       if (ctx->nul_replacement_str != NULL) {
                                str_append_data(str, start, ctx->data - start);
-                               str_append_c(str, ctx->nul_replacement_char);
+                               str_append(str, ctx->nul_replacement_str);
                                start = ctx->data + 1;
                        }
                        break;
index f36ec103f036869727f25ee001cf1cc429dc60cc..fa41a6e21bec9cb4c1a5a1a6d4590a9400ae44ae 100644 (file)
@@ -2,14 +2,14 @@
 #define RFC822_PARSER_H
 
 /* This can be used as a common NUL replacement character */
-#define RFC822_NUL_REPLACEMENT_CHAR 0x80
+#define RFC822_NUL_REPLACEMENT_STR "\x80"
 
 struct rfc822_parser_context {
        const unsigned char *data, *end;
        string_t *last_comment;
 
-       /* Replace NULs with this character */
-       char nul_replacement_char;
+       /* Replace NUL characters with this string */
+       const char *nul_replacement_str;
 };
 
 #define IS_ATEXT(c) \
index 7f0e1b1c5fcfceb47fe2cb3add1965ba55d77e88..6ac4fad5ebdffff3a5e0b2b1c527cd4719009ef6 100644 (file)
@@ -68,7 +68,7 @@ static void test_rfc822_parse_comment_nuls(void)
 
        str_truncate(str, 0);
        rfc822_parser_init(&parser, input, sizeof(input)-1, str);
-       parser.nul_replacement_char = '!';
+       parser.nul_replacement_str = "!";
        test_assert(rfc822_skip_comment(&parser) == 0);
        test_assert(strcmp(str_c(str), output) == 0);
        rfc822_parser_deinit(&parser);