6621569: Win32ShellFolder2 and Win32ShellFolderManager2 may leak native resources
Reviewed-by: malenkov
--- a/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolder2.java Fri Oct 30 14:18:23 2009 +0300
+++ b/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolder2.java Fri Nov 06 12:44:41 2009 +0300
@@ -693,29 +693,32 @@
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]
--- a/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java Fri Oct 30 14:18:23 2009 +0300
+++ b/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java Fri Nov 06 12:44:41 2009 +0300
@@ -79,9 +79,12 @@
// 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)