buffer_t *hdr_buf;
int snapshot_pending_refcount;
struct message_size header_size;
+ size_t max_header_block_size;
uoff_t skip_count;
uoff_t last_lf_offset;
mstream->hdr_ctx =
message_parse_header_init(mstream->istream.parent,
NULL, 0);
+ message_parse_header_set_limit(mstream->hdr_ctx,
+ mstream->max_header_block_size);
}
/* remove skipped data from hdr_buf */
mstream->pool = pool_alloconly_create(MEMPOOL_GROWING
"header filter stream", 256);
mstream->istream.max_buffer_size = input->real_stream->max_buffer_size;
+ /* Default to no per-header block size limit. Callers that want one
+ call i_stream_header_filter_set_max_header_block_size(). */
+ mstream->max_header_block_size = SIZE_MAX;
mstream->headers = headers_count == 0 ? NULL :
p_new(mstream->pool, const char *, headers_count);
buffer_append(input->hdr_buf, data, size);
input->headers_edited = TRUE;
}
+
+void i_stream_header_filter_set_max_header_block_size(
+ struct istream *input, size_t max_header_block_size)
+{
+ struct header_filter_istream *mstream =
+ container_of(input->real_stream, struct header_filter_istream,
+ istream);
+
+ mstream->max_header_block_size = max_header_block_size;
+ if (mstream->hdr_ctx != NULL) {
+ message_parse_header_set_limit(mstream->hdr_ctx,
+ max_header_block_size);
+ }
+}
void i_stream_header_filter_add(struct header_filter_istream *input,
const void *data, size_t size);
+/* Set a per-header-block maximum size for this filter stream. Data beyond
+ this limit in any single header is dropped from the filter's output and
+ from values delivered to the filter callback. The default is SIZE_MAX
+ (unlimited). Use MESSAGE_HEADER_BLOCK_DEFAULT_MAX_SIZE from
+ message-header-parser.h for the standard cap. */
+void i_stream_header_filter_set_max_header_block_size(
+ struct istream *input, size_t max_header_block_size);
+
#endif