input = i_stream_create_from_data(message, strlen(message));
parser = message_parser_init(pool, input, &parser_set);
+ struct message_part_data_limits limits = MESSAGE_PART_DATA_LIMITS_INIT;
while ((ret = message_parser_parse_next_block(parser, &block)) > 0) {
if (parse_bodystructure) {
message_part_data_parse_from_header(pool, block.part,
- block.hdr);
+ &limits, block.hdr);
}
}
test_assert(ret < 0);
input = i_stream_create_from_data(message, strlen(message));
parser = message_parser_init(pool, input, &parser_set);
+ struct message_part_data_limits limits = MESSAGE_PART_DATA_LIMITS_INIT;
while ((ret = message_parser_parse_next_block(parser, &block)) > 0) {
i_assert(block.part->parent == NULL);
- message_part_envelope_parse_from_header(pool, &envlp, block.hdr);
+ message_part_envelope_parse_from_header(pool, &envlp, &limits,
+ block.hdr);
}
test_assert(ret < 0);
void message_part_envelope_parse_from_header(pool_t pool,
struct message_part_envelope **data,
+ struct message_part_data_limits *limits ATTR_UNUSED,
struct message_header_line *hdr)
{
struct message_part_envelope *d;
void message_part_data_parse_from_header(pool_t pool,
struct message_part *part,
+ struct message_part_data_limits *limits,
struct message_header_line *hdr)
{
struct message_part_data *part_data;
if (parent_rfc822) {
/* message/rfc822, we need the envelope */
- message_part_envelope_parse_from_header(pool, &part_data->envelope, hdr);
+ message_part_envelope_parse_from_header(pool, &part_data->envelope,
+ limits, hdr);
}
}
struct message_header_line;
+struct message_part_data_limits {
+};
+
+#define MESSAGE_PART_DATA_LIMITS_INIT { }
+
struct message_part_param {
const char *name;
const char *value;
/* Update envelope data based from given header field */
void message_part_envelope_parse_from_header(pool_t pool,
struct message_part_envelope **_data,
+ struct message_part_data_limits *limits,
struct message_header_line *hdr);
/* Parse a single header. Note that this modifies part->context. */
void message_part_data_parse_from_header(pool_t pool,
struct message_part *part,
+ struct message_part_data_limits *limits,
struct message_header_line *hdr);
#endif
parser = message_parser_init(pool, istream, &parser_set);
decoder = message_decoder_init(NULL, 0);
+ struct message_part_data_limits limits = MESSAGE_PART_DATA_LIMITS_INIT;
while ((ret = message_parser_parse_next_block(parser, &input)) > 0) {
- message_part_data_parse_from_header(pool, input.part, input.hdr);
+ message_part_data_parse_from_header(pool, input.part, &limits,
+ input.hdr);
if (message_decoder_decode_next_block(decoder, &input, &output) &&
output.hdr == NULL && output.size > 0)
str_append_data(str_out, output.data, output.size);
parser = message_parser_init(pool, istream, &parser_set);
decoder = message_decoder_init(NULL, 0);
+ struct message_part_data_limits limits = MESSAGE_PART_DATA_LIMITS_INIT;
while ((ret = message_parser_parse_next_block(parser, &input)) > 0) {
- message_part_data_parse_from_header(pool, input.part, input.hdr);
+ message_part_data_parse_from_header(pool, input.part, &limits,
+ input.hdr);
if (input.hdr != NULL &&
strcasecmp(input.hdr->name, "content-transfer-encoding") == 0) {
enum message_cte cte = message_decoder_parse_cte(input.hdr);
parser = message_parser_init(pool, istream, &parser_set);
decoder = message_decoder_init(NULL, 0);
+ struct message_part_data_limits limits = MESSAGE_PART_DATA_LIMITS_INIT;
while ((ret = message_parser_parse_next_block(parser, &input)) > 0) {
- message_part_data_parse_from_header(pool, input.part, input.hdr);
+ message_part_data_parse_from_header(pool, input.part, &limits,
+ input.hdr);
if (message_decoder_decode_next_block(decoder, &input, &output) &&
output.hdr == NULL && output.size > 0)
str_append_data(str_out, output.data, output.size);
parser = message_parser_init(pool, istream, &parser_set);
decoder = message_decoder_init(NULL, 0);
+ struct message_part_data_limits limits = MESSAGE_PART_DATA_LIMITS_INIT;
while ((ret = message_parser_parse_next_block(parser, &input)) > 0) {
- message_part_data_parse_from_header(pool, input.part, input.hdr);
+ message_part_data_parse_from_header(pool, input.part, &limits,
+ input.hdr);
if (message_decoder_decode_next_block(decoder, &input, &output) &&
output.hdr == NULL && output.size > 0)
str_append_data(str_out, output.data, output.size);
struct message_parser_ctx *parser;
struct message_block block;
+ struct message_part_data_limits limits = MESSAGE_PART_DATA_LIMITS_INIT;
i_zero(&block);
parser = message_parser_init(pool, input, set);
while ((ret = message_parser_parse_next_block(parser, &block)) > 0)
if (parse_data)
message_part_data_parse_from_header(pool, block.part,
- block.hdr);
+ &limits, block.hdr);
message_parser_deinit(&parser, parts_r);
test_assert(input->stream_errno == 0);
return ret;
struct message_parser_ctx *parser;
struct message_block block;
+ struct message_part_data_limits limits = MESSAGE_PART_DATA_LIMITS_INIT;
i_zero(&block);
parser = message_parser_init(pool, input, set);
while ((ret = message_parser_parse_next_block(parser, &block)) > 0)
if (parse_data)
message_part_data_parse_from_header(pool, block.part,
- block.hdr);
+ &limits, block.hdr);
message_parser_deinit(&parser, parts_r);
test_assert(input->stream_errno == 0);
return ret;
if (data->save_bodystructure_header &&
!data->parsed_bodystructure_header) {
i_assert(part != NULL);
- message_part_data_parse_from_header(mail->mail.data_pool, part, hdr);
+ message_part_data_parse_from_header(mail->mail.data_pool, part,
+ &mail->data.part_data_limits,
+ hdr);
}
if (data->save_envelope) {
message_part_envelope_parse_from_header(mail->mail.data_pool,
- &data->envelope_data, hdr);
+ &data->envelope_data,
+ &mail->data.part_data_limits, hdr);
if (hdr == NULL)
index_mail_parse_finish_imap_envelope(mail);
struct index_mail *mail)
{
message_part_envelope_parse_from_header(mail->mail.data_pool,
- &mail->data.envelope_data, hdr);
+ &mail->data.envelope_data,
+ &mail->data.part_data_limits, hdr);
if (hdr == NULL)
index_mail_parse_finish_imap_envelope(mail);
&order, sizeof(order));
}
+struct parse_bodystructure_ctx {
+ pool_t pool;
+ struct message_part_data_limits *limits;
+};
+
static void parse_bodystructure_part_header(struct message_part *part,
struct message_header_line *hdr,
- pool_t pool)
+ struct parse_bodystructure_ctx *ctx)
{
- message_part_data_parse_from_header(pool, part, hdr);
+ message_part_data_parse_from_header(ctx->pool, part, ctx->limits, hdr);
}
static bool want_plain_bodystructure_cached(struct index_mail *mail)
/* bodystructure header is parsed, we want the body's mime
headers too */
i_assert(data->parsed_bodystructure_header);
+ struct parse_bodystructure_ctx bsctx = {
+ .pool = mail->mail.data_pool,
+ .limits = &mail->data.part_data_limits,
+ };
message_parser_parse_body(data->parser_ctx,
parse_bodystructure_part_header,
- mail->mail.data_pool);
+ &bsctx);
} else {
message_parser_parse_body(data->parser_ctx,
*null_message_part_header_callback, NULL);
data->received_date = (time_t)-1;
data->sent_date.time = (uint32_t)-1;
data->dont_cache_field_idx = UINT_MAX;
+ data->part_data_limits = (struct message_part_data_limits)
+ MESSAGE_PART_DATA_LIMITS_INIT;
data->wanted_fields = mail->mail.wanted_fields;
if (mail->mail.wanted_headers != NULL) {
mail->data.header_parsed = TRUE;
} else {
message_part_data_parse_from_header(mail->mail.data_pool,
- block.part, block.hdr);
+ block.part,
+ &mail->data.part_data_limits,
+ block.hdr);
}
}
}
#define INDEX_MAIL_H
#include "message-size.h"
+#include "message-part-data.h"
#include "mail-cache.h"
#include "mail-storage-private.h"
const char *envelope, *body, *bodystructure, *guid, *filename;
const char *from_envelope, *body_snippet;
struct message_part_envelope *envelope_data;
+ struct message_part_data_limits part_data_limits;
uint32_t cache_flags;
uint64_t modseq, pvt_modseq;