Hello Stefan,
On Thu, Dec 09, 2010 at 08:31:53AM +0100, Stefan Hornburg (Racke) wrote:
> On 12/08/2010 08:47 PM, Helge Kreutzmann wrote:
>> severity 582765 important
>> thanks
>>
>> This bug now prevents me from sending e-mails not only to individuals
>> but also to maitainer groups within Debian. Hence it is important,
>> maybe a fix for Squeeze is still possible?

I'll really would like to contact Alioth, which I can't right now:
>>                            UNDELIVERABLE MAIL
>>
>> Your message to the following recipients cannot be delivered:
>>
>> <[email protected]>:
>>     lists.alioth.debian.org [217.196.43.134]:
>> >>> DATA
>> <<< 550 Broken MIME container (Long MIME Boundary)

(I already filed a bug on Alioth to relax this check, but some Debian 
Developers also have strict filters and the current behaviour violates
an RFC, this even when changed, this is at most a bandaid for a single
service).

>> (A configuration which blocks parts of the recipient space is IMHO
>> possible even grave, but policy is a bit vague about this)
>>
>
> is it possible to get a sample of an email that fails the boundary checks?

I send that to you. Did you find something out? It is definitly
something with courier, as even when delivery is done locally, the
MIM boundary is 1 character too long.

I had a look at the sources of courier. As far as I can tell, the
following two functions are in question:
static int tryboundary(afxipipestream &io, const char *boundary)
{
        int     boundary_l=strlen(boundary);
        std::string line;

        io.clear();
        io.seekg(0);
        if (io.fail())  return (-1);

        while (std::getline(io, line).good())
        {
                if (strncmp(line.c_str(), boundary, boundary_l) == 0)
                        return (1);
        }
        io.clear();
        return (0);
}

// Create MIME multipart boundary delimiter.

std::string mkboundary_msg_s(afxipipestream &io)
{
        std::string     base=mkfilename();
        unsigned i=0;
        std::string boundary;
        int     rc;

        do
        {
                std::ostringstream o;

                o << base << "." << std::setw(3) << std::setfill('0')
                  << i++;

                boundary=o.str();

        } while ((rc=tryboundary(io, boundary.c_str())) > 0);
        if (rc) return ("");
        return (boundary);
}

I cannot see a length check there, and my C++ is *very* weak, so 
I'm not sure I fully understand the code. Maybe something like the
following needs added before the final return (in pseudo code):

        if (rc) return ("");
+       if (length(boundary) > 70) { substr(1,70,boundary) }
        return (boundary);
}

What do you think? Or is there indeed a length check somewhere hidden?

Greetings

           Helge
-- 
      Dr. Helge Kreutzmann                     [email protected]
           Dipl.-Phys.                   http://www.helgefjell.de/debian.php
        64bit GNU powered                     gpg signed mail preferred
           Help keep free software "libre": http://www.ffii.de/

Attachment: signature.asc
Description: Digital signature

Reply via email to