kern/99068: [linux] Linux emulator crashed by java, when calling ioctl(fd,SIOCGIFINDEX,...)

Marcin Cieslak saper at SYSTEM.PL
Sun Sep 10 13:19:26 PDT 2006


A quick patch for this as below (linux.h needs to patched
for all architectures).

--- linux.h	Sun Sep 10 22:03:28 2006
+++ linux.h_new	Sun Sep 10 22:02:53 2006
@@ -657,6 +657,7 @@
  		struct l_sockaddr	ifru_hwaddr;
  		l_short		ifru_flags[1];
  		l_int		ifru_metric;
+		l_int		ifru_ivalue;
  		l_int		ifru_mtu;
  		struct l_ifmap	ifru_map;
  		char		ifru_slave[LINUX_IFNAMSIZ];
@@ -666,6 +667,7 @@

  #define	ifr_name	ifr_ifrn.ifrn_name	/* interface name */
  #define	ifr_hwaddr	ifr_ifru.ifru_hwaddr	/* MAC address */
+#define	ifr_ifindex	ifr_ifru.ifru_ivalue	/* Interface index */

  /*
   * poll()
--- linux_ioctl.h	Sun Sep 10 22:05:48 2006
+++ linux_ioctl.h_new	Sun Sep 10 22:05:32 2006
@@ -196,9 +196,10 @@
  #define	LINUX_SIOCGIFHWADDR	0x8927
  #define	LINUX_SIOCADDMULTI	0x8931
  #define	LINUX_SIOCDELMULTI	0x8932
+#define	LINUX_SIOCGIFINDEX	0x8933

  #define	LINUX_IOCTL_SOCKET_MIN	LINUX_FIOSETOWN
-#define	LINUX_IOCTL_SOCKET_MAX	LINUX_SIOCDELMULTI
+#define	LINUX_IOCTL_SOCKET_MAX	LINUX_SIOCGIFINDEX

  /*
   * Device private ioctl calls
--- linux_ioctl.c	Sun Sep 10 22:05:48 2006
+++ linux_ioctl.c_new	Sun Sep 10 22:08:24 2006
@@ -2239,6 +2239,17 @@
  	return (copyout(&flags, &ifr->ifr_flags, sizeof(flags)));
  }

+static int
+linux_ifindex(struct thread *td, struct ifnet *ifp, struct l_ifreq *ifr)
+{
+#if DEBUG
+	printf("Interface index: %d\n", ifp->if_index);
+#endif
+	l_int index;
+	index = ifp->if_index;
+	return (copyout(&index, &ifr->ifr_ifindex, sizeof(index)));
+}
+
  #define ARPHRD_ETHER	1
  #define ARPHRD_LOOPBACK	772

@@ -2325,6 +2336,7 @@
  	case LINUX_SIOCSIFADDR:
  	case LINUX_SIOCGIFDSTADDR:
  	case LINUX_SIOCGIFBRDADDR:
+	case LINUX_SIOCGIFINDEX:
  	case LINUX_SIOCGIFNETMASK:
  	case LINUX_SIOCSIFNETMASK:
  	case LINUX_SIOCGIFMTU:
@@ -2421,6 +2433,11 @@
  	case LINUX_SIOCGIFBRDADDR:
  		args->cmd = OSIOCGIFBRDADDR;
  		error = ioctl(td, (struct ioctl_args *)args);
+		break;
+
+	case LINUX_SIOCGIFINDEX:
+		args->cmd = SIOCGIFINDEX;
+		error = linux_ifindex(td, ifp, (struct l_ifreq *)args->arg);
  		break;

  	case LINUX_SIOCGIFNETMASK:

-- 
               << Marcin Cieslak // saper at system.pl >>



More information about the freebsd-emulation mailing list