6621569: Win32ShellFolder2 and Win32ShellFolderManager2 may leak native resources
authorrupashka
Fri, 06 Nov 2009 12:44:41 +0300
changeset 4275 4c3444f1b9d8
parent 4274 02ccf52bf1ba
child 4277 9b3f8c82d5c0
child 4383 0ca32411c666
6621569: Win32ShellFolder2 and Win32ShellFolderManager2 may leak native resources Reviewed-by: malenkov
jdk/src/windows/classes/sun/awt/shell/Win32ShellFolder2.java
jdk/src/windows/classes/sun/awt/shell/Win32ShellFolderManager2.java
--- 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)