# HG changeset patch # User Timo Sirainen # Date 1358143307 -7200 # Node ID 19403b3926f938cbbc417566c0aac6a7789f59d6 # Parent 20a545f932e3724821763db9e6ecf2b5cbb6d4ae Several fixes to handling "istream input line too long" conditions. diff -r 20a545f932e3 -r 19403b3926f9 src/auth/db-passwd-file.c --- a/src/auth/db-passwd-file.c Mon Jan 14 07:57:39 2013 +0200 +++ b/src/auth/db-passwd-file.c Mon Jan 14 08:01:47 2013 +0200 @@ -197,7 +197,7 @@ hash_table_create(&pw->users, pw->pool, 0, str_hash, strcmp); start_time = time(NULL); - input = i_stream_create_fd(pw->fd, 4096, FALSE); + input = i_stream_create_fd(pw->fd, (size_t)-1, FALSE); i_stream_set_return_partial_line(input, TRUE); while ((line = i_stream_read_next_line(input)) != NULL) { if (*line == '\0' || *line == ':' || *line == '#') diff -r 20a545f932e3 -r 19403b3926f9 src/doveadm/dsync/doveadm-dsync.c --- a/src/doveadm/dsync/doveadm-dsync.c Mon Jan 14 07:57:39 2013 +0200 +++ b/src/doveadm/dsync/doveadm-dsync.c Mon Jan 14 08:01:47 2013 +0200 @@ -61,13 +61,25 @@ static void remote_error_input(struct dsync_cmd_context *ctx) { + const unsigned char *data; + size_t size; const char *line; - while ((line = i_stream_read_next_line(ctx->err_stream)) != NULL) - fprintf(stderr, "%s\n", line); - - if (ctx->err_stream->eof && ctx->io_err != NULL) - io_remove(&ctx->io_err); + switch (i_stream_read(ctx->err_stream)) { + case -2: + data = i_stream_get_data(ctx->err_stream, &size); + fprintf(stderr, "%.*s", (int)size, data); + i_stream_skip(ctx->err_stream, size); + break; + case -1: + if (ctx->io_err != NULL) + io_remove(&ctx->io_err); + break; + default: + while ((line = i_stream_next_line(ctx->err_stream)) != NULL) + fprintf(stderr, "%s\n", line); + break; + } } static void diff -r 20a545f932e3 -r 19403b3926f9 src/doveadm/server-connection.c --- a/src/doveadm/server-connection.c Mon Jan 14 07:57:39 2013 +0200 +++ b/src/doveadm/server-connection.c Mon Jan 14 08:01:47 2013 +0200 @@ -224,7 +224,7 @@ } } - if (i_stream_read(conn->input) == -1) { + if (i_stream_read(conn->input) < 0) { /* disconnected */ server_connection_destroy(&conn); return; diff -r 20a545f932e3 -r 19403b3926f9 src/lib-lda/lmtp-client.c --- a/src/lib-lda/lmtp-client.c Mon Jan 14 07:57:39 2013 +0200 +++ b/src/lib-lda/lmtp-client.c Mon Jan 14 08:01:47 2013 +0200 @@ -540,7 +540,10 @@ str_truncate(client->input_multiline, 0); } - if (client->input->stream_errno != 0) { + if (client->input->stream_errno == ENOBUFS) { + lmtp_client_fail(client, + "501 5.5.4 Command reply line too long"); + } else if (client->input->stream_errno != 0) { errno = client->input->stream_errno; i_error("lmtp client: read() failed: %m"); lmtp_client_fail(client, ERRSTR_TEMP_REMOTE_FAILURE diff -r 20a545f932e3 -r 19403b3926f9 src/plugins/acl/acl-backend-vfile.c --- a/src/plugins/acl/acl-backend-vfile.c Mon Jan 14 07:57:39 2013 +0200 +++ b/src/plugins/acl/acl-backend-vfile.c Mon Jan 14 08:01:47 2013 +0200 @@ -505,7 +505,7 @@ if (aclobj->aclobj.backend->debug) i_debug("acl vfile: reading file %s", path); - input = i_stream_create_fd(fd, 4096, FALSE); + input = i_stream_create_fd(fd, (size_t)-1, FALSE); i_stream_set_return_partial_line(input, TRUE); linenum = 1; while ((line = i_stream_read_next_line(input)) != NULL) { diff -r 20a545f932e3 -r 19403b3926f9 src/plugins/fts/fts-indexer.c --- a/src/plugins/fts/fts-indexer.c Mon Jan 14 07:57:39 2013 +0200 +++ b/src/plugins/fts/fts-indexer.c Mon Jan 14 08:01:47 2013 +0200 @@ -191,7 +191,11 @@ return 1; } } - if (ctx->input->eof || ctx->input->stream_errno != 0) { + if (ctx->input->stream_errno != 0) { + i_error("indexer read() failed: %m"); + return -1; + } + if (ctx->input->eof) { i_error("indexer disconnected unexpectedly"); return -1; } diff -r 20a545f932e3 -r 19403b3926f9 src/plugins/fts/fts-parser-script.c --- a/src/plugins/fts/fts-parser-script.c Mon Jan 14 07:57:39 2013 +0200 +++ b/src/plugins/fts/fts-parser-script.c Mon Jan 14 08:01:47 2013 +0200 @@ -70,7 +70,7 @@ struct istream *input; struct content *content; bool eof_seen = FALSE; - int fd; + int fd, ret = 0; fd = script_connect(user, &path); if (fd == -1) @@ -99,14 +99,17 @@ content->content_type = args[0]; content->extensions = (const void *)(args+1); } - if (!eof_seen) { + if (input->stream_errno != 0) { + i_error("parser script read() failed: %m"); + ret = -1; + } else if (!eof_seen) { if (input->v_offset == 0) i_error("parser script didn't send any data"); else i_error("parser script didn't send empty EOF line"); } i_stream_destroy(&input); - return 0; + return ret; } static bool script_support_content(struct mail_user *user,