You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tika.apache.org by "Wladimir Leite (Jira)" <ji...@apache.org> on 2021/05/14 20:55:00 UTC
[jira] [Updated] (TIKA-3405) Open file leak in MP4Parser
[ https://issues.apache.org/jira/browse/TIKA-3405?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Wladimir Leite updated TIKA-3405:
---------------------------------
Description:
After upgrading Tika to version 1.26 (I was using 1.20 before), I started to have some trouble with open video files that after Tika parsing couldn't be moved/deleted because they remain opened after finishing parsing process.
Investigating the issue, which happens with MOV/QT video files (not all of them), I found out that it happens whenever an exception is throw inside {{IsoFile()}} constructor (which is in fact part of MP4Parser project).
A simple test snippet to reproduce the issue:
{code:java}
File file = ...; //A test file
try (IsoFile isoFile = new IsoFile(file)) {
System.out.println("isoFile = " + isoFile);
} catch (Exception e) {
e.printStackTrace();
}
//Here the file is still opened
{code}
Here is the relevant part of {{IsoFile}} constructor:
{code:java}
public IsoFile(File file) throws IOException {
this(new FileInputStream(file).getChannel(), new PropertyBoxParserImpl());
}
public IsoFile(ReadableByteChannel readableByteChannel, BoxParser boxParser) throws IOException {
this.readableByteChannel = readableByteChannel;
initContainer(readableByteChannel, -1, boxParser);
}
{code}
So if {{initContainer()}} fails {{readableByteChannel}} will not be closed.
In the case of the videos I have here, {{initContainer()}} throws a {{RuntimeException}} because an unsupported data (although the videos are valid and I can open them):
{code:java}
java.lang.RuntimeException: box size of zero means 'till end of file. That is not yet supported{code}
A possible solution would be changing {{IsoFile}} constructor:
{code:java}
public IsoFile(ReadableByteChannel readableByteChannel, BoxParser boxParser) throws IOException {
this.readableByteChannel = readableByteChannel;
try {
initContainer(readableByteChannel, -1, boxParser);
} catch (Exception e) {
try {
close();
} catch (Exception e2) {
}
throw e;
}
}{code}
A sample file that cause this issue is attached. I have others if necessary.
was:
After upgrading Tika to version 1.26 (I was using 1.20 before), I started to have some trouble with open video files that after Tika parsing couldn't be moved/deleted because they remain opened after finishing parsing process.
Investigating the issue, which happens with MOV/QT video files (not all of them), I found out that it happens whenever an exception is throw inside {{IsoFile()}} constructor (which is in fact part of MP4Parser project).
A simple test snippet to reproduce the issue:
{code:java}
File file = ...; //A test file
try (IsoFile isoFile = new IsoFile(file)) {
System.out.println("isoFile = " + isoFile);
} catch (Exception e) {
e.printStackTrace();
}
//Here the file is still opened
{code}
Here is the relevant part of {{IsoFile}} constructor:
{code:java}
public IsoFile(File file) throws IOException {
this(new FileInputStream(file).getChannel(), new PropertyBoxParserImpl());
}
public IsoFile(ReadableByteChannel readableByteChannel, BoxParser boxParser) throws IOException {
this.readableByteChannel = readableByteChannel;
initContainer(readableByteChannel, -1, boxParser);
}
{code}
So if {{initContainer()}} fails {{readableByteChannel}} will not be closed.
In the case of the videos I have here, {{initContainer()}} throws a {{RuntimeException}} because an unsupported data (although the videos are valid and I can open them):
{code:java}
java.lang.RuntimeException: box size of zero means 'till end of file. That is not yet supported{code}
A possible solution would be changing {{IsoFile}} constructor:
{code:java}
public IsoFile(ReadableByteChannel readableByteChannel, BoxParser boxParser) throws IOException {
this.readableByteChannel = readableByteChannel;
try {
initContainer(readableByteChannel, -1, boxParser);
} catch (Exception e) {
try {
close();
} catch (Exception e2) {
}
throw e;
}
}{code}
A sample file that cause this issue is attached. I have others if necessary.
> Open file leak in MP4Parser
> ---------------------------
>
> Key: TIKA-3405
> URL: https://issues.apache.org/jira/browse/TIKA-3405
> Project: Tika
> Issue Type: Bug
> Components: parser
> Affects Versions: 1.26
> Environment: Windows 10, Oracle JDK 8 (64-bit, 1.8.0_281)
> Reporter: Wladimir Leite
> Priority: Major
> Attachments: 1.mov
>
>
> After upgrading Tika to version 1.26 (I was using 1.20 before), I started to have some trouble with open video files that after Tika parsing couldn't be moved/deleted because they remain opened after finishing parsing process.
> Investigating the issue, which happens with MOV/QT video files (not all of them), I found out that it happens whenever an exception is throw inside {{IsoFile()}} constructor (which is in fact part of MP4Parser project).
> A simple test snippet to reproduce the issue:
> {code:java}
> File file = ...; //A test file
> try (IsoFile isoFile = new IsoFile(file)) {
> System.out.println("isoFile = " + isoFile);
> } catch (Exception e) {
> e.printStackTrace();
> }
> //Here the file is still opened
> {code}
> Here is the relevant part of {{IsoFile}} constructor:
> {code:java}
> public IsoFile(File file) throws IOException {
> this(new FileInputStream(file).getChannel(), new PropertyBoxParserImpl());
> }
> public IsoFile(ReadableByteChannel readableByteChannel, BoxParser boxParser) throws IOException {
> this.readableByteChannel = readableByteChannel;
> initContainer(readableByteChannel, -1, boxParser);
> }
> {code}
> So if {{initContainer()}} fails {{readableByteChannel}} will not be closed.
> In the case of the videos I have here, {{initContainer()}} throws a {{RuntimeException}} because an unsupported data (although the videos are valid and I can open them):
> {code:java}
> java.lang.RuntimeException: box size of zero means 'till end of file. That is not yet supported{code}
> A possible solution would be changing {{IsoFile}} constructor:
> {code:java}
> public IsoFile(ReadableByteChannel readableByteChannel, BoxParser boxParser) throws IOException {
> this.readableByteChannel = readableByteChannel;
> try {
> initContainer(readableByteChannel, -1, boxParser);
> } catch (Exception e) {
> try {
> close();
> } catch (Exception e2) {
> }
> throw e;
> }
> }{code}
> A sample file that cause this issue is attached. I have others if necessary.
>
--
This message was sent by Atlassian Jira
(v8.3.4#803005)