]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
doveadm save: Fix using <file without panic
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 23 Apr 2018 12:05:06 +0000 (15:05 +0300)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Mon, 30 Jul 2018 06:18:16 +0000 (09:18 +0300)
When getting input with <file with Linux/epoll, it crashed with:

Panic: epoll_ctl(add, 0) failed: Operation not permitted (fd doesn't support epoll - instead of '<file', try 'cat file|')

src/doveadm/doveadm-mail.c

index 14b6e11a6adfb95f438dfb3a362651d01f38db3b..2fccccb3a99caf4e3a561fbff58d3102ba9255a0 100644 (file)
@@ -203,17 +203,19 @@ static void doveadm_mail_cmd_input_read(struct doveadm_mail_cmd_context *ctx)
        struct timeout *to;
 
        ioloop = io_loop_create();
-       io = io_add(ctx->cmd_input_fd, IO_READ,
-                   doveadm_mail_cmd_input_input, ctx);
-       to = timeout_add(DOVEADM_MAIL_CMD_INPUT_TIMEOUT_MSECS,
-                        doveadm_mail_cmd_input_timeout, ctx);
-       /* read the pending input from stream. */
+       /* Read the pending input from stream. Delay adding the IO in case
+          we're reading from a file. That would cause a panic with epoll. */
        io_loop_set_running(ioloop);
        doveadm_mail_cmd_input_input(ctx);
-       if (io_loop_is_running(ioloop))
+       if (io_loop_is_running(ioloop)) {
+               io = io_add(ctx->cmd_input_fd, IO_READ,
+                           doveadm_mail_cmd_input_input, ctx);
+               to = timeout_add(DOVEADM_MAIL_CMD_INPUT_TIMEOUT_MSECS,
+                                doveadm_mail_cmd_input_timeout, ctx);
                io_loop_run(ioloop);
-       io_remove(&io);
-       timeout_remove(&to);
+               io_remove(&io);
+               timeout_remove(&to);
+       }
        io_loop_destroy(&ioloop);
 
        i_assert(ctx->cmd_input->eof);