< prev index next >

src/java.base/windows/native/libjava/WinNTFileSystem_md.c

Print this page
rev 51109 : imported patch 8207750-Handle-leak-in-java_io_WinNTFileSystem_list


 622     }
 623     if (removeFileOrDirectory(pathbuf) == 0) {
 624         rv = JNI_TRUE;
 625     }
 626     free(pathbuf);
 627     return rv;
 628 }
 629 
 630 JNIEXPORT jobjectArray JNICALL
 631 Java_java_io_WinNTFileSystem_list(JNIEnv *env, jobject this, jobject file)
 632 {
 633     WCHAR *search_path;
 634     HANDLE handle;
 635     WIN32_FIND_DATAW find_data;
 636     int len, maxlen;
 637     jobjectArray rv, old;
 638     DWORD fattr;
 639     jstring name;
 640     jclass str_class;
 641     WCHAR *pathbuf;

 642 
 643     str_class = JNU_ClassString(env);
 644     CHECK_NULL_RETURN(str_class, NULL);
 645 
 646     pathbuf = fileToNTPath(env, file, ids.path);
 647     if (pathbuf == NULL)
 648         return NULL;
 649     search_path = (WCHAR*)malloc(2*wcslen(pathbuf) + 6);
 650     if (search_path == 0) {
 651         free (pathbuf);
 652         errno = ENOMEM;
 653         JNU_ThrowOutOfMemoryError(env, "native memory allocation failed");
 654         return NULL;
 655     }
 656     wcscpy(search_path, pathbuf);
 657     free(pathbuf);
 658     fattr = GetFileAttributesW(search_path);
 659     if (fattr == INVALID_FILE_ATTRIBUTES) {
 660         free(search_path);
 661         return NULL;


 683     }
 684 
 685     /* Open handle to the first file */
 686     handle = FindFirstFileW(search_path, &find_data);
 687     free(search_path);
 688     if (handle == INVALID_HANDLE_VALUE) {
 689         if (GetLastError() != ERROR_FILE_NOT_FOUND) {
 690             // error
 691             return NULL;
 692         } else {
 693             // No files found - return an empty array
 694             rv = (*env)->NewObjectArray(env, 0, str_class, NULL);
 695             return rv;
 696         }
 697     }
 698 
 699     /* Allocate an initial String array */
 700     len = 0;
 701     maxlen = 16;
 702     rv = (*env)->NewObjectArray(env, maxlen, str_class, NULL);
 703     if (rv == NULL) // Couldn't allocate an array

 704         return NULL;

 705     /* Scan the directory */
 706     do {
 707         if (!wcscmp(find_data.cFileName, L".")
 708                                 || !wcscmp(find_data.cFileName, L".."))
 709            continue;
 710         name = (*env)->NewString(env, find_data.cFileName,
 711                                  (jsize)wcslen(find_data.cFileName));
 712         if (name == NULL)
 713             return NULL; // error;


 714         if (len == maxlen) {
 715             old = rv;
 716             rv = (*env)->NewObjectArray(env, maxlen <<= 1, str_class, NULL);
 717             if (rv == NULL || JNU_CopyObjectArray(env, rv, old, len) < 0)

 718                 return NULL; // error

 719             (*env)->DeleteLocalRef(env, old);
 720         }
 721         (*env)->SetObjectArrayElement(env, rv, len++, name);
 722         (*env)->DeleteLocalRef(env, name);
 723 
 724     } while (FindNextFileW(handle, &find_data));
 725 
 726     if (GetLastError() != ERROR_NO_MORE_FILES)
 727         return NULL; // error
 728     FindClose(handle);



 729 
 730     if (len < maxlen) {
 731         /* Copy the final results into an appropriately-sized array */
 732         old = rv;
 733         rv = (*env)->NewObjectArray(env, len, str_class, NULL);
 734         if (rv == NULL)
 735             return NULL; /* error */
 736         if (JNU_CopyObjectArray(env, rv, old, len) < 0)
 737             return NULL; /* error */
 738     }
 739     return rv;
 740 }
 741 
 742 
 743 JNIEXPORT jboolean JNICALL
 744 Java_java_io_WinNTFileSystem_createDirectory(JNIEnv *env, jobject this,
 745                                              jobject file)
 746 {
 747     BOOL h = FALSE;
 748     WCHAR *pathbuf = fileToNTPath(env, file, ids.path);




 622     }
 623     if (removeFileOrDirectory(pathbuf) == 0) {
 624         rv = JNI_TRUE;
 625     }
 626     free(pathbuf);
 627     return rv;
 628 }
 629 
 630 JNIEXPORT jobjectArray JNICALL
 631 Java_java_io_WinNTFileSystem_list(JNIEnv *env, jobject this, jobject file)
 632 {
 633     WCHAR *search_path;
 634     HANDLE handle;
 635     WIN32_FIND_DATAW find_data;
 636     int len, maxlen;
 637     jobjectArray rv, old;
 638     DWORD fattr;
 639     jstring name;
 640     jclass str_class;
 641     WCHAR *pathbuf;
 642     DWORD err;
 643 
 644     str_class = JNU_ClassString(env);
 645     CHECK_NULL_RETURN(str_class, NULL);
 646 
 647     pathbuf = fileToNTPath(env, file, ids.path);
 648     if (pathbuf == NULL)
 649         return NULL;
 650     search_path = (WCHAR*)malloc(2*wcslen(pathbuf) + 6);
 651     if (search_path == 0) {
 652         free (pathbuf);
 653         errno = ENOMEM;
 654         JNU_ThrowOutOfMemoryError(env, "native memory allocation failed");
 655         return NULL;
 656     }
 657     wcscpy(search_path, pathbuf);
 658     free(pathbuf);
 659     fattr = GetFileAttributesW(search_path);
 660     if (fattr == INVALID_FILE_ATTRIBUTES) {
 661         free(search_path);
 662         return NULL;


 684     }
 685 
 686     /* Open handle to the first file */
 687     handle = FindFirstFileW(search_path, &find_data);
 688     free(search_path);
 689     if (handle == INVALID_HANDLE_VALUE) {
 690         if (GetLastError() != ERROR_FILE_NOT_FOUND) {
 691             // error
 692             return NULL;
 693         } else {
 694             // No files found - return an empty array
 695             rv = (*env)->NewObjectArray(env, 0, str_class, NULL);
 696             return rv;
 697         }
 698     }
 699 
 700     /* Allocate an initial String array */
 701     len = 0;
 702     maxlen = 16;
 703     rv = (*env)->NewObjectArray(env, maxlen, str_class, NULL);
 704     if (rv == NULL) { // Couldn't allocate an array
 705         FindClose(handle);
 706         return NULL;
 707     }
 708     /* Scan the directory */
 709     do {
 710         if (!wcscmp(find_data.cFileName, L".")
 711                                 || !wcscmp(find_data.cFileName, L".."))
 712            continue;
 713         name = (*env)->NewString(env, find_data.cFileName,
 714                                  (jsize)wcslen(find_data.cFileName));
 715         if (name == NULL) {
 716             FindClose(handle);
 717             return NULL; // error
 718         }
 719         if (len == maxlen) {
 720             old = rv;
 721             rv = (*env)->NewObjectArray(env, maxlen <<= 1, str_class, NULL);
 722             if (rv == NULL || JNU_CopyObjectArray(env, rv, old, len) < 0) {
 723                 FindClose(handle);
 724                 return NULL; // error
 725             }
 726             (*env)->DeleteLocalRef(env, old);
 727         }
 728         (*env)->SetObjectArrayElement(env, rv, len++, name);
 729         (*env)->DeleteLocalRef(env, name);
 730 
 731     } while (FindNextFileW(handle, &find_data));
 732 
 733     err = GetLastError();

 734     FindClose(handle);
 735     if (err != ERROR_NO_MORE_FILES) {
 736         return NULL; // error
 737     }
 738 
 739     if (len < maxlen) {
 740         /* Copy the final results into an appropriately-sized array */
 741         old = rv;
 742         rv = (*env)->NewObjectArray(env, len, str_class, NULL);
 743         if (rv == NULL)
 744             return NULL; /* error */
 745         if (JNU_CopyObjectArray(env, rv, old, len) < 0)
 746             return NULL; /* error */
 747     }
 748     return rv;
 749 }
 750 
 751 
 752 JNIEXPORT jboolean JNICALL
 753 Java_java_io_WinNTFileSystem_createDirectory(JNIEnv *env, jobject this,
 754                                              jobject file)
 755 {
 756     BOOL h = FALSE;
 757     WCHAR *pathbuf = fileToNTPath(env, file, ids.path);


< prev index next >