JDK-5004073 : Impossible to use Security Manager with unstable DNS
  • Type: Bug
  • Component: core-libs
  • Sub-Component: java.net
  • Affected Version: 1.4.2
  • Priority: P4
  • Status: Closed
  • Resolution: Duplicate
  • OS: linux
  • CPU: x86
  • Submitted: 2004-02-26
  • Updated: 2004-03-01
  • Resolved: 2004-03-01
Related Reports
Duplicate :  
Description

Name: gm110360			Date: 02/26/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)

and

java version "1.5.0-beta"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0-beta-b32c)
Java HotSpot(TM) Client VM (build 1.5.0-beta-b32c, mixed mode)


ADDITIONAL OS VERSION INFORMATION :
Red Hat Enterprise Linux ES release 3 (Taroon)
Fedora Core release 1 (Yarrow)
Mandrake Linux release 8.2 (Bluebird) for i586


A DESCRIPTION OF THE PROBLEM :
On webservers, the security manager is often used to secure the environment. A problem by doing so is that if the DNS service the webserver is using is down, response times of the webserver rise considerably. It seems that SocketPermission wants to do a dns query on every established connection to the server, even though you permitted '*'

STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
The reproduce this, use for instance KnockKnockServer/Client from http://java.sun.com/docs/books/tutorial/networking/sockets/clientServer.html

Change /etc/resolv.conf to point to bogus nameservers and make sure the client and server hosts are not listed in /etc/hosts

Start KnockKnockServer using this policy file:

grant codeBase "file:///home/foo/java/test/knockknock/-" {
  permission java.net.SocketPermission "*", "accept, connect, listen, resolve";
};

Run the server:
java -Djava.security.manager -Djava.security.policy=file:/home/foo/java/test/knockknock/kk.policy KnockKnockServer

Run the client on a different host than the KnockKnockServer...


EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Client responds immediately with:

Server: Knock! Knock!
ACTUAL -
Client hangs for several seconds before responding with:

Server: Knock! Knock!



ERROR MESSAGES/STACK TRACES THAT OCCUR :
While waiting for reply the a stacktrace of the KnockKnockServer look like:

Full thread dump Java HotSpot(TM) Client VM (1.4.2-b28 mixed mode):
 
"Signal Dispatcher" daemon prio=1 tid=0x0809e340 nid=0x1977 waiting on condition [0..0]
 
"Finalizer" daemon prio=1 tid=0x08088ea0 nid=0x1977 in Object.wait() [4c942000..4c94287c]
        at java.lang.Object.wait(Native Method)
        - waiting on <0x44740490> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:111)
        - locked <0x44740490> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:127)
        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)
 
"Reference Handler" daemon prio=1 tid=0x08088230 nid=0x1977 in Object.wait() [4c8c1000..4c8c187c]
        at java.lang.Object.wait(Native Method)
        - waiting on <0x44740380> (a java.lang.ref.Reference$Lock)
        at java.lang.Object.wait(Object.java:429)
        at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:115)
        - locked <0x44740380> (a java.lang.ref.Reference$Lock)
 
"main" prio=1 tid=0x080529e8 nid=0x1977 runnable [bfffd000..bfffd4fc]
        at java.net.Inet6AddressImpl.getHostByAddr(Native Method)
        at java.net.InetAddress$1.getHostByAddr(InetAddress.java:774)
        at java.net.InetAddress.getHostFromNameService(InetAddress.java:464)
        at java.net.InetAddress.getHostName(InetAddress.java:407)
        at java.net.SocketPermission.getCanonName(SocketPermission.java:567)
        at java.net.SocketPermission.impliesIgnoreMask(SocketPermission.java:770)
        at java.net.SocketPermissionCollection.implies(SocketPermission.java:1129)
        at java.security.Permissions.implies(Permissions.java:157)
        at sun.security.provider.PolicyFile.implies(PolicyFile.java:1096)
        at java.security.ProtectionDomain.implies(ProtectionDomain.java:189)
        at java.security.AccessControlContext.checkPermission(AccessControlContext.java:254)
        at java.security.AccessController.checkPermission(AccessController.java:401)
        at java.lang.SecurityManager.checkPermission(SecurityManager.java:524)
        at java.lang.SecurityManager.checkAccept(SecurityManager.java:1149)
        at java.net.ServerSocket.implAccept(ServerSocket.java:452)
        at java.net.ServerSocket.accept(ServerSocket.java:419)
        at KnockKnockServer.main(KnockKnockServer.java:17)
 
"VM Thread" prio=1 tid=0x08086e20 nid=0x1977 runnable
 
"VM Periodic Task Thread" prio=1 tid=0x080a0e90 nid=0x1977 waiting on condition
"Suspend Checker Thread" prio=1 tid=0x0809d738 nid=0x1977 runnable



REPRODUCIBILITY :
This bug can be reproduced always.

---------- BEGIN SOURCE ----------
Source code can be fetched from: http://java.sun.com/docs/books/tutorial/networking/sockets/clientServer.html
---------- END SOURCE ----------

CUSTOMER SUBMITTED WORKAROUND :
Do not use Security Manager...
(Incident Review ID: 240438) 
======================================================================