From: Timo Sirainen Date: Thu, 12 Aug 2010 17:47:01 +0000 (+0100) Subject: dbox: Don't allow unlimited buffer size when reading message body. X-Git-Tag: 2.0.rc6~3 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c853a862402035236200982bab5d6d25fce5162f;p=thirdparty%2Fdovecot%2Fcore.git dbox: Don't allow unlimited buffer size when reading message body. --- diff --git a/src/lib-storage/index/dbox-common/dbox-file.c b/src/lib-storage/index/dbox-common/dbox-file.c index dc5525d443..65a7fbc475 100644 --- a/src/lib-storage/index/dbox-common/dbox-file.c +++ b/src/lib-storage/index/dbox-common/dbox-file.c @@ -210,7 +210,7 @@ static int dbox_file_open_full(struct dbox_file *file, bool try_altpath, } } - file->input = i_stream_create_fd(file->fd, 0, FALSE); + file->input = i_stream_create_fd(file->fd, DBOX_READ_BLOCK_SIZE, FALSE); i_stream_set_name(file->input, file->cur_path); i_stream_set_init_buffer_size(file->input, DBOX_READ_BLOCK_SIZE); return dbox_file_read_header(file); @@ -405,6 +405,7 @@ static int dbox_file_seek_next_at_metadata(struct dbox_file *file, uoff_t *offset) { const char *line; + size_t buf_size; int ret; i_stream_seek(file->input, *offset); @@ -412,12 +413,15 @@ dbox_file_seek_next_at_metadata(struct dbox_file *file, uoff_t *offset) return ret; /* skip over the actual metadata */ + buf_size = i_stream_get_max_buffer_size(file->input); + i_stream_set_max_buffer_size(file->input, 0); while ((line = i_stream_read_next_line(file->input)) != NULL) { if (*line == DBOX_METADATA_OLDV1_SPACE || *line == '\0') { /* end of metadata */ break; } } + i_stream_set_max_buffer_size(file->input, buf_size); *offset = file->input->v_offset; return 1; } @@ -626,6 +630,7 @@ static int dbox_file_metadata_read_at(struct dbox_file *file, uoff_t metadata_offset) { const char *line; + size_t buf_size; int ret; if (file->metadata_pool != NULL) @@ -641,6 +646,8 @@ dbox_file_metadata_read_at(struct dbox_file *file, uoff_t metadata_offset) return ret; ret = 0; + buf_size = i_stream_get_max_buffer_size(file->input); + i_stream_set_max_buffer_size(file->input, 0); while ((line = i_stream_read_next_line(file->input)) != NULL) { if (*line == DBOX_METADATA_OLDV1_SPACE || *line == '\0') { /* end of metadata */ @@ -650,6 +657,7 @@ dbox_file_metadata_read_at(struct dbox_file *file, uoff_t metadata_offset) line = p_strdup(file->metadata_pool, line); array_append(&file->metadata, &line, 1); } + i_stream_set_max_buffer_size(file->input, buf_size); if (ret == 0) dbox_file_set_corrupted(file, "missing end-of-metadata line"); return ret; diff --git a/src/lib-storage/index/dbox-common/dbox-mail.c b/src/lib-storage/index/dbox-common/dbox-mail.c index 7ce2a7badf..23a1d1f23f 100644 --- a/src/lib-storage/index/dbox-common/dbox-mail.c +++ b/src/lib-storage/index/dbox-common/dbox-mail.c @@ -239,6 +239,7 @@ int dbox_mail_get_stream(struct mail *_mail, struct message_size *hdr_size, return -1; } data->stream = input; + index_mail_set_read_buffer_size(_mail, input); } return index_mail_init_stream(&mail->imail, hdr_size, body_size,