Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 5 Jul 2007 08:13:09 GMT
From:      Floris Bos <info@je-eigen-domein.nl>
To:        freebsd-gnats-submit@FreeBSD.org
Subject:   kern/114325: SIOCGIFADDR ioctl behaves incorrectly inside jail
Message-ID:  <200707050813.l658D9c2038942@www.freebsd.org>
Resent-Message-ID: <200707050820.l658K34j052546@freefall.freebsd.org>

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

>Number:         114325
>Category:       kern
>Synopsis:       SIOCGIFADDR ioctl behaves incorrectly inside jail
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Thu Jul 05 08:20:03 GMT 2007
>Closed-Date:
>Last-Modified:
>Originator:     Floris Bos
>Release:        FreeBSD 6.2-STABLE-200702
>Organization:
>Environment:
FreeBSD cheetah.to-the-max.net 6.2-STABLE-200702 FreeBSD 6.2-STABLE-200702 #0: Sat Mar 10 01:09:58 CET 2007     max@cheetah.to-the-max.net:/usr/obj/usr/src/sys/MAX  amd64

>Description:
Inside a jail: When using the SIOCGIFADDR ioctl to retrieve the IP-address of a network device it returns the main IP-address of the parent host instead of the jail's IP-address.


Inside a jail with IP-address 83.149.75.179:

# ifconfig
nve0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        inet 83.149.75.179 netmask 0xffffffff broadcast 83.149.75.179
        ether 00:e0:81:5f:b5:ad
        media: Ethernet autoselect (100baseTX <full-duplex>)
        status: active
bge0: flags=8802<BROADCAST,SIMPLEX,MULTICAST> mtu 1500
        options=1b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING>
        ether 00:e0:81:5f:b5:ac
        media: Ethernet autoselect (none)
        status: no carrier
plip0: flags=108810<POINTOPOINT,SIMPLEX,MULTICAST,NEEDSGIANT> mtu 1500
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
# ./ipaddr
According to SIOCGIFADDR Device nve0 has IP-address: 83.149.75.182
>How-To-Repeat:
- Use a server with multiple IP-addresses.
- Create a jail using one of the IP-addresses other than the main address.
- Compile and execute the following program inside the jail (change the ETHERNET_DEVICE to the name of the network device):

ipaddr.c:
==

#include <string.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <net/if.h>	

// The ethernet device to retrieve the IP of
#define ETHERNET_DEVICE  "nve0"

int main(int argc, char **argv)
{
	int sock;
	struct ifreq ifr;
	struct sockaddr_in *ifaddr;
	
	sock = socket(AF_INET, SOCK_DGRAM, 0);
	memset(&ifr, 0, sizeof(struct ifreq));
	strncpy(ifr.ifr_name, ETHERNET_DEVICE, IF_NAMESIZE);
	if (ioctl(sock, SIOCGIFADDR, &ifr) == -1)
	{
		perror("Error retrieving IP address");
	}
	else
	{
	  ifaddr = (struct sockaddr_in *)&ifr.ifr_addr;
	  printf("According to SIOCGIFADDR Device %s has IP-address: %s\n", ETHERNET_DEVICE, inet_ntoa(ifaddr->sin_addr));
	}
	 
	return 0;
}

==

Expected behavior: it should return the IP-address of the jail.
Actual behavior: it returns the main IP-address of the parent environment.

>Fix:


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



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