[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

(usagi-users 02160) Bug?: bind(6);bind(4);listen(6) used to work



Hi,

This (pseudo-) code works with vanilla Linux, and other platforms:

 - bind(IPv6 any address, port foo)
 - bind(IPv4 any address, port foo)
 - listen(IPv6 any address, port  foo)
 - listen(IPv4 any address, port foo)
         ignore failure if errno=EADDRINUSE: the IPv6 socket listens
	 for IPv4 connections

In particular, that's what the exim MTA does by default (if no
explicit bind/listen instruction given in config file)

But with USAGI patch, the first listen fails, with errno=EADDRINUSE,
while _there_ is no one listening!
Looks like you expect programs to do:

 - bind(IPv6 any address)
 - listen(IPv6 any address)
 - bind(IPv4 any address), failure because EADDRINUSE -> goto end
 - listen(IPv4 any address)
 - :end:

Anyway, failing at the first listen is IMHO a bad idea: Either fail at
the _second_ listen like vanilla Linux, or fail at the second bind.

So, where's the problem? Should exim change its way or is this an
USAGI glitch? It looks like the first case works for all other
platforms supported by exim!

If you think exim should change its way, could you please give me
arguments (RFC references, POSIX or Single Unix Specification
reference, ...) to convince the exim authors?

Details
=======

USAGI Snapshot 20/3/2003 on Linux 2.4.20 kernel
GNU libc: 2.3.1 (Debian GNU/Linux)

=============== begin Example program ==================

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>

int main(void)
{
  struct sockaddr_in6 sin6;
  struct sockaddr_in  sin4;
  int fd6, fd4;
  int result;
  int on = 1;

  sin6.sin6_family = AF_INET6;
  sin6.sin6_port = htons(9887);
  sin6.sin6_addr = in6addr_any;

  sin4.sin_family = AF_INET;
  sin4.sin_port = htons(9887);
  sin4.sin_addr.s_addr = INADDR_ANY;

  fd6 = socket(AF_INET6,SOCK_STREAM,0);
  if (fd6<0)
    fprintf(stderr,"Socket failed because %s\n",strerror(errno));
  else
    fprintf(stderr,"Socket succeeded\n");
  fd4 = socket(AF_INET,SOCK_STREAM,0);
  if (fd4<0)
    fprintf(stderr,"Socket failed because %s\n",strerror(errno));
  else
    fprintf(stderr,"Socket succeeded\n");

  if (setsockopt(fd6, SOL_SOCKET, SO_REUSEADDR, (char *)(&on), sizeof(on)) < 0)
    fprintf(stderr, "setting SO_REUSEADDR on socket failed: %s", strerror(errno));
  if (setsockopt(fd4, SOL_SOCKET, SO_REUSEADDR, (char *)(&on), sizeof(on)) < 0)
    fprintf(stderr, "setting SO_REUSEADDR on socket failed: %s", strerror(errno));
    
  result = bind(fd6, &sin6, sizeof(sin6));
  if (result)
    fprintf(stderr,"Bind failed because %s\n",strerror(errno));
  else
    fprintf(stderr,"Bind succeeded\n");
  result = bind(fd4, &sin4, sizeof(sin4));
  if (result)
    fprintf(stderr,"Bind failed because %s\n",strerror(errno));
  else
    fprintf(stderr,"Bind succeeded\n");

  result = listen(fd6, 42);
  if (result)
    fprintf(stderr,"Listen failed because %s\n",strerror(errno));
  else
    fprintf(stderr,"Listen succeeded\n");
  result = listen(fd4, 42);
  if (result)
    fprintf(stderr,"Listen failed because %s\n",strerror(errno));
  else
    fprintf(stderr,"Listen succeeded\n");

  return 0;
}

================ end Example program ===================

============= begin kernel config ===============
# Networking options
#
CONFIG_PACKET=y
CONFIG_PACKET_MMAP=y
CONFIG_NETLINK_DEV=m
CONFIG_NETFILTER=y
# CONFIG_NETFILTER_DEBUG is not set
CONFIG_FILTER=y
# CONFIG_NET_NEIGH_DEBUG is not set
CONFIG_NET_RESTRICTED_REUSE=y
CONFIG_UNIX=y
CONFIG_INET=y
CONFIG_IPSEC=y
CONFIG_IPSEC_DEBUG=y
CONFIG_IPSEC_DEBUG_DISABLE_DEFAULT=y
# CONFIG_IPCOMP is not set
CONFIG_IPSEC_TUNNEL=y
CONFIG_IP_MULTICAST=y
# CONFIG_IP_ADVANCED_ROUTER is not set
# CONFIG_IP_PNP is not set
CONFIG_NET_IPIP=m
CONFIG_NET_IPGRE=m
CONFIG_NET_IPGRE_BROADCAST=y
# CONFIG_IP_MROUTE is not set
# CONFIG_ARPD is not set
CONFIG_INET_ECN=y
CONFIG_SYN_COOKIES=y
CONFIG_IP_IPSEC=y
CONFIG_IPV4_IPSEC_TUNNEL=y

#
#   IP: Netfilter Configuration
#
CONFIG_IP_NF_CONNTRACK=m
CONFIG_IP_NF_FTP=m
CONFIG_IP_NF_IRC=m
CONFIG_IP_NF_QUEUE=y
CONFIG_IP_NF_IPTABLES=m
CONFIG_IP_NF_MATCH_LIMIT=m
CONFIG_IP_NF_MATCH_MAC=m
CONFIG_IP_NF_MATCH_PKTTYPE=m
CONFIG_IP_NF_MATCH_MARK=m
CONFIG_IP_NF_MATCH_MULTIPORT=m
CONFIG_IP_NF_MATCH_TOS=m
CONFIG_IP_NF_MATCH_ECN=m
CONFIG_IP_NF_MATCH_DSCP=m
CONFIG_IP_NF_MATCH_AH_ESP=m
CONFIG_IP_NF_MATCH_LENGTH=m
CONFIG_IP_NF_MATCH_TTL=m
CONFIG_IP_NF_MATCH_TCPMSS=m
CONFIG_IP_NF_MATCH_HELPER=m
CONFIG_IP_NF_MATCH_STATE=m
CONFIG_IP_NF_MATCH_CONNTRACK=m
CONFIG_IP_NF_MATCH_UNCLEAN=m
CONFIG_IP_NF_MATCH_OWNER=m
CONFIG_IP_NF_FILTER=m
CONFIG_IP_NF_TARGET_REJECT=m
CONFIG_IP_NF_TARGET_MIRROR=m
CONFIG_IP_NF_NAT=m
CONFIG_IP_NF_NAT_NEEDED=y
CONFIG_IP_NF_TARGET_MASQUERADE=m
CONFIG_IP_NF_TARGET_REDIRECT=m
# CONFIG_IP_NF_NAT_LOCAL is not set
CONFIG_IP_NF_NAT_SNMP_BASIC=m
CONFIG_IP_NF_NAT_IRC=m
CONFIG_IP_NF_NAT_FTP=m
CONFIG_IP_NF_MANGLE=m
CONFIG_IP_NF_TARGET_TOS=m
CONFIG_IP_NF_TARGET_ECN=m
CONFIG_IP_NF_TARGET_DSCP=m
CONFIG_IP_NF_TARGET_MARK=m
CONFIG_IP_NF_TARGET_LOG=m
CONFIG_IP_NF_TARGET_ULOG=m
CONFIG_IP_NF_TARGET_TCPMSS=m
CONFIG_IP_NF_ARPTABLES=m
CONFIG_IP_NF_ARPFILTER=m
CONFIG_IP_NF_COMPAT_IPCHAINS=m
CONFIG_IP_NF_NAT_NEEDED=y
# CONFIG_IP_NF_COMPAT_IPFWADM is not set
CONFIG_IPV6=y
CONFIG_IPV6_DEBUG=y
CONFIG_IPV6_ZONE=y
CONFIG_IPV6_ZONE_SITELOCAL=y
CONFIG_IPV6_DROP_FAKE_V4MAPPED=y
CONFIG_IPV6_RESTRICTED_DOUBLE_BIND=y
CONFIG_IPV6_6TO4_NEXTHOP=y
CONFIG_IPV6_PRIVACY=y
# CONFIG_IPV6_ANYCAST is not set
# CONFIG_IPV6_ISATAP is not set
# CONFIG_IPV6_PREFIXLIST is not set
# CONFIG_IPV6_NDISC_DEBUG is not set
# CONFIG_IPV6_ACONF_DEBUG is not set
# CONFIG_IPV6_RT6_DEBUG is not set
# CONFIG_IPV6_SUBTREES is not set
# CONFIG_IPV6_MLD6_DEBUG is not set
# CONFIG_IPV6_MLD6_ALL_DONE is not set
CONFIG_IPV6_NODEINFO=y
# CONFIG_IPV6_NODEINFO_DEBUG is not set
# CONFIG_IPV6_NODEINFO_USE_UTS_DOMAIN is not set

#
#   IPv6: Netfilter Configuration
#
CONFIG_IP6_NF_QUEUE=m
CONFIG_IP6_NF_IPTABLES=m
CONFIG_IP6_NF_MATCH_LIMIT=m
CONFIG_IP6_NF_MATCH_MAC=m
CONFIG_IP6_NF_MATCH_RT=m
CONFIG_IP6_NF_MATCH_OPTS=m
CONFIG_IP6_NF_MATCH_FRAG=m
CONFIG_IP6_NF_MATCH_MULTIPORT=m
CONFIG_IP6_NF_MATCH_OWNER=m
CONFIG_IP6_NF_MATCH_MARK=m
CONFIG_IP6_NF_MATCH_AHESP=m
CONFIG_IP6_NF_MATCH_EUI64=m
CONFIG_IP6_NF_MATCH_LENGTH=m
CONFIG_IP6_NF_MATCH_EUI64=m
CONFIG_IP6_NF_FILTER=m
CONFIG_IP6_NF_TARGET_LOG=m
CONFIG_IP6_NF_TARGET_REJECT=m
CONFIG_IP6_NF_MANGLE=m
CONFIG_IP6_NF_TARGET_MARK=m
# CONFIG_IPV6_SUBTREES is not set
CONFIG_IPV6_IPSEC=y
CONFIG_IPV6_IPSEC_TUNNEL=y
CONFIG_IPV6_IPV6_TUNNEL=m
CONFIG_IPV6_MOBILITY=m
CONFIG_IPV6_MOBILITY_MN=y
CONFIG_IPV6_MOBILITY_DEBUG=y
# CONFIG_KHTTPD is not set
# CONFIG_ATM is not set
CONFIG_VLAN_8021Q=m

#
#  
#
# CONFIG_IPX is not set
# CONFIG_ATALK is not set

#
# Appletalk devices
#
# CONFIG_DEV_APPLETALK is not set
# CONFIG_DECNET is not set
# CONFIG_BRIDGE is not set
CONFIG_X25=m
CONFIG_LAPB=m
CONFIG_LLC=y
CONFIG_NET_DIVERT=y
# CONFIG_ECONET is not set
# CONFIG_WAN_ROUTER is not set
# CONFIG_NET_FASTROUTE is not set
# CONFIG_NET_HW_FLOWCONTROL is not set

#
# QoS and/or fair queueing
#
# CONFIG_NET_SCHED is not set

#
# Network testing
#
CONFIG_NET_PKTGEN=m


============== end kernel config ================

master@linzen:~/src/exim/tries$ /sbin/lsmod 
Module                  Size  Used by    Not tainted
mousedev                4340   0 (autoclean)
input                   3648   0 (autoclean) [mousedev]
capi                   18400   0
capifs                  4036   0 [capi]
kernelcapi             30400   1 [capi]
capiutil               22912   0 [kernelcapi]
apm                    10524   1 (autoclean)
snd-seq-midi            3840   0 (autoclean) (unused)
snd-seq-oss            28736   0 (unused)
snd-seq-midi-event      3304   0 [snd-seq-midi snd-seq-oss]
snd-seq                38256   2 [snd-seq-midi snd-seq-oss snd-seq-midi-event]
snd-pcm-oss            38820   0 (unused)
snd-mixer-oss          12792   0 [snd-pcm-oss]
snd-cs46xx             65332   0
snd-ac97-codec         30564   0 [snd-cs46xx]
snd-pcm                61728   0 [snd-pcm-oss snd-cs46xx]
snd-timer              11144   0 [snd-seq snd-pcm]
gameport                1676   0 [snd-cs46xx]
snd-rawmidi            13664   0 [snd-seq-midi snd-cs46xx]
snd-seq-device          4316   0 [snd-seq-midi snd-seq-oss snd-seq snd-rawmidi]
snd                    27884   0 [snd-seq-midi snd-seq-oss snd-seq-midi-event snd-seq snd-pcm-oss snd-mixer-oss snd-cs46xx snd-ac97-codec snd-pcm snd-timer snd-rawmidi snd-seq-device]
soundcore               3908   8 [snd]
xircom_cb               7016   1
ds                      7048   2
yenta_socket           10112   2
pcmcia_core            45248   0 [ds yenta_socket]
ide-floppy             14048   0 (autoclean)
ide-tape               57264   0 (autoclean)
usb-uhci               23436   0 (unused)
rtc                     6908   1 (autoclean)


-- 
Lionel