[PATCH] Accept messages with no body and no trailing \n after headers

[email protected] ("Robin H. Johnson")
Newsgroups perl.qpsmtpd
Message-ID <[email protected]>
I'm reopening this thread as I independently ran into it today, and I still
don't see it in the Git repo. 

I've attached a simpler patch than the previous version as well, it's
had a few hours of testing only.

A user tried to subscribe to a mailing list I run, and pinged me after 2 days
because his sub request hadn't gone through.

It was being handled incorrectly by qpsmtpd, such that $transaction->header was
undef.

The user's MTA was an up to date Ubuntu LTS Postfix, and his MUA is Thunderbird
10.

==
< DATA
> 354 go ahead
< Received: from mail.EXAMPLE.COM (localhost [127.0.0.1])
<         by mail.EXAMPLE.COM (Postfix) with ESMTP id 8CE3D40B93
<         for <[email protected]>; Thu, 23 Feb 2012 05:15:33 +0000 (UTC)
< DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=EXAMPLE.COM;
<         s=mail; t=1329974133;
<         bh=frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN/XKdLCPjaYaY=;
<         h=Message-ID:Date:From:MIME-Version:To:Content-Type:
<          Content-Transfer-Encoding;
<         b=WJi1NKkoafASk0xmEx9trfC0+EnTFQoLGKKaw/+iWYRwNuTFG62rhyOqaMXie/Jy3
<          zK7LZsg2FQFEhE0Gmx/+8UScndrUQUz+lBdEUw9uIPYqcrS06gCmnteu+oqCn+n5rB
<          s4SZfgDxYAPDtuvlrsxoNEnOqCf68jKHPnJamSoQ=
< Received: from [10.10.30.124] (unknown [AA.BB.CC.DD])
<         by mail.EXAMPLE.COM (Postfix) with ESMTPSA
<         for <[email protected]>; Thu, 23 Feb 2012 05:15:29 +0000 (UTC)
< Message-ID: <[email protected]>
< Date: Wed, 22 Feb 2012 21:17:16 -0800
< From: USER <[email protected]>
< User-Agent: Mozilla/5.0 (X11; Linux i686; rv:10.0.1) Gecko/20120208 Thunderbird/10.0.1
< MIME-Version: 1.0
< To: [email protected]
< Content-Type: text/plain; charset=ISO-8859-1; format=flowed
< Content-Transfer-Encoding: 7bit
< .
> 451 Queuing declined or disabled; try again later
===

In my logs, fun stuff like this:
FATAL PLUGIN ERROR [spamassassin]:  Can't call method "as_string" on an undefined value at /usr/share/qpsmtpd/plugins/spamassassin line 154, <STDIN> line 9.
FATAL PLUGIN ERROR [queue::qmail_2dqueue]:  Can't call method "print" on an undefined value at /usr/share/qpsmtpd/plugins/queue/qmail-queue line 59, <STDIN> line 9.

-- 
Robin Hugh Johnson
Gentoo Linux: Developer, Trustee & Infrastructure Lead
E-Mail     : [email protected]
GnuPG FP   : 11ACBA4F 4778E3F6 E4EDF38E B27B944E 34884E85
qpsmtpd-0.83-accept-empty-email.patch (text/plain, 1.6 KB)
Accept messages with no body.

If a message has no body, there is nothing in the RFC spec that says it
needs to have a trailing \n for a blank line after the headers.

Thumderbird 10 generates some emails like this, which will always cause
plugin errors when $transaction->header is accessed otherwise, as there
is almost no checking that $transaction->header is defined before usage.

Signed-off-by: Robin H. Johnson <[email protected]>
Thanks-To: Jack Bates <[email protected]>

--- qpsmtpd-0.83.orig/lib/Qpsmtpd/SMTP.pm	2009-04-03 06:24:21.000000000 +0000
+++ qpsmtpd-0.83/lib/Qpsmtpd/SMTP.pm	2012-02-25 05:52:14.000000000 +0000
@@ -632,7 +632,7 @@
 
   my $timeout = $self->config('timeout');
   while (defined($_ = $self->getline($timeout))) {
-    $complete++, last if $_ eq ".\r\n";
+    $complete++, $_ = '' if $_ eq ".\r\n";
     $i++;
 
     # should probably use \012 and \015 in these checks instead of \r and \n ...
@@ -648,7 +648,7 @@
     unless (($max_size and $size > $max_size)) {
       s/\r\n$/\n/;
       s/^\.\./\./;
-      if ($in_header and m/^$/) {
+      if ($in_header and (m/^$/ or $complete > 0)) {
         $in_header = 0;
         my @headers = split /^/m, $buffer;
 
@@ -691,9 +691,10 @@
 
       # copy all lines into the spool file, including the headers
       # we will create a new header later before sending onwards
-      $self->transaction->body_write($_);
+      $self->transaction->body_write($_) unless $complete;
       $size += length $_;
     }
+    last if $complete > 0;
     #$self->log(LOGDEBUG, "size is at $size\n") unless ($i % 300);
   }
signature.asc (application/pgp-signature, 330 B)
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.18 (GNU/Linux)
Comment: Robbat2 @ Orbis-Terrarum Networks - The text below is a digital signature. If it doesn't make any sense to you, ignore it.

iEYEARECAAYFAk9IevEACgkQPpIsIjIzwiyCggCeJrT2m2eHo6VEgh+5c04Mkmbs
+u4AoND/KXMUS+K0qbPNZAHtIveWlrJd
=CYfg
-----END PGP SIGNATURE-----
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.