# HG changeset patch # User igerasim # Date 1531871964 25200 # Tue Jul 17 16:59:24 2018 -0700 # Node ID caa09a0df5939f86d59da590c114d741d985d5db # Parent 54106907e72ecea61b982f33875b4e90cec11c56 imported patch 8207750-Handle-leak-in-java_io_WinNTFileSystem_list diff --git a/src/java.base/windows/native/libjava/WinNTFileSystem_md.c b/src/java.base/windows/native/libjava/WinNTFileSystem_md.c --- a/src/java.base/windows/native/libjava/WinNTFileSystem_md.c +++ b/src/java.base/windows/native/libjava/WinNTFileSystem_md.c @@ -639,6 +639,7 @@ jstring name; jclass str_class; WCHAR *pathbuf; + DWORD err; str_class = JNU_ClassString(env); CHECK_NULL_RETURN(str_class, NULL); @@ -700,8 +701,10 @@ len = 0; maxlen = 16; rv = (*env)->NewObjectArray(env, maxlen, str_class, NULL); - if (rv == NULL) // Couldn't allocate an array + if (rv == NULL) { // Couldn't allocate an array + FindClose(handle); return NULL; + } /* Scan the directory */ do { if (!wcscmp(find_data.cFileName, L".") @@ -709,13 +712,17 @@ continue; name = (*env)->NewString(env, find_data.cFileName, (jsize)wcslen(find_data.cFileName)); - if (name == NULL) - return NULL; // error; + if (name == NULL) { + FindClose(handle); + return NULL; // error + } if (len == maxlen) { old = rv; rv = (*env)->NewObjectArray(env, maxlen <<= 1, str_class, NULL); - if (rv == NULL || JNU_CopyObjectArray(env, rv, old, len) < 0) + if (rv == NULL || JNU_CopyObjectArray(env, rv, old, len) < 0) { + FindClose(handle); return NULL; // error + } (*env)->DeleteLocalRef(env, old); } (*env)->SetObjectArrayElement(env, rv, len++, name); @@ -723,9 +730,11 @@ } while (FindNextFileW(handle, &find_data)); - if (GetLastError() != ERROR_NO_MORE_FILES) + err = GetLastError(); + FindClose(handle); + if (err != ERROR_NO_MORE_FILES) { return NULL; // error - FindClose(handle); + } if (len < maxlen) { /* Copy the final results into an appropriately-sized array */