]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
dbox: Don't allow unlimited buffer size when reading message body.
authorTimo Sirainen <tss@iki.fi>
Thu, 12 Aug 2010 17:47:01 +0000 (18:47 +0100)
committerTimo Sirainen <tss@iki.fi>
Thu, 12 Aug 2010 17:47:01 +0000 (18:47 +0100)
src/lib-storage/index/dbox-common/dbox-file.c
src/lib-storage/index/dbox-common/dbox-mail.c

index dc5525d44351d48766407af23e11515afb0002b1..65a7fbc475c6a8c17fabb929c8609efaf42e799d 100644 (file)
@@ -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;
index 7ce2a7badfd0aca86fee8806599f3cb5e0b4bb7d..23a1d1f23f75e70c2f3165547356ad729a7d17d8 100644 (file)
@@ -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,