[ https://issues.apache.org/jira/browse/TIKA-2896?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Eamonn Saunders updated TIKA-2896: ---------------------------------- Description: We have encountered a situation where the call to parser.reset() in the following code snippet results in a NullPointerException. {code:java} private static void releaseParser(SAXParser parser) { try { parser.reset(); } catch (UnsupportedOperationException e) { //ignore } {code} releaseParser() is called in the finally block of MimeTypesReader.read() {code:java} public void read(InputStream stream) throws IOException, MimeTypeException { SAXParser parser = null; try { parser = acquireSAXParser(); parser.parse(stream, this); } catch (TikaException e) { throw new MimeTypeException("Unable to create an XML parser", e); } catch (SAXException e) { throw new MimeTypeException("Invalid type configuration", e); } finally { releaseParser(parser); } }{code} The parser variable will be null coming out of acquireSAXParser() if acquireSAXParser() is called on a thread that is interrupted (i.e. the InterruptedException is handled in the following code): {code:java} private static SAXParser acquireSAXParser() throws TikaException { while (true) { SAXParser parser = null; try { READ_WRITE_LOCK.readLock().lock(); parser = SAX_PARSERS.poll(10, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { throw new TikaException("interrupted while waiting for SAXParser", e); } finally { READ_WRITE_LOCK.readLock().unlock(); } if (parser != null) { return parser; } } }{code} A simple fix would be to check for null before calling releaseParser() in the finally block. was: We have encountered a situation where the call to parser.reset() in the following code snippet results in a NullPointerException. {code:java} private static void releaseParser(SAXParser parser) { try { parser.reset(); } catch (UnsupportedOperationException e) { //ignore } {code} releaseParser() called in the finally block of MimeTypesReader.read() {code:java} public void read(InputStream stream) throws IOException, MimeTypeException { SAXParser parser = null; try { parser = acquireSAXParser(); parser.parse(stream, this); } catch (TikaException e) { throw new MimeTypeException("Unable to create an XML parser", e); } catch (SAXException e) { throw new MimeTypeException("Invalid type configuration", e); } finally { releaseParser(parser); } }{code} The parser variable will be null coming out of acquireSAXParser() if acquireSAXParser() is called on a thread that is interrupted (i.e. the InterruptedException is handled in the following code: {code:java} private static SAXParser acquireSAXParser() throws TikaException { while (true) { SAXParser parser = null; try { READ_WRITE_LOCK.readLock().lock(); parser = SAX_PARSERS.poll(10, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { throw new TikaException("interrupted while waiting for SAXParser", e); } finally { READ_WRITE_LOCK.readLock().unlock(); } if (parser != null) { return parser; } } }{code} A simple fix would be to check for null before calling releaseParser() in the finally block. > NullPointerException in MimeTypesReader.releaseParser() > ------------------------------------------------------- > > Key: TIKA-2896 > URL: https://issues.apache.org/jira/browse/TIKA-2896 > Project: Tika > Issue Type: Bug > Components: mime > Affects Versions: 1.21 > Reporter: Eamonn Saunders > Priority: Major > > We have encountered a situation where the call to parser.reset() in the > following code snippet results in a NullPointerException. > {code:java} > private static void releaseParser(SAXParser parser) { > try { > parser.reset(); > } catch (UnsupportedOperationException e) { > //ignore > } > {code} > releaseParser() is called in the finally block of MimeTypesReader.read() > {code:java} > public void read(InputStream stream) throws IOException, > MimeTypeException { > SAXParser parser = null; > try { > parser = acquireSAXParser(); > parser.parse(stream, this); > } catch (TikaException e) { > throw new MimeTypeException("Unable to create an XML parser", e); > } catch (SAXException e) { > throw new MimeTypeException("Invalid type configuration", e); > } finally { > releaseParser(parser); > } > }{code} > The parser variable will be null coming out of acquireSAXParser() if > acquireSAXParser() is called on a thread that is interrupted (i.e. the > InterruptedException is handled in the following code): > {code:java} > private static SAXParser acquireSAXParser() > throws TikaException { > while (true) { > SAXParser parser = null; > try { > READ_WRITE_LOCK.readLock().lock(); > parser = SAX_PARSERS.poll(10, TimeUnit.MILLISECONDS); > } catch (InterruptedException e) { > throw new TikaException("interrupted while waiting for > SAXParser", e); > } finally { > READ_WRITE_LOCK.readLock().unlock(); > } > if (parser != null) { > return parser; > } > } > }{code} > A simple fix would be to check for null before calling releaseParser() in the > finally block. -- This message was sent by Atlassian JIRA (v7.6.3#76005)