Issue Details (XML | Word | Printable)

Key: DIRSERVER-468
Type: Improvement Improvement
Status: Closed Closed
Resolution: Won't Fix
Priority: Minor Minor
Assignee: Alex Karasulu
Reporter: Enrique Rodriguez
Votes: 0
Watchers: 0
Operations

If you were logged in you would be able to see more operations.
Directory ApacheDS

DirContext.search() with null Name results in NPE

Created: 27/Oct/05 04:53 AM   Updated: 06/May/09 05:08 PM
Return to search
Component/s: None
Affects Version/s: None
Fix Version/s: None

Time Tracking:
Not Specified

Resolution Date: 28/Oct/05 09:26 AM


 Description  « Hide
This is a minor issue I am marking as an improvement since the JNDI API doesn't appear to say explicitly what the behavior is, so I'm entering this issue to document it. The issue is that if you supply a null Name as the name to search in DirContext.search() you get a NPE. If you supply a null String, however, it is treated as the empty String, which indicates a search at the current context's name. IMO, a null Name should be treated like the empty String.

So, a null Name fails with NPE:

        Name name = null;
        NamingEnumeration answer = ctx.search( name, matchAttrs, attrIDs );

java.lang.NullPointerException
at org.apache.ldap.common.name.LdapName.addAll(LdapName.java:527)
at org.apache.ldap.server.jndi.ServerContext.buildTarget(ServerContext.java:843)
at org.apache.ldap.server.jndi.ServerDirContext.search(ServerDirContext.java:488)
...

But, a null String will work fine:

        String name = null;
        NamingEnumeration answer = ctx.search( name, matchAttrs, attrIDs );

Which is the same as the empty String, which works fine, too;

        String name = "";
        NamingEnumeration answer = ctx.search( name, matchAttrs, attrIDs );


 All   Comments   Work Log   Change History   Subversion Commits      Sort Order: Ascending order - Click to sort in descending order
Alex Karasulu added a comment - 28/Oct/05 09:26 AM
Hi Enrique,

I did not know the answer to this so I tested it with the SUN JNDI LDAP provider using this code here:

    public void testNullNameToCtxSearch() throws NamingException
    {
        final Hashtable env = new Hashtable();

        env.put( Context.PROVIDER_URL, "ldap://localhost:" + port + "/dc=aPache,dc=org" );
        env.put("java.naming.ldap.version", "3");
        env.put( Context.SECURITY_PRINCIPAL, "uid=admin,ou=system" );
        env.put( Context.SECURITY_CREDENTIALS, "secret" );
        env.put( Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory" );
        InitialDirContext ctx = new InitialDirContext( env );
        Name nullName = null;
        ctx.search( nullName, "(objectClass=*)", new SearchControls() );
    }

Here's the NPE I got from the NamingSubsystem:

java.lang.NullPointerException
at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:330)
at javax.naming.directory.InitialDirContext.getURLOrDefaultInitDirCtx(InitialDirContext.java:99)
at javax.naming.directory.InitialDirContext.search(InitialDirContext.java:245)
at org.apache.ldap.server.MiscTest.testNullNameToCtxSearch(MiscTest.java:328)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at com.intellij.rt.execution.junit2.JUnitStarter.main(JUnitStarter.java:31)

Just to double check I tested handing off null to our provider to look at the stack trace:

java.lang.NullPointerException
at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:330)
at javax.naming.directory.InitialDirContext.getURLOrDefaultInitDirCtx(InitialDirContext.java:99)
at javax.naming.directory.InitialDirContext.search(InitialDirContext.java:245)
at org.apache.ldap.server.MiscTest.testBogusAttributeInSearchFilter(MiscTest.java:316)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at com.intellij.rt.execution.junit2.JUnitStarter.main(JUnitStarter.java:31)

The same exact trace due to IDC wrapper. If IDC behaves this way I think its ok for our contexts to behave in the same manner.