# HG changeset patch # User vinnie # Date 1296760145 0 # Node ID 3f25c377019145238460aabaeead90704b136367 # Parent 71793028dd7628345e3a9680e97ac29bb3b4d46f 6997561: A request for better error handling in JNDI Reviewed-by: robm diff -r 71793028dd76 -r 3f25c3770191 jdk/src/share/classes/com/sun/jndi/toolkit/ctx/Continuation.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); diff -r 71793028dd76 -r 3f25c3770191 jdk/test/com/sun/jndi/ldap/LdapName/EmptyNameSearch.java --- /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 + } + } + } +}