amd64/158369: ioctl SIOCGIFCONF in chroot bug?
Paul Procacci
pprocacci at gmail.com
Tue Jun 28 03:30:17 UTC 2011
>Number: 158369
>Category: amd64
>Synopsis: ioctl SIOCGIFCONF in chroot bug?
>Confidential: no
>Severity: critical
>Priority: low
>Responsible: freebsd-amd64
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Tue Jun 28 03:30:16 UTC 2011
>Closed-Date:
>Last-Modified:
>Originator: Paul Procacci
>Release: 8.2-STABLE
>Organization:
>Environment:
FreeBSD work_machine.myhome 8.2-STABLE FreeBSD 8.2-STABLE #1: Mon Jun 27 18:51:19 CDT 2011 root at work_machine.myhome:/usr/obj/usr/src/sys/WORK_MACHINE amd64
>Description:
chroot'd applications within a i386 environment (amd64 host) that utilize:
################################
ioctl(fd, SIOCGIFCONF, ifc);
################################
...aren't working properly. It's seems the ifc_len member of the ifconf structure never gets updated.
Utilizing fresh installs of both amd64 and i386 everything seems to work fine. However when running this with a chroot'd i386 install on a amd64 host, it fails miserably.
This came up with trying to get wine working with a game. Here is a reference to the related wine bug that I filed:
http://bugs.winehq.org/show_bug.cgi?id=27614
Thoughts?
>How-To-Repeat:
1) Install FreeBSD (I choose to install 8.2-STABLE)
2) Install an i386 chroot:
cd /usr/src && make buildworld installworld distribution TARGET=i386 DESTDIR=/compat/i386
3) Compile the following program once in the 64bit env, and again in the chroot'd 32bit env.
################################
#include <stdarg.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/param.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
int main(void)
{
struct ifconf *ifc;
struct ifconf difc;
int lastlen, cnt = 0;
int ioctlRet = 0;
int guessedNumAddresses = 0, numAddresses = 0;
int fd;
fd = socket(PF_INET, SOCK_DGRAM, 0);
ifc=&difc;
ifc->ifc_len = 0;
ifc->ifc_buf = NULL;
if (fd != -1)
{
do {
ifc->ifc_buf = NULL;
printf("%i ::",cnt);
cnt++;
lastlen = ifc->ifc_len;
if (guessedNumAddresses == 0)
guessedNumAddresses = 4;
else
guessedNumAddresses *= 2;
ifc->ifc_len = sizeof(struct ifreq) * guessedNumAddresses;
ifc->ifc_buf = malloc(ifc->ifc_len);
ioctlRet = ioctl(fd, SIOCGIFCONF, ifc);
printf(" %i %i %i %s\n",ioctlRet,ifc->ifc_len,lastlen,ifc->ifc_buf);
} while ((ioctlRet == 0) && (ifc->ifc_len != lastlen));
}
}
################################
>Fix:
Unknown
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-amd64
mailing list