mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-28 15:24:43 +02:00
8207750: Native handle leak in java.io.WinNTFileSystem.list()
Reviewed-by: bpb
This commit is contained in:
parent
01fd04b862
commit
b30fe07450
1 changed files with 15 additions and 6 deletions
|
@ -639,6 +639,7 @@ Java_java_io_WinNTFileSystem_list(JNIEnv *env, jobject this, jobject file)
|
|||
jstring name;
|
||||
jclass str_class;
|
||||
WCHAR *pathbuf;
|
||||
DWORD err;
|
||||
|
||||
str_class = JNU_ClassString(env);
|
||||
CHECK_NULL_RETURN(str_class, NULL);
|
||||
|
@ -700,8 +701,10 @@ Java_java_io_WinNTFileSystem_list(JNIEnv *env, jobject this, jobject file)
|
|||
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 @@ Java_java_io_WinNTFileSystem_list(JNIEnv *env, jobject this, jobject file)
|
|||
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 @@ Java_java_io_WinNTFileSystem_list(JNIEnv *env, jobject this, jobject file)
|
|||
|
||||
} while (FindNextFileW(handle, &find_data));
|
||||
|
||||
if (GetLastError() != ERROR_NO_MORE_FILES)
|
||||
return NULL; // error
|
||||
err = GetLastError();
|
||||
FindClose(handle);
|
||||
if (err != ERROR_NO_MORE_FILES) {
|
||||
return NULL; // error
|
||||
}
|
||||
|
||||
if (len < maxlen) {
|
||||
/* Copy the final results into an appropriately-sized array */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue