Could you try the diff below?
It should do exactly the same thing with less code.

martijn@

On Fri, 2020-09-18 at 08:30 -0400, Aisha Tammy wrote:
> Hi,
> 
>   Edgar (cc'ed) has kindly provided patches to fix a buffer error in 
> mailaddr.c
> for opensmtpd.
> 
> I've minimally tested it and am forwarding the patches.
> 
> Would like to be able to get them into 6.8 release as this is quite 
> problematic 
> with lots of aliases.
> 
> Thanks,
> Aisha
> 
> 
> -------- Forwarded Message --------
> Subject: Re: opensmtpd can't handle long lines in aliases table
> Date: Thu, 6 Aug 2020 19:47:33 -0500
> From: Edgar Pettijohn <[email protected]>
> To: AIsha Tammy <[email protected]>
> 
> Here are a few simple patches as discussed. These were written to apply
> against current. However, they are pretty simple and may well apply to
> others. With that in mind if you are using any filters they may not
> work. My production system is still a couple version behind and the
> current smtpd wouldn't work with some of my custom filters. So I had to
> use a fairly basic temporary config for testing. I'm also including my
> test <senders> table.
> 
> Steps involved: (untested off memory mostly, use doas as necessary)
> 
> cd /usr
> cvs -d $CVSROOT checkout src
> 
> cp *.patch /usr/src/usr.sbin/smtpd
> cd /usr/src/usr.sbin/smtpd
> 
> for file in `ls *.patch`
> do
> patch < $file
> done
> 
> make
> rcctl stop smtpd
> 
> #use the just built version at /usr/src/usr.sbin/smtpd/smtpd/smtpd
> smtpd/smtpd -d -T expand
> 
> send a test email
> 
> if all goes well run it for an appropriat amount of time and make sure
> there are not issues. If your satisfied send the patches to bugs@.
> 
> Enjoy,
> 
> Edgar
> 
> 

Index: mailaddr.c
===================================================================
RCS file: /cvs/src/usr.sbin/smtpd/mailaddr.c,v
retrieving revision 1.3
diff -u -p -r1.3 mailaddr.c
--- mailaddr.c  31 May 2018 21:06:12 -0000      1.3
+++ mailaddr.c  18 Sep 2020 12:45:46 -0000
@@ -80,12 +80,10 @@ int
 mailaddr_line(struct maddrmap *maddrmap, const char *s)
 {
        struct maddrnode        mn;
-       char                    buffer[LINE_MAX];
-       char                   *p, *subrcpt;
+       char                   *p, *subrcpt, *buffer;
        int                     ret;
 
-       memset(buffer, 0, sizeof buffer);
-       if (strlcpy(buffer, s, sizeof buffer) >= sizeof buffer)
+       if ((buffer = strdup(s)) == NULL)
                return 0;
 
        p = buffer;
@@ -98,6 +96,8 @@ mailaddr_line(struct maddrmap *maddrmap,
                log_debug("subrcpt: [%s]", subrcpt);
                maddrmap_insert(maddrmap, &mn);
        }
+
+       free(buffer);
 
        if (ret >= 0)
                return 1;

Reply via email to