diff --git a/CHANGES b/CHANGES index dee7787..ac466e7 100644 --- a/CHANGES +++ b/CHANGES @@ -15,6 +15,8 @@ conversion issues - Fix variable initialization so mailformed mails missing body From do not cause a traceback (LP: #1844161) + - Catch more ascii encoding errors to improve resilience against bad data + (LP: #1844189) 1.1.0 2019-04-12 - Add SubDomains option to enable signing for sub-domains (LP: #1811535) diff --git a/dkimpy_milter/__init__.py b/dkimpy_milter/__init__.py index 3f15f8c..796fcb6 100644 --- a/dkimpy_milter/__init__.py +++ b/dkimpy_milter/__init__.py @@ -149,7 +149,11 @@ class dkimMilter(Milter.Base): elif lname == 'authentication-results': self.arheaders.append(val) if self.fp: - self.fp.write(b"%s: %s\n" % (codecs.encode(name, 'ascii'), codecs.encode(val, 'ascii'))) + try: + self.fp.write(b"%s: %s\n" % (codecs.encode(name, 'ascii'), codecs.encode(val, 'ascii'))) + except: + # Don't choke on header fields with non-ascii garbage in them. + pass return Milter.CONTINUE @Milter.noreply @@ -305,8 +309,13 @@ class dkimMilter(Milter.Base): self.header_i = codecs.decode(d.signature_fields.get(b'i'), 'ascii') except TypeError as x: self.header_i = None - self.header_d = codecs.decode(d.signature_fields.get(b'd'), 'ascii') - self.header_a = codecs.decode(d.signature_fields.get(b'a'), 'ascii') + try: + self.header_d = codecs.decode(d.signature_fields.get(b'd'), 'ascii') + self.header_a = codecs.decode(d.signature_fields.get(b'a'), 'ascii') + except Exception as x: + self.dkim_comment = str(x) + if milterconfig.get('Syslog'): + syslog.syslog("check_dkim: {0}".format(x)) if res: if (milterconfig.get('Syslog') and (milterconfig.get('SyslogSuccess') or @@ -326,7 +335,12 @@ class dkimMilter(Milter.Base): syslog.syslog('DKIM: Fail (saved as {0})' .format(fname)) else: - syslog.syslog('DKIM: Fail ({0})'.format(d.domain.lower())) + if milterconfig.get('Syslog'): + if d.domain: + syslog.syslog('DKIM: Fail ({0})' + .format(d.domain.lower())) + else: + syslog.syslog('DKIM: Fail, unextractable domain' if res: result = 'pass' else: