Comment 0 for bug 832480

Revision history for this message
russm (russm-launchpad) wrote :

receiving an email from a sender whose SPF records are bogus (invalid UTF8) can crash policyd-spf.

email (spam as it turns out, but whatever) from <email address hidden> whose SPF record looks like this -

daltoninsurance.com. 6457 IN TXT "v=spf1 a:\239\187\191thoroughbred.webserversystems.com -all"

causes policyd-spf to crash like so -

4 stomp policyd-spf: Traceback (most recent call last):
4 stomp policyd-spf: File "/usr/bin/policyd-spf", line 607, in <module>
4 stomp policyd-spf: instance_dict, configData, peruser)
4 stomp policyd-spf: File "/usr/bin/policyd-spf", line 469, in spfcheck
4 stomp policyd-spf: res = spf.check2(ip, sender, helo)
4 stomp policyd-spf: File "/usr/lib/python2.6/dist-packages/spf.py", line 294, in check2
4 stomp policyd-spf: res,_,exp = query(i=i, s=s, h=h, local=local, receiver=receiver).check()
4 stomp policyd-spf: File "/usr/lib/python2.6/dist-packages/spf.py", line 514, in check
4 stomp policyd-spf: rc = self.check1(spf, self.d, 0)
4 stomp policyd-spf: File "/usr/lib/python2.6/dist-packages/spf.py", line 553, in check1
4 stomp policyd-spf: return self.check0(spf, recursion)
4 stomp policyd-spf: File "/usr/lib/python2.6/dist-packages/spf.py", line 836, in check0
4 stomp policyd-spf: if self.cidrmatch(self.dns_a(arg,self.A), cidrlength):
4 stomp policyd-spf: File "/usr/lib/python2.6/dist-packages/spf.py", line 1132, in dns_a
4 stomp policyd-spf: return self.dns(domainname, A)
4 stomp policyd-spf: File "/usr/lib/python2.6/dist-packages/spf.py", line 1200, in dns
4 stomp policyd-spf: for k, v in DNSLookup(name, qtype, self.strict, self.timeout):
4 stomp policyd-spf: File "/usr/lib/python2.6/dist-packages/spf.py", line 127, in DNSLookup
4 stomp policyd-spf: resp = req.req()
4 stomp policyd-spf: File "/usr/lib/python2.6/dist-packages/DNS/Base.py", line 202, in req
4 stomp policyd-spf: m.addQuestion(qname, qtype, Class.IN)
4 stomp policyd-spf: File "/usr/lib/python2.6/dist-packages/DNS/Lib.py", line 478, in addQuestion
4 stomp policyd-spf: self.addname(qname)
4 stomp policyd-spf: File "/usr/lib/python2.6/dist-packages/DNS/Lib.py", line 125, in addname
4 stomp policyd-spf: label = label.encode(enc)
4 stomp policyd-spf: File "/usr/lib/python2.6/encodings/idna.py", line 164, in encode
4 stomp policyd-spf: result.append(ToASCII(label))
4 stomp policyd-spf: File "/usr/lib/python2.6/encodings/idna.py", line 76, in ToASCII
4 stomp policyd-spf: label = nameprep(label)
4 stomp policyd-spf: File "/usr/lib/python2.6/encodings/idna.py", line 21, in nameprep
4 stomp policyd-spf: newlabel.append(stringprep.map_table_b2(c))
4 stomp policyd-spf: File "/usr/lib/python2.6/stringprep.py", line 197, in map_table_b2
4 stomp policyd-spf: b = unicodedata.normalize("NFKC", al)
4 stomp policyd-spf: TypeError: normalize() argument 2 must be unicode, not str
4 stomp postfix/spawn: warning: command /usr/bin/python exit status 1