Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 3 Sep 2008 04:15:52 +0200 (CEST)
From:      Marcin Cieslak <saper@SYSTEM.PL>
To:        FreeBSD-gnats-submit@FreeBSD.org
Subject:   kern/127057: Unable to send UDP packet via IPv6 socket to IPv4 mapped address
Message-ID:  <200809030215.m832Fqsr024291@radziecki.saper.info>
Resent-Message-ID: <200809030230.m832U2Au067093@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         127057
>Category:       kern
>Synopsis:       Unable to send UDP packet via IPv6 socket to IPv4 mapped address
>Confidential:   no
>Severity:       critical
>Priority:       high
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Wed Sep 03 02:30:01 UTC 2008
>Closed-Date:
>Last-Modified:
>Originator:     Marcin Cieslak
>Release:        FreeBSD 7.0-STABLE amd64
>Organization:
http://saper.info
>Environment:
System: FreeBSD radziecki.saper.info 7.0-STABLE FreeBSD 7.0-STABLE #0: Wed Jul 23 05:06:20 CEST 2008 saper@radziecki.saper.info:/usr/obj/usr/bsd/build/sys/VAIO amd64


     $FreeBSD: src/sys/netinet6/dest6.c,v 1.11 2007/07/05 16:23:46 delphij Exp $
     $FreeBSD: src/sys/netinet6/frag6.c,v 1.33 2007/07/05 16:29:39 delphij Exp $
     $FreeBSD: src/sys/netinet6/icmp6.c,v 1.80 2007/07/05 16:29:39 delphij Exp $
     $FreeBSD: src/sys/netinet6/icmp6.h,v 1.6 2000/07/04 16:35:09 itojun Exp $
     $FreeBSD: src/sys/netinet6/in6.c,v 1.73.2.1 2008/03/09 19:01:50 bz Exp $
     $FreeBSD: src/sys/netinet6/in6.h,v 1.51 2007/07/19 09:16:40 bz Exp $
     $FreeBSD: src/sys/netinet6/in6_cksum.c,v 1.16 2007/07/05 16:23:47 delphij Exp $
     $FreeBSD: src/sys/netinet6/in6_gif.c,v 1.29 2007/07/05 16:29:39 delphij Exp $
     $FreeBSD: src/sys/netinet6/in6_gif.h,v 1.7 2005/01/07 02:30:34 imp Exp $
     $FreeBSD: src/sys/netinet6/in6_ifattach.c,v 1.39 2007/07/05 16:23:47 delphij Exp $
     $FreeBSD: src/sys/netinet6/in6_ifattach.h,v 1.7 2005/10/21 16:23:00 suz Exp $
     $FreeBSD: src/sys/netinet6/in6_pcb.c,v 1.84.2.2 2008/04/27 14:39:32 rwatson Exp $
     $FreeBSD: src/sys/netinet6/in6_pcb.h,v 1.19 2007/05/11 10:20:50 rwatson Exp $
     $FreeBSD: src/sys/netinet6/in6_proto.c,v 1.46 2007/07/05 16:29:39 delphij Exp $
     $FreeBSD: src/sys/netinet6/in6_rmx.c,v 1.18 2007/07/05 16:29:39 delphij Exp $
     $FreeBSD: src/sys/netinet6/in6_src.c,v 1.46.2.1 2008/03/08 23:45:39 bz Exp $
     $FreeBSD: src/sys/netinet6/in6_var.h,v 1.31 2007/06/02 08:02:36 jinmei Exp $
     $FreeBSD: src/sys/netinet6/ip6.h,v 1.5 2000/07/04 16:35:09 itojun Exp $
     $FreeBSD: src/sys/netinet6/ip6_ecn.h,v 1.6 2005/01/07 02:30:34 imp Exp $
     $FreeBSD: src/sys/netinet6/ip6_forward.c,v 1.40 2007/07/05 16:29:40 delphij Exp $
     $FreeBSD: src/sys/netinet6/ip6_id.c,v 1.8 2007/07/05 16:23:47 delphij Exp $
     $FreeBSD: src/sys/netinet6/ip6_input.c,v 1.95 2007/07/05 16:29:40 delphij Exp $
     $FreeBSD: src/sys/netinet6/ip6_ipsec.c,v 1.6.2.2 2008/03/21 23:08:36 bz Exp $
     $FreeBSD: src/sys/netinet6/ip6_ipsec.h,v 1.2.2.1 2008/03/21 23:03:32 bz Exp $
     $FreeBSD: src/sys/netinet6/ip6_mroute.c,v 1.46 2007/07/05 16:29:40 delphij Exp $
     $FreeBSD: src/sys/netinet6/ip6_mroute.h,v 1.12 2007/07/05 16:29:40 delphij Exp $
     $FreeBSD: src/sys/netinet6/ip6_output.c,v 1.109.2.6 2008/03/21 23:22:06 bz Exp $
     $FreeBSD: src/sys/netinet6/ip6_var.h,v 1.39.2.1 2008/03/09 19:01:50 bz Exp $
     $FreeBSD: src/sys/netinet6/ip6protosw.h,v 1.13 2005/01/07 02:30:34 imp Exp $
     $FreeBSD: src/sys/netinet6/mld6.c,v 1.31 2007/07/05 16:29:40 delphij Exp $
     $FreeBSD: src/sys/netinet6/mld6_var.h,v 1.7 2005/10/21 16:23:00 suz Exp $
     $FreeBSD: src/sys/netinet6/nd6.c,v 1.83.2.1 2007/10/30 18:03:50 jhb Exp $
     $FreeBSD: src/sys/netinet6/nd6.h,v 1.21 2005/10/21 16:23:00 suz Exp $
     $FreeBSD: src/sys/netinet6/nd6_nbr.c,v 1.47 2007/07/05 16:29:40 delphij Exp $
     $FreeBSD: src/sys/netinet6/nd6_rtr.c,v 1.36 2007/07/05 16:29:40 delphij Exp $
     $FreeBSD: src/sys/netinet6/pim6.h,v 1.3 2005/01/07 02:30:35 imp Exp $
     $FreeBSD: src/sys/netinet6/pim6_var.h,v 1.5 2005/08/10 07:10:02 obrien Exp $
     $FreeBSD: src/sys/netinet6/raw_ip6.c,v 1.73.2.1 2008/03/09 19:01:50 bz Exp $
     $FreeBSD: src/sys/netinet6/raw_ip6.h,v 1.2 2005/01/07 02:30:35 imp Exp $
     $FreeBSD: src/sys/netinet6/route6.c,v 1.14 2007/07/05 16:23:48 delphij Exp $
     $FreeBSD: src/sys/netinet6/scope6.c,v 1.17 2007/07/05 16:23:48 delphij Exp $
     $FreeBSD: src/sys/netinet6/scope6_var.h,v 1.5 2005/07/25 12:31:42 ume Exp $
     $FreeBSD: src/sys/netinet6/sctp6_usrreq.c,v 1.41.2.1 2008/04/29 09:26:32 rrs Exp $
     $FreeBSD: src/sys/netinet6/sctp6_var.h,v 1.8 2007/09/13 10:36:43 rrs Exp $
     $FreeBSD: src/sys/netinet6/tcp6_var.h,v 1.7 2005/01/07 02:30:35 imp Exp $
     $FreeBSD: src/sys/netinet6/tcp6_var.h,v 1.7 2005/01/07 02:30:35 imp Exp $
     $FreeBSD: src/sys/netinet6/udp6_usrreq.c,v 1.81.2.1 2008/03/09 19:01:50 bz Exp $
     $FreeBSD: src/sys/netinet6/udp6_var.h,v 1.9 2007/07/23 07:58:58 rwatson Exp $


net.inet6.ip6.forwarding: 0
net.inet6.ip6.redirect: 1
net.inet6.ip6.hlim: 64
net.inet6.ip6.maxfragpackets: 6400
net.inet6.ip6.accept_rtadv: 0
net.inet6.ip6.keepfaith: 0
net.inet6.ip6.log_interval: 5
net.inet6.ip6.hdrnestlimit: 15
net.inet6.ip6.dad_count: 1
net.inet6.ip6.auto_flowlabel: 1
net.inet6.ip6.defmcasthlim: 1
net.inet6.ip6.gifhlim: 30
net.inet6.ip6.kame_version: FreeBSD
net.inet6.ip6.use_deprecated: 1
net.inet6.ip6.rr_prune: 5
net.inet6.ip6.v6only: 0
net.inet6.ip6.rtexpire: 3600
net.inet6.ip6.rtminexpire: 10
net.inet6.ip6.rtmaxcache: 128
net.inet6.ip6.use_tempaddr: 0
net.inet6.ip6.temppltime: 86400
net.inet6.ip6.tempvltime: 604800
net.inet6.ip6.auto_linklocal: 1
net.inet6.ip6.prefer_tempaddr: 0
net.inet6.ip6.use_defaultzone: 0
net.inet6.ip6.maxfrags: 6400
net.inet6.ip6.mcast_pmtu: 0
net.inet6.ip6.fw.enable: 1
net.inet6.ip6.fw.deny_unknown_exthdrs: 1
net.inet6.ipsec6.def_policy: 1
net.inet6.ipsec6.esp_trans_deflev: 1
net.inet6.ipsec6.esp_net_deflev: 1
net.inet6.ipsec6.ah_trans_deflev: 1
net.inet6.ipsec6.ah_net_deflev: 1
net.inet6.ipsec6.ecn: 0
net.inet6.ipsec6.debug: 0
net.inet6.ipsec6.esp_randpad: -1
net.inet6.icmp6.rediraccept: 1
net.inet6.icmp6.redirtimeout: 600
net.inet6.icmp6.nd6_prune: 1
net.inet6.icmp6.nd6_delay: 5
net.inet6.icmp6.nd6_umaxtries: 3
net.inet6.icmp6.nd6_mmaxtries: 3
net.inet6.icmp6.nd6_useloopback: 1
net.inet6.icmp6.nodeinfo: 3
net.inet6.icmp6.errppslimit: 100
net.inet6.icmp6.nd6_maxnudhint: 0
net.inet6.icmp6.nd6_debug: 0
net.inet6.icmp6.nd6_maxqueuelen: 1

>Description:

Calling bind() with an unspecified IPv6 address followed by connect() to an IPv4
mapped address causes EINVAL in sendto()

Same also on an i386 machine.

I think this problem is also concerning TCP.

This affects mostly Java programs, since Java sends IPv4 packets (by default)
via the IPv6 socket.

>How-To-Repeat:

A simple C program:


/**
 * Sending UDP datagram from :: -> 2001:db8::1 (OK)
 * Sending UDP datagram from :: -> ::ffff:192.168.101.23 (fails, EINVAL)
 */

#include <sys/socket.h>
#include <sys/types.h>
#include <stdio.h>
#include <netinet/in.h>
/*
 * $40 = {him4 = {sin_len = 0 '\0', sin_family = 28 '\034', sin_port = 0, sin_addr = {s_addr = 0}, sin_zero = "\000\000\000\000\000\000\000"}, him6 = {
 *     sin6_len = 0 '\0', sin6_family = 28 '\034', sin6_port = 0, sin6_flowinfo = 0, sin6_addr = {__u6_addr = {__u6_addr8 = '\0' <repeats 15 times>,
 *         __u6_addr16 = {0, 0, 0, 0, 0, 0, 0, 0}, __u6_addr32 = {0, 0, 0, 0}}}, sin6_scope_id = 0}}
 */

static u_char bindaddr[] = { 
 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 0x00, 0x00, 0x00, 0x00 };

/*
 * $42 = {him4 = {sin_len = 0 '\0', sin_family = 28 '\034', sin_port = 13568, sin_addr = {s_addr = 0}, sin_zero = "\000\000\000\000\000\000\000"}, him6 = {
 *     sin6_len = 0 '\0', sin6_family = 28 '\034', sin6_port = 13568, sin6_flowinfo = 0, sin6_addr = {__u6_addr = {
 *         __u6_addr8 = "\000\000\000\000\000\000\000\000\000\000���e\027", __u6_addr16 = {0, 0, 0, 0, 0, 65535, 43200, 5989}, __u6_addr32 = {0, 0,
 *           4294901760, 392538304}}}, sin6_scope_id = 0}}
 */

static u_char connectaddr4[] =  {
 0x1c, 0x1c, 0x00, 0x35, 0x00, 0x00, 0x00, 0x00,
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 0x00, 0x00, 0xff, 0xff, 0xc0, 0xa8, 0x65, 0x17,
 0x00, 0x00, 0x00, 0x00 };

/* [2001:db8::1] */

static u_char connectaddr6[] =  {
 0x1c, 0x1c, 0x00, 0x35, 0x00, 0x00, 0x00, 0x00,
 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00,
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
 0x00, 0x00, 0x00, 0x00 };

/* IN SRV query _xmpp-server._tcp.google.com */

static u_char dns_packet[] = {
 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00,
 0x00, 0x00, 0x00, 0x00, 0x0c, 0x5f, 0x78, 0x6d,
 0x70, 0x70, 0x2d, 0x73, 0x65, 0x72, 0x76, 0x65,
 0x72, 0x04, 0x5f, 0x74, 0x63, 0x70, 0x06, 0x67,
 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x03, 0x63, 0x6f,
 0x6d, 0x00, 0x00, 0x21, 0x00, 0x01 };

void process_socket(struct sockaddr *bind_to, 
	struct sockaddr *connect_to)
{
	int fd = socket(PF_INET6, SOCK_DGRAM, 17);
	int optval, optlen, rc;

	optlen = sizeof(optval);

	bind(fd, bind_to, 28); 
	if (connect(fd, connect_to, 28) < 0)
		perror("connect");

	if (getsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &optval, 
		&optlen) == -1)
             err(1, "getsockopt");
	printf("IPV6_V6ONLY = %d\n", optval);

	if ((rc = sendto(fd, dns_packet, 46, 0, NULL, 0)) < 0)
		perror("sendto");
	else
		printf("Success, wrote %d bytes\n", rc);
	close(fd);
}

int main() {

	printf("Trying to send to 2001:db8::1\n");
	process_socket( (struct sockaddr *) &bindaddr, 
			(struct sockaddr *) &connectaddr6);
	printf("Trying to send to 192.168.101.23\n");
	process_socket( (struct sockaddr *) &bindaddr, 
			(struct sockaddr *) &connectaddr4);
}

Output:

Trying to send to 2001:db8::1
IPV6_V6ONLY = 0
Success, wrote 46 bytes
Trying to send to 192.168.101.23
IPV6_V6ONLY = 0
sendto: Invalid argument

>Fix:

>Release-Note:
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200809030215.m832Fqsr024291>