# HG changeset patch # User jwe # Date 1181022610 0 # Node ID c6ee6c342699284486d9290d5c8210f09cb477fc # Parent fd242dccd22151f98e5a4fd221f1805003a6ddd6 [project @ 2007-06-05 05:50:10 by jwe] diff --git a/src/ChangeLog b/src/ChangeLog --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2007-06-05 John W. Eaton + + * sysdep.cc (same_file_internal) [OCTAVE_USE_WINDOWS_API]: + Avoid leaking file handles. + 2007-05-08 Michael Weitzel * DLD-FUNCTIONS/symrcm.cc: Fix for queuing error that might cause diff --git a/src/sysdep.cc b/src/sysdep.cc --- a/src/sysdep.cc +++ b/src/sysdep.cc @@ -232,47 +232,38 @@ { #ifdef OCTAVE_USE_WINDOWS_API + bool retval = false; + // Windows native code // Reference: http://msdn2.microsoft.com/en-us/library/aa363788.aspx - HANDLE hfile1; - HANDLE hfile2; - - BY_HANDLE_FILE_INFORMATION hfi1; - BY_HANDLE_FILE_INFORMATION hfi2; - - hfile1 = CreateFile (file1.c_str (), 0, FILE_SHARE_READ, 0, - OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); + HANDLE hfile1 = CreateFile (file1.c_str (), 0, FILE_SHARE_READ, 0, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); + + if (hfile1 != INVALID_HANDLE_VALUE) + { + HANDLE hfile2 = CreateFile (file2.c_str (), 0, FILE_SHARE_READ, 0, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); - if (hfile1 == INVALID_HANDLE_VALUE) - return false; + if (hfile2 != INVALID_HANDLE_VALUE) + { + BY_HANDLE_FILE_INFORMATION hfi1; + BY_HANDLE_FILE_INFORMATION hfi2; + + if (GetFileInformationByHandle (hfile1, &hfi1) + && GetFileInformationByHandle (hfile2, &hfi2)) - hfile2 = CreateFile (file2.c_str (), 0, FILE_SHARE_READ, 0, - OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); + retval = (hfi1.dwVolumeSerialNumber == hfi2.dwVolumeSerialNumber + && hfi1.nFileIndexHigh == hfi2.nFileIndexHigh + && hfi1.nFileIndexLow == hfi2.nFileIndexLow); - if (hfile2 == INVALID_HANDLE_VALUE) - { + CloseHandle (hfile2); + } + CloseHandle (hfile1); - return false; } - - if (! GetFileInformationByHandle (hfile1, &hfi1)) - { - CloseHandle (hfile1); - CloseHandle (hfile2); - return false; - } - - if (! GetFileInformationByHandle (hfile2, &hfi2)) - { - CloseHandle (hfile1); - CloseHandle (hfile2); - return false; - } - - return (hfi1.dwVolumeSerialNumber == hfi2.dwVolumeSerialNumber - && hfi1.nFileIndexHigh == hfi2.nFileIndexHigh - && hfi1.nFileIndexLow == hfi2.nFileIndexLow); + + return retval; #else