diff --git a/src/lib-sieve/util/edit-mail.c b/src/lib-sieve/util/edit-mail.c index 5034e5803a3ba634aad81d14936b61422ba10b5d..1ad9406c1d560398593f96e8bed1f619745d82f2 100644 --- a/src/lib-sieve/util/edit-mail.c +++ b/src/lib-sieve/util/edit-mail.c @@ -2002,9 +2002,14 @@ static ssize_t edit_mail_istream_read(struct istream_private *stream) */ hdr_size = (prep_hdr_size + edmail->wrapped_hdr_size.physical_size); - i_assert(hdr_size > 0); - if (append_v_offset <= (hdr_size - 1) && - edmail->wrapped_hdr_size.physical_size > 0) { + if (hdr_size == 0) { + /* Corner case that doesn't happen in practice (the + original message is never empty). */ + edstream->cur_header = edmail->header_fields_appended; + edstream->cur_header_v_offset = v_offset; + edstream->header_read = TRUE; + } else if (append_v_offset <= (hdr_size - 1) && + edmail->wrapped_hdr_size.physical_size > 0) { parent_v_offset = stream->parent_start_offset; parent_end_v_offset = (stream->parent_start_offset + @@ -2055,6 +2060,11 @@ static ssize_t edit_mail_istream_read(struct istream_private *stream) edmail->wrapped_hdr_size.physical_size - (edmail->eoh_crlf ? 2 : 1)); copy_v_offset = edmail->hdr_size.physical_size; + /* Corner case that doesn't happen in practice (the original message is + never empty). */ + } else if (edmail->wrapped_hdr_size.physical_size == 0) { + parent_v_offset = stream->parent_start_offset; + copy_v_offset = edmail->hdr_size.physical_size; /* Header comes partially from original mail and headers are added between header and body. */ } else if (edmail->header_fields_appended != NULL) { diff --git a/src/lib-sieve/util/test-edit-mail.c b/src/lib-sieve/util/test-edit-mail.c index 0e263a2c205034c96e841a2c7ab3d9b7dd5652b7..a6623ff10f36f5182a19b587f65cbd2791f29779 100644 --- a/src/lib-sieve/util/test-edit-mail.c +++ b/src/lib-sieve/util/test-edit-mail.c @@ -809,12 +809,69 @@ static void test_edit_mail_small_buffer(void) test_end(); } +static void test_edit_mail_empty(void) +{ + struct istream *input_msg, *input_mail; + buffer_t *buffer; + struct mail_raw *rawmail; + struct edit_mail *edmail; + struct mail *mail; + const char *value; + + test_begin("edit-mail - empty message"); + test_init(); + + /* Compose the message */ + + input_msg = i_stream_create_from_data("", 0); + + rawmail = mail_raw_open_stream(test_raw_mail_user, input_msg); + + edmail = edit_mail_wrap(rawmail->mail); + + /* Add header */ + + edit_mail_header_add(edmail, "X-B", "Frop", TRUE); + mail = edit_mail_get_mail(edmail); + + /* Prepare tests */ + + if (mail_get_stream(mail, NULL, NULL, &input_mail) < 0) { + i_fatal("Failed to open mail stream: %s", + mailbox_get_last_error(mail->box, NULL)); + } + + buffer = buffer_create_dynamic(default_pool, 1024); + + /* Evaluate modified header */ + + test_assert(mail_get_first_header_utf8(mail, "X-B", &value) > 0 && + strcmp(value, "Frop") == 0); + + /* Added */ + + i_stream_seek(input_mail, 0); + buffer_set_used_size(buffer, 0); + + test_stream_data(input_mail, buffer); + + /* Clean up */ + + buffer_free(&buffer); + edit_mail_unwrap(&edmail); + mail_raw_close(&rawmail); + i_stream_unref(&input_msg); + test_deinit(); + test_end(); +} + int main(int argc, char *argv[]) { static void (*test_functions[])(void) = { test_edit_mail_concatenated, test_edit_mail_big_header, test_edit_mail_small_buffer, + test_edit_mail_empty, NULL }; const enum master_service_flags service_flags = diff --git a/tests/extensions/editheader/addheader.svtest b/tests/extensions/editheader/addheader.svtest index 426b43dd277296fdc19c908d118649b8b8f1cd9c..cf0d46a77c0ad4fe34fc0bfe23967b7a5390db5b 100644 --- a/tests/extensions/editheader/addheader.svtest +++ b/tests/extensions/editheader/addheader.svtest @@ -831,3 +831,56 @@ test "Addheader - devious characters" { test_fail "body not retained in stored mail"; } } + +test_result_reset; +test_set "message" ""; +test "Addheader - empty" { + addheader :last "X-Some-Header" "Header content"; + + if not size :over 0 { + test_fail "mail is not larger"; + } + + if not exists "x-some-header" { + test_fail "header not added"; + } + + if not header :is "x-some-header" "Header content" { + test_fail "wrong content added"; + } + + redirect "frop@example.com"; + fileinto :create "folder8"; + + if not test_result_execute { + test_fail "failed to execute result"; + } + + if not test_message :folder "folder8" 0 { + test_fail "message not stored"; + } + + if not size :over 0 { + test_fail "stored mail is not larger"; + } + + if not exists "x-some-header" { + test_fail "header not in stored mail"; + } + + if not header :is "x-some-header" "Header content" { + test_fail "wrong content in stored mail "; + } + + if not test_message :smtp 0 { + test_fail "message not redirected"; + } + + if not exists "x-some-header" { + test_fail "header not in redirected mail"; + } + + if not header :is "x-some-header" "Header content" { + test_fail "wrong content in redirected mail "; + } +}