Strange LMTP crash

Ben Carter bhc at pitt.edu
Tue Jul 14 13:51:17 EDT 2009


Michael Bacon wrote:
> Hi, all,
> 
> I'm working through a bizarre segfault from lmtpd that occurs following a 
> rcpt to: command.  The best I can describe what's going on is that somehow 
> the NULL value stored in the authstate pointer is getting changed to 
> 0x1010101 when passed to the verify_user function.  Here's a relevant GDB 
> snippet:
> 
> #5  0x00025950 in process_recipient (addr=0x172fbf "", namespace=0x162610,
>     ignorequota=0, verify_user=0x21310 <verify_user>, msg=0x179c08)
>     at /opt/local/src/cyrus-imapd-2.3.14/imap/lmtpengine.c:901
> 901     in /opt/local/src/cyrus-imapd-2.3.14/imap/lmtpengine.c
> (gdb) print msg->authstate
> $7 = (struct auth_state *) 0x0
> (gdb) print *msg
> $8 = {data = 0x0, f = 0x0, id = 0x0, size = 0,
>   return_path = 0x172f58 "<michael at snowplow.org>", rcpt = 0x172188,
>   rcpt_num = 0, authuser = 0x0, authstate = 0x0, rock = 0x0,
>   hdrcache = 0x17dda0}
> (gdb) down
> #4  0x0002163c in verify_user (user=0x16f950 "baconm", domain=0x0,
>     mailbox=0x0, quotacheck=0, authstate=0x1010101)
>     at /opt/local/src/cyrus-imapd-2.3.14/imap/lmtpd.c:1037
> 
> 
> So process_recipient is calling verify_user with the correct value from 
> msg->authstate (0x0, although this is odd, since by this point I should be 
> authenticated, but whatever...).  Once the process enters verify_user, 
> however, gdb shows that value as 0x1010101.
> 
> At some point down the line, the code checks to see if there's a value in 
> the pointer, and because there is, it proceeds to try to dereference 
> 0x1010101 (in strcmp), resulting in the SEGV.
> 
> I'm still looking, but has anyone seen anything like this before?
> 
> -Michael
> 
> Backtrace below:
> 
> 
> 
> #0  0xfec31b60 in strcmp () from /lib/libc.so.1
> #1  0x000a1a94 in mymemberof (auth_state=0x1010101,
>     identifier=0x172ff8 "baconm")
>     at /opt/local/src/cyrus-imapd-2.3.14/lib/auth_unix.c:84
> #2  0x000a18d0 in auth_memberof (auth_state=0x1010101,
>     identifier=0x172ff8 "baconm")
>     at /opt/local/src/cyrus-imapd-2.3.14/lib/auth.c:94
> #3  0x000a1110 in cyrus_acl_myrights (auth_state=0x1010101,
>     acl=0x172ff8 "baconm")
>     at /opt/local/src/cyrus-imapd-2.3.14/lib/acl_afs.c:91
> #4  0x0002163c in verify_user (user=0x16f950 "baconm", domain=0x0,
>     mailbox=0x0, quotacheck=0, authstate=0x1010101)
>     at /opt/local/src/cyrus-imapd-2.3.14/imap/lmtpd.c:1037
> #5  0x00025950 in process_recipient (addr=0x172fbf "", namespace=0x162610,
>     ignorequota=0, verify_user=0x21310 <verify_user>, msg=0x179c08)
>     at /opt/local/src/cyrus-imapd-2.3.14/imap/lmtpengine.c:901
> #6  0x0002801c in lmtpmode (func=0x158024, pin=0x179a38, pout=0x179ab0, 
> fd=0)
>     at /opt/local/src/cyrus-imapd-2.3.14/imap/lmtpengine.c:1534
> #7  0x0001ec3c in service_main (argc=1, argv=0x16f618, envp=0xffbffcd4)
>     at /opt/local/src/cyrus-imapd-2.3.14/imap/lmtpd.c:299
> #8  0x0001e610 in main (argc=1, argv=0xffbffccc, envp=0xffbffcd4)
>     at /opt/local/src/cyrus-imapd-2.3.14/master/service.c:540
> 
> ----
> Cyrus Home Page: http://cyrusimap.web.cmu.edu/
> Cyrus Wiki/FAQ: http://cyrusimap.web.cmu.edu/twiki
> List Archives/Info: http://asg.web.cmu.edu/cyrus/mailing-list.html

I already found this.  The quota that is passed to verify_user() by 
process_recipient() has to be a quota_t, not an int.  A patch was 
already submitted.

Ben

-- 
Ben Carter
University of Pittsburgh/CSSD
bhc at pitt.edu
412-624-6470


More information about the Info-cyrus mailing list