]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lmtp: Don't lose first 128k of data with >128k mails.
authorTimo Sirainen <tss@iki.fi>
Tue, 15 Dec 2009 18:44:15 +0000 (13:44 -0500)
committerTimo Sirainen <tss@iki.fi>
Tue, 15 Dec 2009 18:44:15 +0000 (13:44 -0500)
--HG--
branch : HEAD

src/lmtp/commands.c

index a700929b4911aa5e28f51c98f922a2b8a1359b5a..eb1f6ce9ae90cd22e71bf51919609d8aee9764df 100644 (file)
@@ -694,12 +694,14 @@ static bool client_input_data_write(struct client *client)
 static int client_input_add_file(struct client *client,
                                 const unsigned char *data, size_t size)
 {
+       struct client_state *state = &client->state;
        string_t *path;
+       ssize_t ret;
        int fd;
 
-       if (client->state.mail_data_output != NULL) {
+       if (state->mail_data_output != NULL) {
                /* continue writing to file */
-               if (o_stream_send(client->state.mail_data_output,
+               if (o_stream_send(state->mail_data_output,
                                  data, size) != (ssize_t)size)
                        return -1;
                return 0;
@@ -721,9 +723,14 @@ static int client_input_add_file(struct client *client,
                return -1;
        }
 
-       client->state.mail_data_fd = fd;
-       client->state.mail_data_output = o_stream_create_fd_file(fd, 0, FALSE);
-       o_stream_cork(client->state.mail_data_output);
+       state->mail_data_fd = fd;
+       state->mail_data_output = o_stream_create_fd_file(fd, 0, FALSE);
+       o_stream_cork(state->mail_data_output);
+
+       ret = o_stream_send(state->mail_data_output,
+                           state->mail_data->data, state->mail_data->used);
+       if (ret != (ssize_t)state->mail_data->used)
+               return -1;
        if (o_stream_send(client->state.mail_data_output,
                          data, size) != (ssize_t)size)
                return -1;
@@ -734,7 +741,8 @@ static int
 client_input_add(struct client *client, const unsigned char *data, size_t size)
 {
        if (client->state.mail_data->used + size <=
-           CLIENT_MAIL_DATA_MAX_INMEMORY_SIZE) {
+           CLIENT_MAIL_DATA_MAX_INMEMORY_SIZE &&
+           client->state.mail_data_output == NULL) {
                buffer_append(client->state.mail_data, data, size);
                return 0;
        } else {