[Dovecot] deliver tries to compile already compiled sieve script
Hello,
I'm trying to setup dovecot with sieve support in a way where all sieve scripts are precompiled. All sieve scripts are in /var/cache/sieve/.
I believe I discovered a bug here. I describe below how to reproduce it.
Dovecot and the user that deliver runs as do not have write permission in /var/cache/sieve/.
h01:/var/cache/sieve# ls -la total 16 drwxr-xr-x 2 ecp ecp 4096 Mar 31 21:32 . drwxr-xr-x 10 root root 4096 Mar 31 20:14 .. -rw-r--r-- 1 ecp ecp 88 Mar 31 21:32 mailtest1@domain.com.sieve -rw-r--r-- 1 ecp ecp 132 Mar 31 21:32 mailtest1@domain.com.sievec
When deliver runs it logs this error:
open(/var/cache/sieve/mailtest1@domain.com.sievec.tmp) failed: Permission denied
This indicates deliver tries to compile the script, even though the compiled version already is there.
To verify I tested another case. I make the compiled script immutable and I did a chmod 777 on /var/cache/sieve/. Then deliver logs this error:
rename(/var/cache/sieve/mailtest1@domain.com.sievec.tmp, /var/cache/sieve/mailtest1@domain.com.sievec) failed: Operation not permitted
And deliver created the file mailtest1@domain.com.sievec.tmp.
Some relevant pieces of my dovecot.conf:
protocol lda { mail_plugins = quota cmusieve ... }
plugin { sieve = /var/cache/sieve/%u.sieve }
Anyone can help me? Is this an error on my end, or really a bug?
Alexander
I should have mentioned I'm running dovecot 1.1.rc3
Alexander
Alexander Prinsier wrote:
Hello,
I'm trying to setup dovecot with sieve support in a way where all sieve scripts are precompiled. All sieve scripts are in /var/cache/sieve/.
I believe I discovered a bug here. I describe below how to reproduce it.
Dovecot and the user that deliver runs as do not have write permission in /var/cache/sieve/.
h01:/var/cache/sieve# ls -la total 16 drwxr-xr-x 2 ecp ecp 4096 Mar 31 21:32 . drwxr-xr-x 10 root root 4096 Mar 31 20:14 .. -rw-r--r-- 1 ecp ecp 88 Mar 31 21:32 mailtest1@domain.com.sieve -rw-r--r-- 1 ecp ecp 132 Mar 31 21:32 mailtest1@domain.com.sievec
When deliver runs it logs this error:
open(/var/cache/sieve/mailtest1@domain.com.sievec.tmp) failed: Permission denied
This indicates deliver tries to compile the script, even though the compiled version already is there.
To verify I tested another case. I make the compiled script immutable and I did a chmod 777 on /var/cache/sieve/. Then deliver logs this error:
rename(/var/cache/sieve/mailtest1@domain.com.sievec.tmp, /var/cache/sieve/mailtest1@domain.com.sievec) failed: Operation not permitted
And deliver created the file mailtest1@domain.com.sievec.tmp.
Some relevant pieces of my dovecot.conf:
protocol lda { mail_plugins = quota cmusieve ... }
plugin { sieve = /var/cache/sieve/%u.sieve }
Anyone can help me? Is this an error on my end, or really a bug?
Alexander
Hello, I've solved it. The compiled sieve script had the same mtime as the uncompiled script. Dovecot used "<" to see if compilation is needed. It has to be "<=". If you wonder why the mtime is the same, I write and compile the sieve script right after each other automated. Apparently mtime doesn't have a good resolution in time... Patch to dovecot-sieve-1.1.4 is attached, can it be included? Thanks, Alexander Alexander Prinsier wrote:
I should have mentioned I'm running dovecot 1.1.rc3
Alexander
Alexander Prinsier wrote:
Hello,
I'm trying to setup dovecot with sieve support in a way where all sieve scripts are precompiled. All sieve scripts are in /var/cache/sieve/.
I believe I discovered a bug here. I describe below how to reproduce it.
Dovecot and the user that deliver runs as do not have write permission in /var/cache/sieve/.
h01:/var/cache/sieve# ls -la total 16 drwxr-xr-x 2 ecp ecp 4096 Mar 31 21:32 . drwxr-xr-x 10 root root 4096 Mar 31 20:14 .. -rw-r--r-- 1 ecp ecp 88 Mar 31 21:32 mailtest1@domain.com.sieve -rw-r--r-- 1 ecp ecp 132 Mar 31 21:32 mailtest1@domain.com.sievec
When deliver runs it logs this error:
open(/var/cache/sieve/mailtest1@domain.com.sievec.tmp) failed: Permission denied
This indicates deliver tries to compile the script, even though the compiled version already is there.
To verify I tested another case. I make the compiled script immutable and I did a chmod 777 on /var/cache/sieve/. Then deliver logs this error:
rename(/var/cache/sieve/mailtest1@domain.com.sievec.tmp, /var/cache/sieve/mailtest1@domain.com.sievec) failed: Operation not permitted
And deliver created the file mailtest1@domain.com.sievec.tmp.
Some relevant pieces of my dovecot.conf:
protocol lda { mail_plugins = quota cmusieve ... }
plugin { sieve = /var/cache/sieve/%u.sieve }
Anyone can help me? Is this an error on my end, or really a bug?
Alexander
--- dovecot-sieve-1.1.4.orig/src/sieve-cmu.c 2008-02-16 19:24:51.000000000 +0100 +++ dovecot-sieve-1.1.4/src/sieve-cmu.c 2008-04-01 11:30:24.000000000 +0200 @@ -869,7 +869,7 @@ dovecot_sieve_compile(script_data_t *sda return -1; } } else { - if (st.st_mtime < st2.st_mtime) + if (st.st_mtime <= st2.st_mtime) return 1; }
On Tue, 2008-04-01 at 11:50 +0200, Alexander Prinsier wrote:
Hello,
I've solved it. The compiled sieve script had the same mtime as the uncompiled script. Dovecot used "<" to see if compilation is needed. It has to be "<=".
If you wonder why the mtime is the same, I write and compile the sieve script right after each other automated. Apparently mtime doesn't have a good resolution in time...
Patch to dovecot-sieve-1.1.4 is attached, can it be included?
Committed.
participants (2)
-
Alexander Prinsier
-
Timo Sirainen