Name: jl125535 Date: 01/21/2004
FULL PRODUCT VERSION :
java version "1.4.2"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2-b28)
Java HotSpot(TM) Client VM (build 1.4.2-b28, mixed mode)
FULL OS VERSION :
Microsoft Windows 2000 [Version 5.00.2195]
A DESCRIPTION OF THE PROBLEM :
Joining a multicast group using the interface-specific method
MulticastSocket.joinGroup(SocketAddress sockaddr, NetworkInterface netif) when the LAN port is disconnected causes the JVM to crash with an Access Violation.
This also occurs when leaving a multicast group when the LAN port is disconnected.
This is a JVM crash, not a catchable exception.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Unplug your LAN cable, then run the code given below with no command line argument
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
If the LAN is connected, you get:
joining lo
joining eth0
joining eth1
success
After disconnecting eth0, I would expect to see:
joining lo
joining eth0
java.net.SocketException: blah blah blah
ACTUAL -
joining lo
joining eth0
Unexpected Signal : EXCEPTION_ACCESS_VIOLATION (0xc0000005) occurred at PC=0x80778C2
Function=[Unknown.]
Library=C:\Program Files\Java\j2re1.4.2\bin\client\jvm.dll
NOTE: We are unable to locate the function name symbol for the error
just occurred. Please refer to release documentation for possible
reason and solutions.
Current Java thread:
at java.net.PlainDatagramSocketImpl.join(Native Method)
at java.net.PlainDatagramSocketImpl.joinGroup(Unknown Source)
at java.net.MulticastSocket.joinGroup(Unknown Source)
at MCBug.join(MCBug.java:36)
at MCBug.main(MCBug.java:55)
Dynamic libraries:
0x00400000 - 0x00406000 C:\WINNT\system32\java.exe
0x77F80000 - 0x77FFB000 C:\WINNT\system32\ntdll.dll
0x7C2D0000 - 0x7C332000 C:\WINNT\system32\ADVAPI32.dll
0x7C4E0000 - 0x7C599000 C:\WINNT\system32\KERNEL32.DLL
0x77D30000 - 0x77D9E000 C:\WINNT\system32\RPCRT4.DLL
0x78000000 - 0x78045000 C:\WINNT\system32\MSVCRT.dll
0x08000000 - 0x08136000 C:\Program Files\Java\j2re1.4.2\bin\client\jvm.dll
0x77E10000 - 0x77E75000 C:\WINNT\system32\USER32.dll
0x77F40000 - 0x77F7C000 C:\WINNT\system32\GDI32.DLL
0x77570000 - 0x775A0000 C:\WINNT\system32\WINMM.dll
0x6BD00000 - 0x6BD0D000 C:\WINNT\system32\SYNCOR11.DLL
0x10000000 - 0x10007000 C:\Program Files\Java\j2re1.4.2\bin\hpi.dll
0x007C0000 - 0x007CE000 C:\Program Files\Java\j2re1.4.2\bin\verify.dll
0x007D0000 - 0x007E8000 C:\Program Files\Java\j2re1.4.2\bin\java.dll
0x007F0000 - 0x007FD000 C:\Program Files\Java\j2re1.4.2\bin\zip.dll
0x18270000 - 0x1827F000 C:\Program Files\Java\j2re1.4.2\bin\net.dll
0x75030000 - 0x75044000 C:\WINNT\system32\WS2_32.dll
0x75020000 - 0x75028000 C:\WINNT\system32\WS2HELP.DLL
0x74FD0000 - 0x74FEE000 C:\WINNT\system32\msafd.dll
0x75010000 - 0x75017000 C:\WINNT\System32\wshtcpip.dll
0x77340000 - 0x77353000 C:\WINNT\system32\iphlpapi.dll
0x77520000 - 0x77525000 C:\WINNT\system32\ICMP.DLL
0x77320000 - 0x77337000 C:\WINNT\system32\MPRAPI.DLL
0x75150000 - 0x7515F000 C:\WINNT\system32\SAMLIB.DLL
0x75170000 - 0x751BF000 C:\WINNT\system32\NETAPI32.DLL
0x7C340000 - 0x7C34F000 C:\WINNT\system32\SECUR32.DLL
0x751C0000 - 0x751C6000 C:\WINNT\system32\NETRAP.DLL
0x77950000 - 0x7797A000 C:\WINNT\system32\WLDAP32.DLL
0x77980000 - 0x779A4000 C:\WINNT\system32\DNSAPI.DLL
0x75050000 - 0x75058000 C:\WINNT\system32\WSOCK32.DLL
0x77A50000 - 0x77B3C000 C:\WINNT\system32\OLE32.DLL
0x779B0000 - 0x77A4B000 C:\WINNT\system32\OLEAUT32.DLL
0x773B0000 - 0x773DF000 C:\WINNT\system32\ACTIVEDS.DLL
0x77380000 - 0x773A3000 C:\WINNT\system32\ADSLDPC.DLL
0x77830000 - 0x7783E000 C:\WINNT\system32\RTUTILS.DLL
0x77880000 - 0x7790E000 C:\WINNT\system32\SETUPAPI.DLL
0x7C0F0000 - 0x7C152000 C:\WINNT\system32\USERENV.DLL
0x774E0000 - 0x77513000 C:\WINNT\system32\RASAPI32.DLL
0x774C0000 - 0x774D1000 C:\WINNT\system32\RASMAN.DLL
0x77530000 - 0x77552000 C:\WINNT\system32\TAPI32.DLL
0x71710000 - 0x71794000 C:\WINNT\system32\COMCTL32.DLL
0x63180000 - 0x631E5000 C:\WINNT\system32\SHLWAPI.DLL
0x77360000 - 0x77379000 C:\WINNT\system32\DHCPCSVC.DLL
0x77920000 - 0x77943000 C:\WINNT\system32\imagehlp.dll
0x72A00000 - 0x72A2D000 C:\WINNT\system32\DBGHELP.dll
0x690A0000 - 0x690AB000 C:\WINNT\system32\PSAPI.DLL
Heap at VM Abort:
Heap
def new generation total 576K, used 184K [0x10010000, 0x100b0000, 0x104f0000)
eden space 512K, 36% used [0x10010000, 0x1003e378, 0x10090000)
from space 64K, 0% used [0x10090000, 0x10090000, 0x100a0000)
to space 64K, 0% used [0x100a0000, 0x100a0000, 0x100b0000)
tenured generation total 1408K, used 0K [0x104f0000, 0x10650000, 0x14010000)
the space 1408K, 0% used [0x104f0000, 0x104f0000, 0x104f0200, 0x10650000)
compacting perm gen total 4096K, used 1065K [0x14010000, 0x14410000, 0x18010000)
the space 4096K, 26% used [0x14010000, 0x1411a640, 0x1411a800, 0x14410000)
Local Time = Thu Oct 23 11:50:30 2003
Elapsed Time = 0
#
# HotSpot Virtual Machine Error : EXCEPTION_ACCESS_VIOLATION
# Error ID : 4F530E43505002EF
# Please report this error at
# http://java.sun.com/cgi-bin/bugreport.cgi
#
# Java VM: Java HotSpot(TM) Client VM (1.4.2-b28 mixed mode)
#
# An error report file has been saved as hs_err_pid1816.log.
# Please refer to the file for further information.
#
ERROR MESSAGES/STACK TRACES THAT OCCUR :
Unexpected Signal : EXCEPTION_ACCESS_VIOLATION (0xc0000005) occurred at PC=0x80778C2
Function=[Unknown.]
Library=C:\Program Files\Java\j2re1.4.2\bin\client\jvm.dll
NOTE: We are unable to locate the function name symbol for the error
just occurred. Please refer to release documentation for possible
reason and solutions.
Current Java thread:
at java.net.PlainDatagramSocketImpl.join(Native Method)
at java.net.PlainDatagramSocketImpl.joinGroup(Unknown Source)
at java.net.MulticastSocket.joinGroup(Unknown Source)
at MCBug.join(MCBug.java:36)
at MCBug.main(MCBug.java:55)
Dynamic libraries:
0x00400000 - 0x00406000 C:\WINNT\system32\java.exe
0x77F80000 - 0x77FFB000 C:\WINNT\system32\ntdll.dll
0x7C2D0000 - 0x7C332000 C:\WINNT\system32\ADVAPI32.dll
0x7C4E0000 - 0x7C599000 C:\WINNT\system32\KERNEL32.DLL
0x77D30000 - 0x77D9E000 C:\WINNT\system32\RPCRT4.DLL
0x78000000 - 0x78045000 C:\WINNT\system32\MSVCRT.dll
0x08000000 - 0x08136000 C:\Program Files\Java\j2re1.4.2\bin\client\jvm.dll
0x77E10000 - 0x77E75000 C:\WINNT\system32\USER32.dll
0x77F40000 - 0x77F7C000 C:\WINNT\system32\GDI32.DLL
0x77570000 - 0x775A0000 C:\WINNT\system32\WINMM.dll
0x6BD00000 - 0x6BD0D000 C:\WINNT\system32\SYNCOR11.DLL
0x10000000 - 0x10007000 C:\Program Files\Java\j2re1.4.2\bin\hpi.dll
0x007C0000 - 0x007CE000 C:\Program Files\Java\j2re1.4.2\bin\verify.dll
0x007D0000 - 0x007E8000 C:\Program Files\Java\j2re1.4.2\bin\java.dll
0x007F0000 - 0x007FD000 C:\Program Files\Java\j2re1.4.2\bin\zip.dll
0x18270000 - 0x1827F000 C:\Program Files\Java\j2re1.4.2\bin\net.dll
0x75030000 - 0x75044000 C:\WINNT\system32\WS2_32.dll
0x75020000 - 0x75028000 C:\WINNT\system32\WS2HELP.DLL
0x74FD0000 - 0x74FEE000 C:\WINNT\system32\msafd.dll
0x75010000 - 0x75017000 C:\WINNT\System32\wshtcpip.dll
0x77340000 - 0x77353000 C:\WINNT\system32\iphlpapi.dll
0x77520000 - 0x77525000 C:\WINNT\system32\ICMP.DLL
0x77320000 - 0x77337000 C:\WINNT\system32\MPRAPI.DLL
0x75150000 - 0x7515F000 C:\WINNT\system32\SAMLIB.DLL
0x75170000 - 0x751BF000 C:\WINNT\system32\NETAPI32.DLL
0x7C340000 - 0x7C34F000 C:\WINNT\system32\SECUR32.DLL
0x751C0000 - 0x751C6000 C:\WINNT\system32\NETRAP.DLL
0x77950000 - 0x7797A000 C:\WINNT\system32\WLDAP32.DLL
0x77980000 - 0x779A4000 C:\WINNT\system32\DNSAPI.DLL
0x75050000 - 0x75058000 C:\WINNT\system32\WSOCK32.DLL
0x77A50000 - 0x77B3C000 C:\WINNT\system32\OLE32.DLL
0x779B0000 - 0x77A4B000 C:\WINNT\system32\OLEAUT32.DLL
0x773B0000 - 0x773DF000 C:\WINNT\system32\ACTIVEDS.DLL
0x77380000 - 0x773A3000 C:\WINNT\system32\ADSLDPC.DLL
0x77830000 - 0x7783E000 C:\WINNT\system32\RTUTILS.DLL
0x77880000 - 0x7790E000 C:\WINNT\system32\SETUPAPI.DLL
0x7C0F0000 - 0x7C152000 C:\WINNT\system32\USERENV.DLL
0x774E0000 - 0x77513000 C:\WINNT\system32\RASAPI32.DLL
0x774C0000 - 0x774D1000 C:\WINNT\system32\RASMAN.DLL
0x77530000 - 0x77552000 C:\WINNT\system32\TAPI32.DLL
0x71710000 - 0x71794000 C:\WINNT\system32\COMCTL32.DLL
0x63180000 - 0x631E5000 C:\WINNT\system32\SHLWAPI.DLL
0x77360000 - 0x77379000 C:\WINNT\system32\DHCPCSVC.DLL
0x77920000 - 0x77943000 C:\WINNT\system32\imagehlp.dll
0x72A00000 - 0x72A2D000 C:\WINNT\system32\DBGHELP.dll
0x690A0000 - 0x690AB000 C:\WINNT\system32\PSAPI.DLL
Heap at VM Abort:
Heap
def new generation total 576K, used 184K [0x10010000, 0x100b0000, 0x104f0000)
eden space 512K, 36% used [0x10010000, 0x1003e378, 0x10090000)
from space 64K, 0% used [0x10090000, 0x10090000, 0x100a0000)
to space 64K, 0% used [0x100a0000, 0x100a0000, 0x100b0000)
tenured generation total 1408K, used 0K [0x104f0000, 0x10650000, 0x14010000)
the space 1408K, 0% used [0x104f0000, 0x104f0000, 0x104f0200, 0x10650000)
compacting perm gen total 4096K, used 1065K [0x14010000, 0x14410000, 0x18010000)
the space 4096K, 26% used [0x14010000, 0x1411a640, 0x1411a800, 0x14410000)
Local Time = Thu Oct 23 11:50:30 2003
Elapsed Time = 0
#
# HotSpot Virtual Machine Error : EXCEPTION_ACCESS_VIOLATION
# Error ID : 4F530E43505002EF
# Please report this error at
# http://java.sun.com/cgi-bin/bugreport.cgi
#
# Java VM: Java HotSpot(TM) Client VM (1.4.2-b28 mixed mode)
#
# An error report file has been saved as hs_err_pid1816.log.
# Please refer to the file for further information.
#
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
// MCBug.java
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.net.NetworkInterface;
import java.net.SocketAddress;
import java.net.InetSocketAddress;
import java.util.Enumeration;
/**
* Demonstrates Multicast bug and workaround.
* Run on Windows with LAN cable unplugged.
* "java MCBug" should cause an access violation.
* "java MCBug fix" works OK, demonstrating workaround.
*/
public class MCBug
{
/** return true if the interface has at least one InetAddress. */
private static boolean isValid(NetworkInterface netif)
{
return netif.getInetAddresses().hasMoreElements();
}
/** join the multicast group sockaddr on all interfaces. */
private static void join(MulticastSocket sock, SocketAddress sockaddr, boolean always)
throws Exception
{
Enumeration enum = NetworkInterface.getNetworkInterfaces();
while (enum.hasMoreElements())
{
NetworkInterface netif = (NetworkInterface) enum.nextElement();
if (always || isValid(netif))
{
System.out.println("joining " + netif.getName());
sock.joinGroup(sockaddr, netif);
}
}
}
/** try joining */
public static void main(String[] args)
throws Exception
{
try
{
InetAddress addr = InetAddress.getByName("226.7.8.9");
MulticastSocket sock = new MulticastSocket(8000);
SocketAddress sockaddr = new InetSocketAddress(addr, sock.getLocalPort());
boolean always = true;
if (args.length > 0 && args[0].equals("fix"))
always = false;
join(sock, sockaddr, always);
System.out.println("success");
}
catch (Exception any)
{
any.printStackTrace();
}
}
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
You can avoid the problem if you check that there is at least one InetAddress associated with the NetworkInterface before joining (or leaving).
In the example code, this is implemented as isValid(NetworkInterface netif).
If you run the code as "java MCBug fix" it will skip the join for any interface for which isValid(netif) returns false.
There is still potential for a crash due to the race condition (i.e. if conditions change after you check but before you join), but that is much less likely.
(Incident Review ID: 217330)
======================================================================