* net/ipv4: commit d0733d2e29b breaks rtorrent @ 2011-06-22 12:40 Fabienne Ducroquet 2011-06-22 12:47 ` Marcus Meissner 0 siblings, 1 reply; 7+ messages in thread From: Fabienne Ducroquet @ 2011-06-22 12:40 UTC (permalink / raw) To: Marcus Meissner; +Cc: sundell.software, Reinhard Max, David S. Miller, netdev Hi, With the latest versions of the Linux kernel (I've just tried 3.0.0-rc4-00034-g2992c4b) rtorrent (version 0.8.7 with libtorrent 0.12.7, from Debian unstable) fails to start with the error message: rtorrent: Could not open/bind port for listening: Invalid argument I bisected it down to: commit d0733d2e29b652b2e7b1438ececa732e4eed98eb Author: Marcus Meissner <meissner@suse.de> Date: Wed Jun 1 21:05:22 2011 -0700 net/ipv4: Check for mistakenly passed in non-IPv4 address Check against mistakenly passing in IPv6 addresses (which would result in an INADDR_ANY bind) or similar incompatible sockaddrs. Signed-off-by: Marcus Meissner <meissner@suse.de> Cc: Reinhard Max <max@suse.de> Signed-off-by: David S. Miller <davem@davemloft.net> --- net/ipv4/af_inet.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c index cc14631..9c19260 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c @@ -465,6 +465,9 @@ int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) if (addr_len < sizeof(struct sockaddr_in)) goto out; + if (addr->sin_family != AF_INET) + goto out; + chk_addr_ret = inet_addr_type(sock_net(sk), addr->sin_addr.s_addr); /* Not specified by any standard per-se, however it breaks too With this commit reverted rtorrent works again. Fabienne ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: net/ipv4: commit d0733d2e29b breaks rtorrent 2011-06-22 12:40 net/ipv4: commit d0733d2e29b breaks rtorrent Fabienne Ducroquet @ 2011-06-22 12:47 ` Marcus Meissner 2011-06-22 13:24 ` Reinhard Max 0 siblings, 1 reply; 7+ messages in thread From: Marcus Meissner @ 2011-06-22 12:47 UTC (permalink / raw) To: Fabienne Ducroquet Cc: sundell.software, Reinhard Max, David S. Miller, netdev On Wed, Jun 22, 2011 at 02:40:45PM +0200, Fabienne Ducroquet wrote: > Hi, > > With the latest versions of the Linux kernel (I've just tried > 3.0.0-rc4-00034-g2992c4b) rtorrent (version 0.8.7 with libtorrent > 0.12.7, from Debian unstable) fails to start with the error message: > > rtorrent: Could not open/bind port for listening: Invalid argument > > I bisected it down to: > > commit d0733d2e29b652b2e7b1438ececa732e4eed98eb > Author: Marcus Meissner <meissner@suse.de> > Date: Wed Jun 1 21:05:22 2011 -0700 > > net/ipv4: Check for mistakenly passed in non-IPv4 address > > Check against mistakenly passing in IPv6 addresses (which would result > in an INADDR_ANY bind) or similar incompatible sockaddrs. > > Signed-off-by: Marcus Meissner <meissner@suse.de> > Cc: Reinhard Max <max@suse.de> > Signed-off-by: David S. Miller <davem@davemloft.net> > --- > net/ipv4/af_inet.c | 3 +++ > 1 files changed, 3 insertions(+), 0 deletions(-) > > diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c > index cc14631..9c19260 100644 > --- a/net/ipv4/af_inet.c > +++ b/net/ipv4/af_inet.c > @@ -465,6 +465,9 @@ int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) > if (addr_len < sizeof(struct sockaddr_in)) > goto out; > > + if (addr->sin_family != AF_INET) > + goto out; > + > chk_addr_ret = inet_addr_type(sock_net(sk), addr->sin_addr.s_addr); > > /* Not specified by any standard per-se, however it breaks too > > With this commit reverted rtorrent works again. Can you show us the code surrounding the bind in rtorrent? You either do not set the sin_family member, or pass in a ipv6 address. Ciao, Marcus ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: net/ipv4: commit d0733d2e29b breaks rtorrent 2011-06-22 12:47 ` Marcus Meissner @ 2011-06-22 13:24 ` Reinhard Max 2011-06-22 14:51 ` Fabienne Ducroquet 0 siblings, 1 reply; 7+ messages in thread From: Reinhard Max @ 2011-06-22 13:24 UTC (permalink / raw) To: Marcus Meissner Cc: Fabienne Ducroquet, sundell.software, David S. Miller, netdev Hi, On Wed, 22 Jun 2011 at 14:47, Marcus Meissner wrote: > Can you show us the code surrounding the bind in rtorrent? ... or short of that, the output of "strace -e socket,bind" when starting rtorrent with the kernel patch not reverted? cu Reinhard ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: net/ipv4: commit d0733d2e29b breaks rtorrent 2011-06-22 13:24 ` Reinhard Max @ 2011-06-22 14:51 ` Fabienne Ducroquet 2011-06-22 14:58 ` Reinhard Max 0 siblings, 1 reply; 7+ messages in thread From: Fabienne Ducroquet @ 2011-06-22 14:51 UTC (permalink / raw) To: Reinhard Max; +Cc: Marcus Meissner, sundell.software, David S. Miller, netdev On Wed, Jun 22, 2011 at 03:24:53PM +0200, Reinhard Max wrote: > On Wed, 22 Jun 2011 at 14:47, Marcus Meissner wrote: > > >Can you show us the code surrounding the bind in rtorrent? Since I'm not a developer of rtorrent I'm not sure what the right code to show is, so I leave that to the developer of libtorrent/rtorrent, he is CC'ed. > ... or short of that, the output of "strace -e socket,bind" when > starting rtorrent with the kernel patch not reverted? Here it is : socket(PF_INET6, SOCK_STREAM, IPPROTO_TCP) = -1 EAFNOSUPPORT (Address family not supported by protocol) socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 5 bind(5, {sa_family=AF_INET6, sin6_port=htons(6903), inet_pton(AF_INET6, "::", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = -1 EINVAL (Invalid argument) [ 95 lines with only the number in parentheses after htons changing ] bind(5, {sa_family=AF_INET6, sin6_port=htons(6999), inet_pton(AF_INET6, "::", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = -1 EINVAL (Invalid argument) socket(PF_INET6, SOCK_STREAM, IPPROTO_TCP) = -1 EAFNOSUPPORT (Address family not supported by protocol) socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 5 bind(5, {sa_family=AF_INET6, sin6_port=htons(6881), inet_pton(AF_INET6, "::", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = -1 EINVAL (Invalid argument) [ 21 lines with only the number in parentheses after htons changing ] bind(5, {sa_family=AF_INET6, sin6_port=htons(6903), inet_pton(AF_INET6, "::", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = -1 EINVAL (Invalid argument) If I understand correctly, it is trying to bind an IPv6 address to a socket expecting an IPv4 address, so it's a bug in libtorrent/rtorrent, but it was not visible before because an INADDR_ANY bind is not a problem for rtorrent? Fabienne ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: net/ipv4: commit d0733d2e29b breaks rtorrent 2011-06-22 14:51 ` Fabienne Ducroquet @ 2011-06-22 14:58 ` Reinhard Max 2011-06-22 15:53 ` Stephen Hemminger 0 siblings, 1 reply; 7+ messages in thread From: Reinhard Max @ 2011-06-22 14:58 UTC (permalink / raw) To: Fabienne Ducroquet Cc: Marcus Meissner, sundell.software, David S. Miller, netdev On Wed, 22 Jun 2011 at 16:51, Fabienne Ducroquet wrote: > If I understand correctly, it is trying to bind an IPv6 address to a > socket expecting an IPv4 address, so it's a bug in > libtorrent/rtorrent, but it was not visible before because an > INADDR_ANY bind is not a problem for rtorrent? Yes, exactly. cu Reinhard ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: net/ipv4: commit d0733d2e29b breaks rtorrent 2011-06-22 14:58 ` Reinhard Max @ 2011-06-22 15:53 ` Stephen Hemminger 2011-06-22 23:02 ` Fabienne Ducroquet 0 siblings, 1 reply; 7+ messages in thread From: Stephen Hemminger @ 2011-06-22 15:53 UTC (permalink / raw) To: Reinhard Max Cc: Fabienne Ducroquet, Marcus Meissner, sundell.software, David S. Miller, netdev On Wed, 22 Jun 2011 16:58:24 +0200 (CEST) Reinhard Max <max@suse.de> wrote: > > On Wed, 22 Jun 2011 at 16:51, Fabienne Ducroquet wrote: > > > If I understand correctly, it is trying to bind an IPv6 address to a > > socket expecting an IPv4 address, so it's a bug in > > libtorrent/rtorrent, but it was not visible before because an > > INADDR_ANY bind is not a problem for rtorrent? > > Yes, exactly. > > > cu > Reinhard You can find code here http://libtorrent.rakshasa.no/ but it is in C++ so there is an abnormally high indirection factor between reality of the bug and the code as written. Did you try contacting the developer? ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: net/ipv4: commit d0733d2e29b breaks rtorrent 2011-06-22 15:53 ` Stephen Hemminger @ 2011-06-22 23:02 ` Fabienne Ducroquet 0 siblings, 0 replies; 7+ messages in thread From: Fabienne Ducroquet @ 2011-06-22 23:02 UTC (permalink / raw) To: Stephen Hemminger Cc: Reinhard Max, Marcus Meissner, sundell.software, David S. Miller, netdev On Wed, Jun 22, 2011 at 08:53:29AM -0700, Stephen Hemminger wrote: > You can find code here http://libtorrent.rakshasa.no/ > but it is in C++ so there is an abnormally high indirection factor > between reality of the bug and the code as written. I had a look at the code, I found where bind is called, but it does not help: it is in libtorrent/src/net/socket_fd.cc: bool SocketFd::bind(const rak::socket_address& sa) { check_valid(); return !::bind(m_fd, sa.c_sockaddr(), sa.length()); } check_valid() checks the validity of the socket FD. It is called by the function: bool Listen::open(uint16_t first, uint16_t last, const rak::socket_address* bindAddress) { close(); [ Checks that the range of the ports is OK, that the address is an inet or inet6 address, that the socket can be allocated.] rak::socket_address sa; sa.copy(*bindAddress, bindAddress->length()); for (uint16_t i = first; i <= last; ++i) { sa.set_port(i); if (get_fd().bind(sa) && get_fd().listen(50)) { ... in libtorrent/src/net/listen.cc. That function was called by: bool ConnectionManager::listen_open(port_type begin, port_type end) { if (!m_listen->open(begin, end, rak::socket_address::cast_from(m_bindAddress))) return false; m_listenPort = m_listen->port(); return true; } in libtorrent/src/torrent/connection_manager.cc, and it was itself called by Manager::listen_open() in rtorrent/core/manager.cc, which throws the error message I got because the call to torrent::connection_manager()->listen_open(portFirst, portLast) fails. So the question now is to find how the m_bindAddress used in ConnectionManager::listen_open is set, but I prefer not to do that right now. > Did you try contacting the developer? I've put him in the Cc: since the first message. Fabienne ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2011-06-22 23:02 UTC | newest] Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2011-06-22 12:40 net/ipv4: commit d0733d2e29b breaks rtorrent Fabienne Ducroquet 2011-06-22 12:47 ` Marcus Meissner 2011-06-22 13:24 ` Reinhard Max 2011-06-22 14:51 ` Fabienne Ducroquet 2011-06-22 14:58 ` Reinhard Max 2011-06-22 15:53 ` Stephen Hemminger 2011-06-22 23:02 ` Fabienne Ducroquet
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.