apr-bugs mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From bugzi...@apache.org
Subject [Bug 59914] New: [patch] poll/unix/kqueue.c IPv6 to IPv4 fallback does not work in serf
Date Thu, 04 Aug 2016 18:26:57 GMT
https://bz.apache.org/bugzilla/show_bug.cgi?id=59914

            Bug ID: 59914
           Summary: [patch] poll/unix/kqueue.c IPv6 to IPv4 fallback does
                    not work in serf
           Product: APR
           Version: 1.5.2
          Hardware: All
               URL: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=2114
                    30
                OS: FreeBSD
            Status: NEW
          Keywords: PatchAvailable
          Severity: normal
          Priority: P2
         Component: APR
          Assignee: bugs@apr.apache.org
          Reporter: ohauer@gmx.de
                CC: ohauer@gmx.de
  Target Milestone: ---
                CC: ohauer@gmx.de

Created attachment 34082
  --> https://bz.apache.org/bugzilla/attachment.cgi?id=34082&action=edit
patch to modify apr1 poll() emulation to match behavior expected by serf

serf depends on the poll emulation in apr returning a POLLERR event if a
non-blocking connect() attempt fails in order to trigger an IPv6 -> IPv4
fallback, or a fallback to another address for a multi-homed host.  On FreeBSD,
the poll emulation is done using kqueue, and the result returned by the poll()
emulation is POLLIN + POLLHUP.

connect(4,{ AF_INET6 [xxxx:xxxx:xxxx:xxxx::xxxx]:80 },28) ERR#36 'Operation now
in progress'
gettimeofday({ 1469515046.979614 },0x0)          = 0 (0x0)
kevent(3,{ 4,EVFILT_READ,EV_ADD,0x0,0x0,0x805491300 },1,0x0,0,0x0) = 0 (0x0)
kevent(3,{ 4,EVFILT_WRITE,EV_ADD,0x0,0x0,0x805491300 },1,0x0,0,0x0) = 0 (0x0)
kevent(3,0x0,0,{ 4,EVFILT_READ,EV_EOF,NOTE_LOWAT|0x3c,0x0,0x805491300
4,EVFILT_WRITE,EV_EOF,NOTE_LOWAT|0x3c,0x8000,0x805491300 },32,{ 0.500000000 })
= 2 (0x2)

When serf sees this, it calls read(), which then fails with ECONNREFUSED (or
whatever), which is not even a documented read() errno value.

read(4,0x80549c064,8000)                         ERR#61 'Connection refused'

What that occurs, serf closes the socket an any other addresses are not tried.

The attached patch modifies apr to return what serf expects in the case of a
non-blocking connect() failure.  Unfortunately, I did not see an easy way of
handling ETIMEDOUT since that error can either be caused by connect failing or
after the connection is established.  The poll emulation might need to
differentiate between those two cases.

This problem affects users of svn who don't have working IPv6 connectivity to
the FreeBSD svn servers.


The original request is in from FreeBSD bugzilla PR 211430
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=211430

--- Comment #1 from ohauer <ohauer@gmx.de> ---
*** Bug 59917 has been marked as a duplicate of this bug. ***

--- Comment #2 from ohauer <ohauer@gmx.de> ---
*** Bug 59916 has been marked as a duplicate of this bug. ***

--- Comment #3 from ohauer <ohauer@gmx.de> ---
*** Bug 59915 has been marked as a duplicate of this bug. ***

-- 
You are receiving this mail because:
You are the assignee for the bug.
---------------------------------------------------------------------
To unsubscribe, e-mail: bugs-unsubscribe@apr.apache.org
For additional commands, e-mail: bugs-help@apr.apache.org


Mime
View raw message