> On 07 Apr 2016, at 14:47, Michiel van Es <m...@pragmasec.nl> wrote:
> 
> 
>> On 07 Apr 2016, at 14:40, Joerg Jung <m...@umaxx.net> wrote:
>> 
>> 
>>> On 07 Apr 2016, at 13:13, Michiel van Es <m...@pragmasec.nl> wrote:
>>>> On 07 Apr 2016, at 12:59, Joerg Jung <m...@umaxx.net> wrote:
>>>> 
>>>> Ok... that makes sense now.
>>>> -2 seems to be EAI_NONAME which seems to be the error code specific on 
>>>> Ubuntu libc for NXDOMAIN replies, instead of EAI_NODATA.
>>>> 
>>>> These error codes and related RFCs are subject to a lot of discussions.
>>>> See here to get an idea: 
>>>> https://sourceware.org/bugzilla/show_bug.cgi?id=15726
>>>> Especially, note the cross references to Ubuntu bugs ...
>>>> 
>>>> Instead of trying to fit all distribution specific changes,
>>>> the easiest might be to change the logic here and check for the returned 
>>>> address not being empty -- instead of errno.
>>>> 
>>>> I'll try to come up with a proper diff to fix this, but give me some time 
>>>> as 
>>>> I'm very busy currently.
>>>> 
>>>> As quick fix: you can just change the if statement to:
>>>> if (ar->ar_gai_errno != EAI_NODATA && ar->ar_gai_errno != EAI_NONAME) {
>>> 
>>> like this? =>
>> 
>> yes.
>> 
>>> dnsbl_event_dispatch(struct asr_result *ar, void *arg)
>>> {
>>>      uint64_t *q = arg;
>>> 
>>>      if (ar->ar_addrinfo)
>>>              freeaddrinfo(ar->ar_addrinfo);
>>>      log_warnx("warn: DEBUG: ar_gai_errno=%d, EAI_NODATA=%d", 
>>> ar->ar_gai_errno, EAI_NODATA);
>>>      if (ar->ar_gai_errno != EAI_NODATA && ar->ar_gai_errno != EAI_NONAME) {
>>>              log_warnx("warn: session %016"PRIx64": event_dispatch: REJECT 
>>> address ar_gai_errno=%d", *q, ar->ar_gai_errno);
>>>              filter_api_reject_code(*q, FILTER_CLOSE, 554, "5.7.1 Address 
>>> in DNSBL");
>>>      } else
>>>              filter_api_accept(*q);
>>>      free(q);
>>> }
>>> 
>>>> ... and it should start working as expected. Can you confirm that, please?
>>> 
>>> if above is correct, it did not work:
>>> 
>>> dnsbl[26098]: warn: DEBUG: ar_gai_errno=-5, EAI_NODATA=-2
>>> dnsbl[26098]: warn: session de57c06bd67994d3: event_dispatch: REJECT 
>>> address ar_gai_errno=-5
>>> filter: imsg IMSG_FILTER_RESPONSE from procfilter 
>>> dnsbl[hooks=0xffffffff,flags=0x0000]
>>> filter: filter_drain_query de57c06c3dc0ecca[QUERY_CONNECT=178.21.114.197 
>>> <-> 
>>> 185.14.168.222(pro-mail-smtp-001.bol.com),filter_session@0x1588030[datalen=0,eom=(nil),ofile=(nil)]]
>>> filter: filter_end_query de57c06c3dc0ecca[QUERY_CONNECT=178.21.114.197 <-> 
>>> 185.14.168.222(pro-mail-smtp-001.bol.com),filter_session@0x1588030[datalen=0,eom=(nil),ofile=(nil)]]
>>> filter: query de57c06c3dc0ecca done: status=FILTER_CLOSE code=554 
>>> response="5.7.1 Address in DNSBL"
>>> smtp-in: Failed command on session de57c06bd67994d3: "" => 554 5.7.1 
>>> Address in DNSBL
>>> smtp-in: Closing session de57c06bd67994d3
>>> debug: smtp: 0x1655cf0: deleting session: done
>>> filter: post-event event=EVENT_DISCONNECT filter=dnsbl
>>> ^Cinfo: queue handler exiting
>>> info: scheduler handler exiting
>>> info: ca agent exiting
>>> warn: control -> queue: pipe closed
>>> warn: lka -> queue: pipe closed
>>> strace: Process 26091 detached
>>> 
>> 
>> Ok can change the added DEBUG line right before the if statement once again 
>> to:
>> 
>> log_warnx("warn: DEBUG: ar_gai_errno=%d, EAI_NODATA=%d, EAI_NONAME=%d, 
>> gai_strerror=‘%s'", ar->ar_gai_errno, EAI_NODATA, EAI_NONAME, 
>> gai_strerror(ar->ar_gai_errno));
>> 
>> … and show me output?
> 
> debug: smtp: new client on listener: 0x1a90130
> smtp-in: New session 1dc609e7cb3551c5 from host pro-mail-smtp-001.bol.com 
> [185.14.168.222]
> filter: post-event event=EVENT_CONNECT filter=dnsbl
> filter: new query QUERY_CONNECT
> filter: filter_drain_query 1dc609e878b913e8[QUERY_CONNECT=178.21.114.197 <-> 
> 185.14.168.222(pro-mail-smtp-001.bol.com),filter_session@0x1a7f030[datalen=0,eom=(nil),ofile=(nil)]]
> filter: running filter filter:dnsbl[hooks=0xffffffff,flags=0x0000] for query 
> 1dc609e878b913e8[QUERY_CONNECT=178.21.114.197 <-> 
> 185.14.168.222(pro-mail-smtp-001.bol.com),filter_session@0x1a7f030[datalen=0,eom=(nil),ofile=(nil)]]
> filter: waiting for running query 
> 1dc609e878b913e8[QUERY_CONNECT=178.21.114.197 <-> 
> 185.14.168.222(pro-mail-smtp-001.bol.com),filter_session@0x1a7f030[datalen=0,eom=(nil),ofile=(nil)]]
> dnsbl[27129]: debug: on_connect: checking 222.168.14.185.psbl.surriel.com.
> 
> dnsbl[27129]: warn: DEBUG: ar_gai_errno=-5, EAI_NODATA=-2, EAI_NONAME=-2, 
> gai_strerror=‘No address associated with hostname'
> dnsbl[27129]: warn: session 1dc609e7cb3551c5: event_dispatch: REJECT address 
> ar_gai_errno=-5
> filter: imsg IMSG_FILTER_RESPONSE from procfilter 
> dnsbl[hooks=0xffffffff,flags=0x0000]
> filter: filter_drain_query 1dc609e878b913e8[QUERY_CONNECT=178.21.114.197 <-> 
> 185.14.168.222(pro-mail-smtp-001.bol.com),filter_session@0x1a7f030[datalen=0,eom=(nil),ofile=(nil)]]
> filter: filter_end_query 1dc609e878b913e8[QUERY_CONNECT=178.21.114.197 <-> 
> 185.14.168.222(pro-mail-smtp-001.bol.com),filter_session@0x1a7f030[datalen=0,eom=(nil),ofile=(nil)]]
> filter: query 1dc609e878b913e8 done: status=FILTER_CLOSE code=554 
> response="5.7.1 Address in DNSBL"
> smtp-in: Failed command on session 1dc609e7cb3551c5: "" => 554 5.7.1 Address 
> in DNSBL
> smtp-in: Closing session 1dc609e7cb3551c5
> debug: smtp: 0x1b4ccf0: deleting session: done
> filter: post-event event=EVENT_DISCONNECT filter=dnsbl

Wow… what a mess, I think this is what is happening:

- EAI_NODATA is usually -5 aka "No address associated with hostname".

- Ubuntu eglibc seems to guard EAI_NODATA behind a #ifdef _GNU_SOURCE in 
netdb.h, 
  so you may do not have it defined at all.
(- Nevertheless the error string is given with gai_strerror() anyway, no matter 
that EAI_NODATA is not there.)

- in case EAI_NODATA is not defined opensmtpd-extras defines EAI_NODATA == 
EAI_NONAME == -2 in configure.ac
-> I think this is wrong and should be done as last resort. The better solution 
should be to define _GNU_SOURCE to
receive EAI_NODATA from standard netdb.h. Can you try the following please:

Add the following CFLAGS line to filter-dnsbl Makefile.am line 10: 
https://github.com/OpenSMTPD/OpenSMTPD-extras/blob/master/extras/wip/filters/filter-dnsbl/Makefile.am

CFLAGS  += -D_GNU_SOURCE

Rebuild everything — it’s important to clear the whole configure cache and 
re-run sh bootstrap fully, so that this _GNU_SOURCE ends up in the Makefile.

Let me know if this helps and fixes the issue.

However as written earlier, all this is just quick-fix. Better solution would 
be IMHO to NOT rely on gai errno at all.
I’ll try to come up with a better fix soon.
 



 
--
You received this mail because you are subscribed to misc@opensmtpd.org
To unsubscribe, send a mail to: misc+unsubscr...@opensmtpd.org

Reply via email to