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;
