Re: Managesieve segfault bug. Test case and work around included
Simon Horman <[email protected]> Mon, 22 Aug 2011 09:17:25 +0900
| Newsgroups | gmane.mail.perdition.user |
|---|---|
| Message-ID | <[email protected]> |
On Tue, Jul 19, 2011 at 10:22:05PM -0700, Steven Kurylo wrote: > Hi, > > I've tried perdition_1.19~rc4-3 but I still get a segfault. I'm > running cyrus 2.4.8, and I can avoid the segfault under two scenarios: > 1) With "sasl_mech_list: LOGIN PLAIN" and "allowplaintext: no" in my > cyrus config > 2) With "sasl_mech_list: PLAIN" and "allowplaintext: yes" in my cyrus config > > In my environment, we have a client which can't do TLS, so a special > sieve daemon which allows plaintext listens on local host for it. > Originally #2 also offered LOGIN and I that's how I ran into the > segfault. > > It seems to be something in the sieve banner parsing. I've made a > python script to act as a sieve server (see attached): > ./server.py > > Then I run perdition: > perdition.managesieve -d --no_daemon --listen_port=2006 -C > --outgoing_server=127.0.0.1:2005 -f '' --pid_file /tmp/sieve.pid > > Then I telnet to 2006 and paste : > AUTHENTICATE "PLAIN" "<real auth string>" > > I either get an OK or a segfault in perdition. server.py will cycle > through the specified banners, so you can continue to telnet to try > each banner test case out. > > Let me know if you need any further information. Thanks. Hi, sorry for taking an extraordinary long time to respond to this. Using your test case I am able to reproduce the problem and I believe that it is resolved by the following change which I have pushed into the mercurial tree. If someone could verify the change that would be great. # HG changeset patch # User Simon Horman <[email protected]> # Date 1313971959 -32400 # Node ID 2b24fd4c0978098e42d23d578431fa8292336c1d # Parent 6544c58ec1445f85276f1128821b5d2ceeb64594 managesieve: Fix handling "PLAIN LOGIN" This corrects a logic bug which resulted in a segmentation fault in strcasestr() if the needle did not match the beginning of the haystack. diff -r 6544c58ec144 -r 2b24fd4c0978 perdition/str.c --- a/perdition/str.c Tue Dec 21 07:44:19 2010 +0900 +++ b/perdition/str.c Mon Aug 22 09:12:39 2011 +0900 @@ -728,7 +728,7 @@ haystack_len = strlen(haystack); needle_len = strlen(needle); - for (i = 0; haystack_len + i >= needle_len; i++) + for (i = 0; haystack_len - i >= needle_len; i++) if (!strcasecmp(haystack + i, needle)) return haystack + i; ______________________________________________ Perdition-users mailing list [email protected] http://lists.vergenet.net/listinfo/perdition-users