MessageData Bug (only in special case)
sappenin Aug 17, 2006 5:57 PMHey All,
I found this bug, and am looking for some guidance on how to fix it.
If I draft a message in webmail, and send it to myself, then try to "get" the message via POP3, no POP3 messages are downloaded, and the server throws a NullPointerException as follows, breaking pop3 until I remove the "bad" message from my inbox:
17:46:48,328 ERROR [STDERR] java.lang.NullPointerException 17:46:48,328 ERROR [STDERR] at org.jboss.mail.mailbox.MessageData.getBoundary(MessageData.java:345) 17:46:48,328 ERROR [STDERR] at org.jboss.mail.pop3.handlers.CmdRETR.writeMessage(CmdRETR.java:124) 17:46:48,328 ERROR [STDERR] at org.jboss.mail.pop3.handlers.CmdRETR.org$jboss$mail$pop3$handlers$CmdRETR$handleRequest$aop(CmdRETR.java:92) 17:46:48,328 ERROR [STDERR] at org.jboss.mail.pop3.handlers.CmdRETR$handleRequest_6157744562547821338.invokeNext(CmdRETR$handleRequest_6157744562547821338.java) 17:46:48,328 ERROR [STDERR] at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:79) 17:46:48,328 ERROR [STDERR] at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:197) 17:46:48,328 ERROR [STDERR] at org.jboss.mail.pop3.handlers.CmdRETR$handleRequest_6157744562547821338.invokeNext(CmdRETR$handleRequest_6157744562547821338.java) 17:46:48,328 ERROR [STDERR] at org.jboss.mail.pop3.handlers.CmdRETR.handleRequest(CmdRETR.java) 17:46:48,328 ERROR [STDERR] at org.jboss.mail.pop3.POP3ProtocolInstance.handleRequest(POP3ProtocolInstance.java:211) 17:46:48,328 ERROR [STDERR] at org.jboss.mail.ConnectionHandler.runSocket(ConnectionHandler.java:205) 17:46:48,328 ERROR [STDERR] at org.jboss.mail.ConnectionHandler.run(ConnectionHandler.java:97) 17:46:48,328 ERROR [STDERR] at EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(PooledExecutor.java:743) 17:46:48,328 ERROR [STDERR] at java.lang.Thread.run(Thread.java:595)
I've tracked this code down to the getBoundary() function of the MessageData class, here:
String[] header = getHeader("Content-Type").split("\\r\\n");
If I inspect the headers of a "JBCS webmail" created message, there isn't a "Content-type" header, which is why (I'm guessing) a null pointer is thrown. The fix here may just be to check for a null string after calling getHeader("Content-Type").
However, I'm not quite sure if this is the right thing. Why does the boundary pivot around the "content-type" header? Does the SMTP spec mandate that everything after this header must be the body? Is content-type guaranteed to be last? I'll write a fix for this, but I'm not quite sure what it's supposed to be doing. I can see that CMDRetry.java line 124 is apparently using this a a boundary between message bodies (?).
Thanks!
David