提交 50dd8b08 编写于 作者: R rupashka

6621569: Win32ShellFolder2 and Win32ShellFolderManager2 may leak native resources

Reviewed-by: malenkov
上级 360a1536
...@@ -693,29 +693,32 @@ final class Win32ShellFolder2 extends ShellFolder { ...@@ -693,29 +693,32 @@ final class Win32ShellFolder2 extends ShellFolder {
ArrayList<Win32ShellFolder2> list = new ArrayList<Win32ShellFolder2>(); ArrayList<Win32ShellFolder2> list = new ArrayList<Win32ShellFolder2>();
long pEnumObjects = getEnumObjects(includeHiddenFiles); long pEnumObjects = getEnumObjects(includeHiddenFiles);
if (pEnumObjects != 0) { if (pEnumObjects != 0) {
long childPIDL; try {
int testedAttrs = ATTRIB_FILESYSTEM | ATTRIB_FILESYSANCESTOR; long childPIDL;
do { int testedAttrs = ATTRIB_FILESYSTEM | ATTRIB_FILESYSANCESTOR;
childPIDL = getNextChild(pEnumObjects); do {
boolean releasePIDL = true; childPIDL = getNextChild(pEnumObjects);
if (childPIDL != 0 && boolean releasePIDL = true;
(getAttributes0(pIShellFolder, childPIDL, testedAttrs) & testedAttrs) != 0) { if (childPIDL != 0 &&
Win32ShellFolder2 childFolder; (getAttributes0(pIShellFolder, childPIDL, testedAttrs) & testedAttrs) != 0) {
if (Win32ShellFolder2.this.equals(desktop) Win32ShellFolder2 childFolder;
&& personal != null if (Win32ShellFolder2.this.equals(desktop)
&& pidlsEqual(pIShellFolder, childPIDL, personal.disposer.relativePIDL)) { && personal != null
childFolder = personal; && pidlsEqual(pIShellFolder, childPIDL, personal.disposer.relativePIDL)) {
} else { childFolder = personal;
childFolder = new Win32ShellFolder2(Win32ShellFolder2.this, childPIDL); } else {
releasePIDL = false; childFolder = new Win32ShellFolder2(Win32ShellFolder2.this, childPIDL);
releasePIDL = false;
}
list.add(childFolder);
} }
list.add(childFolder); if (releasePIDL) {
} releasePIDL(childPIDL);
if (releasePIDL) { }
releasePIDL(childPIDL); } while (childPIDL != 0 && !Thread.currentThread().isInterrupted());
} } finally {
} while (childPIDL != 0 && !Thread.currentThread().isInterrupted()); releaseEnumObjects(pEnumObjects);
releaseEnumObjects(pEnumObjects); }
} }
return Thread.currentThread().isInterrupted() return Thread.currentThread().isInterrupted()
? new File[0] ? new File[0]
......
...@@ -79,9 +79,12 @@ public class Win32ShellFolderManager2 extends ShellFolderManager { ...@@ -79,9 +79,12 @@ public class Win32ShellFolderManager2 extends ShellFolderManager {
// Shouldn't happen but watch for it anyway // Shouldn't happen but watch for it anyway
throw new FileNotFoundException("File " + file.getAbsolutePath() + " not found"); throw new FileNotFoundException("File " + file.getAbsolutePath() + " not found");
} }
Win32ShellFolder2 folder = createShellFolderFromRelativePIDL(parent, pIDL);
Win32ShellFolder2.releasePIDL(pIDL); try {
return folder; return createShellFolderFromRelativePIDL(parent, pIDL);
} finally {
Win32ShellFolder2.releasePIDL(pIDL);
}
} }
static Win32ShellFolder2 createShellFolderFromRelativePIDL(Win32ShellFolder2 parent, long pIDL) static Win32ShellFolder2 createShellFolderFromRelativePIDL(Win32ShellFolder2 parent, long pIDL)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册