From 0c7c388479ae20953572e9f84cf5694e4b0d34a9 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Wed, 19 Jan 2011 01:20:48 +0200 Subject: [PATCH] imapc: Fixed sending non-syncing literals. --- src/lib-storage/index/imapc/imapc-connection.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/lib-storage/index/imapc/imapc-connection.c b/src/lib-storage/index/imapc/imapc-connection.c index a723ee269a..44cae4a7b9 100644 --- a/src/lib-storage/index/imapc/imapc-connection.c +++ b/src/lib-storage/index/imapc/imapc-connection.c @@ -821,7 +821,7 @@ static void imapc_command_send_more(struct imapc_connection *conn, struct imapc_command *cmd) { const unsigned char *p; - unsigned int seek_pos, end_pos, size; + unsigned int seek_pos, start_pos, end_pos, size; i_assert(cmd->send_pos < cmd->data->used); @@ -835,11 +835,18 @@ static void imapc_command_send_more(struct imapc_connection *conn, } } - p = memchr(CONST_PTR_OFFSET(cmd->data->data, seek_pos), '\n', - cmd->data->used - seek_pos); - i_assert(p != NULL); + do { + start_pos = seek_pos; + p = memchr(CONST_PTR_OFFSET(cmd->data->data, seek_pos), '\n', + cmd->data->used - seek_pos); + i_assert(p != NULL); + + seek_pos = p - (const unsigned char *)cmd->data->data + 1; + /* keep going for LITERAL+ command */ + } while (start_pos + 3 < seek_pos && + p[-1] == '\r' && p[-2] == '}' && p[-3] == '+'); + end_pos = seek_pos; - end_pos = p - (const unsigned char *)cmd->data->data + 1; o_stream_send(conn->output, CONST_PTR_OFFSET(cmd->data->data, cmd->send_pos), end_pos - cmd->send_pos); -- 2.47.3