http://nagoya.apache.org/bugzilla/show_bug.cgi?id=549
*** shadow/549 Thu Feb 8 06:46:19 2001 --- shadow/549.tmp.10544 Thu Feb 8 06:46:19 2001 *************** *** 0 **** --- 1,73 ---- + +============================================================================+ + | NullPointerException when resolving external entities | + +----------------------------------------------------------------------------+ + | Bug #: 549 Product: Xerces-J | + | Status: NEW Version: unspecified | + | Resolution: Platform: All | + | Severity: Normal OS/Version: All | + | Priority: Component: Core | + +----------------------------------------------------------------------------+ + | Assigned To: [EMAIL PROTECTED] | + | Reported By: [EMAIL PROTECTED] | + | CC list: Cc: | + +----------------------------------------------------------------------------+ + | URL: | + +============================================================================+ + | DESCRIPTION | + There is a bug in the StringPool class that we see when we try to resolve + external entities and the top level source is an InputStream instead of a + SystemID. In other words, using + + org.apache.xerces.parsers.DOMParser.parse(new InputSource(InputStream)) + + Fails while + + org.apache.xerces.parsers.DOMParser(new InputSource(systemID)) works. + + I tracked this down to the StringPool.addSymbol() method. I believe + that since the InputSource(InputStream) never sets it's systemId, it + is null. So when this is passed into addSymbol() the exception occurs. + + It seems that the null should be a valid value so I fixed this locally + by patching the code. + + Originally found in version 1_2_0 but also in 1_2_3 and 1_3_0. + + + In org/apache/xerces/readersDefaultEntityHandler.java, this addSymbol + (fSystemId) on line 226 hits the bug. + + public int addExternalEntityDecl(int name, int publicId, int systemId, + boolean isExternal) throws Exception { + + ! int entityHandle = fEntityPool.addEntityDecl(name, -1, publicId, + systemId, fStringPool.addSymbol(fSystemId), -1, isExternal); + + return entityHandle; + + } + + + + fSystemId is null which is perfectly acceptable. But when addSymbol(...) tries + to get the length, a NullPointerException is raised. I believe there are other + cases where a null could be passed in to addSymbol(). So I added a check to + make sure null is acceptable. NULL_STRING is the index to the null string. + + + diff -cw ./src/org/apache/xerces/utils/StringPool.java ../xerces- + 1_2_3/src/org/apache/xerces/utils/StringPool.java + *** ./src/org/apache/xerces/utils/StringPool.java Wed Jan 31 20:11:30 2001 + --- ../xerces-1_2_3/src/org/apache/xerces/utils/StringPool.java Fri Jan 26 + 17:38:24 2001 + *************** + *** 345,350 **** + --- 345,352 ---- + } + } + public int addSymbol(String str) { + + if( str == null ) + + return NULL_STRING; + int slen = str.length(); + int hashcode = StringHasher.hashString(str, slen); + int hc = hashcode % HASHTABLE_SIZE;