6621569: Win32ShellFolder2 and Win32ShellFolderManager2 may leak native resources
Reviewed-by: malenkov
This commit is contained in:
parent
fcfa835d86
commit
e918d4b860
@ -693,29 +693,32 @@ final class Win32ShellFolder2 extends ShellFolder {
|
||||
ArrayList<Win32ShellFolder2> list = new ArrayList<Win32ShellFolder2>();
|
||||
long pEnumObjects = getEnumObjects(includeHiddenFiles);
|
||||
if (pEnumObjects != 0) {
|
||||
long childPIDL;
|
||||
int testedAttrs = ATTRIB_FILESYSTEM | ATTRIB_FILESYSANCESTOR;
|
||||
do {
|
||||
childPIDL = getNextChild(pEnumObjects);
|
||||
boolean releasePIDL = true;
|
||||
if (childPIDL != 0 &&
|
||||
(getAttributes0(pIShellFolder, childPIDL, testedAttrs) & testedAttrs) != 0) {
|
||||
Win32ShellFolder2 childFolder;
|
||||
if (Win32ShellFolder2.this.equals(desktop)
|
||||
&& personal != null
|
||||
&& pidlsEqual(pIShellFolder, childPIDL, personal.disposer.relativePIDL)) {
|
||||
childFolder = personal;
|
||||
} else {
|
||||
childFolder = new Win32ShellFolder2(Win32ShellFolder2.this, childPIDL);
|
||||
releasePIDL = false;
|
||||
try {
|
||||
long childPIDL;
|
||||
int testedAttrs = ATTRIB_FILESYSTEM | ATTRIB_FILESYSANCESTOR;
|
||||
do {
|
||||
childPIDL = getNextChild(pEnumObjects);
|
||||
boolean releasePIDL = true;
|
||||
if (childPIDL != 0 &&
|
||||
(getAttributes0(pIShellFolder, childPIDL, testedAttrs) & testedAttrs) != 0) {
|
||||
Win32ShellFolder2 childFolder;
|
||||
if (Win32ShellFolder2.this.equals(desktop)
|
||||
&& personal != null
|
||||
&& pidlsEqual(pIShellFolder, childPIDL, personal.disposer.relativePIDL)) {
|
||||
childFolder = personal;
|
||||
} else {
|
||||
childFolder = new Win32ShellFolder2(Win32ShellFolder2.this, childPIDL);
|
||||
releasePIDL = false;
|
||||
}
|
||||
list.add(childFolder);
|
||||
}
|
||||
list.add(childFolder);
|
||||
}
|
||||
if (releasePIDL) {
|
||||
releasePIDL(childPIDL);
|
||||
}
|
||||
} while (childPIDL != 0 && !Thread.currentThread().isInterrupted());
|
||||
releaseEnumObjects(pEnumObjects);
|
||||
if (releasePIDL) {
|
||||
releasePIDL(childPIDL);
|
||||
}
|
||||
} while (childPIDL != 0 && !Thread.currentThread().isInterrupted());
|
||||
} finally {
|
||||
releaseEnumObjects(pEnumObjects);
|
||||
}
|
||||
}
|
||||
return Thread.currentThread().isInterrupted()
|
||||
? new File[0]
|
||||
|
@ -79,9 +79,12 @@ public class Win32ShellFolderManager2 extends ShellFolderManager {
|
||||
// Shouldn't happen but watch for it anyway
|
||||
throw new FileNotFoundException("File " + file.getAbsolutePath() + " not found");
|
||||
}
|
||||
Win32ShellFolder2 folder = createShellFolderFromRelativePIDL(parent, pIDL);
|
||||
Win32ShellFolder2.releasePIDL(pIDL);
|
||||
return folder;
|
||||
|
||||
try {
|
||||
return createShellFolderFromRelativePIDL(parent, pIDL);
|
||||
} finally {
|
||||
Win32ShellFolder2.releasePIDL(pIDL);
|
||||
}
|
||||
}
|
||||
|
||||
static Win32ShellFolder2 createShellFolderFromRelativePIDL(Win32ShellFolder2 parent, long pIDL)
|
||||
|
Loading…
Reference in New Issue
Block a user