6997561: A request for better error handling in JNDI
authorvinnie
Thu, 03 Feb 2011 19:09:05 +0000
changeset 8172 3f25c3770191
parent 8171 71793028dd76
child 8173 a3a39b98e05a
6997561: A request for better error handling in JNDI Reviewed-by: robm
jdk/src/share/classes/com/sun/jndi/toolkit/ctx/Continuation.java
jdk/test/com/sun/jndi/ldap/LdapName/EmptyNameSearch.java
--- a/jdk/src/share/classes/com/sun/jndi/toolkit/ctx/Continuation.java	Thu Feb 03 13:37:42 2011 +0000
+++ b/jdk/src/share/classes/com/sun/jndi/toolkit/ctx/Continuation.java	Thu Feb 03 19:09:05 2011 +0000
@@ -143,7 +143,7 @@
         e.setRemainingName(remainingName);
         e.setResolvedObj(resolvedObj);
 
-        if (starter == null)
+        if (starter == null || starter.isEmpty())
             e.setResolvedName(null);
         else if (remainingName == null)
             e.setResolvedName(starter);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/jndi/ldap/LdapName/EmptyNameSearch.java	Thu Feb 03 19:09:05 2011 +0000
@@ -0,0 +1,118 @@
+/**
+ * @test
+ * @bug 6997561
+ * @summary A request for better error handling in JNDI
+ */
+
+import java.net.Socket;
+import java.net.ServerSocket;
+import java.io.*;
+import javax.naming.*;
+import javax.naming.directory.*;
+import javax.naming.ldap.*;
+import java.util.Collections;
+import java.util.Hashtable;
+
+public class EmptyNameSearch {
+
+    public static void main(String[] args) throws Exception {
+
+        // Start the LDAP server
+        Server s = new Server();
+        s.start();
+        Thread.sleep(3000);
+
+        // Setup JNDI parameters
+        Hashtable env = new Hashtable();
+        env.put(Context.INITIAL_CONTEXT_FACTORY,
+            "com.sun.jndi.ldap.LdapCtxFactory");
+        env.put(Context.PROVIDER_URL, "ldap://localhost:" + s.getPortNumber());
+
+        try {
+
+            // Create initial context
+            System.out.println("Client: connecting...");
+            DirContext ctx = new InitialDirContext(env);
+
+            System.out.println("Client: performing search...");
+            ctx.search(new LdapName(Collections.EMPTY_LIST), "cn=*", null);
+            ctx.close();
+
+            // Exit
+            throw new RuntimeException();
+
+        } catch (NamingException e) {
+            System.err.println("Passed: caught the expected Exception - " + e);
+
+        } catch (Exception e) {
+            System.err.println("Failed: caught an unexpected Exception - " + e);
+            throw e;
+        }
+    }
+
+    static class Server extends Thread {
+
+        private int serverPort = 0;
+        private byte[] bindResponse = {
+            0x30, 0x0C, 0x02, 0x01, 0x01, 0x61, 0x07, 0x0A,
+            0x01, 0x00, 0x04, 0x00, 0x04, 0x00
+        };
+        private byte[] searchResponse = {
+            0x30, 0x0C, 0x02, 0x01, 0x02, 0x65, 0x07, 0x0A,
+            0x01, 0x02, 0x04, 0x00, 0x04, 0x00
+        };
+
+        Server() {
+        }
+
+        public int getPortNumber() {
+            return serverPort;
+        }
+
+        public void run() {
+            try {
+                ServerSocket serverSock = new ServerSocket(0);
+                serverPort = serverSock.getLocalPort();
+                System.out.println("Server: listening on port " + serverPort);
+
+                Socket socket = serverSock.accept();
+                System.out.println("Server: connection accepted");
+
+                InputStream in = socket.getInputStream();
+                OutputStream out = socket.getOutputStream();
+
+                // Read the LDAP BindRequest
+                System.out.println("Server: reading request...");
+                while (in.read() != -1) {
+                    in.skip(in.available());
+                    break;
+                }
+
+                // Write an LDAP BindResponse
+                System.out.println("Server: writing response...");
+                out.write(bindResponse);
+                out.flush();
+
+                // Read the LDAP SearchRequest
+                System.out.println("Server: reading request...");
+                while (in.read() != -1) {
+                    in.skip(in.available());
+                    break;
+                }
+
+                // Write an LDAP SearchResponse
+                System.out.println("Server: writing response...");
+                out.write(searchResponse);
+                out.flush();
+
+                in.close();
+                out.close();
+                socket.close();
+                serverSock.close();
+
+            } catch (IOException e) {
+                // ignore
+            }
+        }
+    }
+}