[filesystem] resize_file_api leaks a HANDLE
... when SetFilePointerEx or SetEndOfFile fails. BOOL resize_file_api(const wchar_t* p, boost::uintmax_t size) { HANDLE handle = CreateFileW(p, GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); LARGE_INTEGER sz; sz.QuadPart = size; return handle != INVALID_HANDLE_VALUE && ::SetFilePointerEx(handle, sz, 0, FILE_BEGIN) && ::SetEndOfFile(handle) && ::CloseHandle(handle); }
On Tue, Dec 30, 2014 at 8:40 AM, Peter Dimov
... when SetFilePointerEx or SetEndOfFile fails.
BOOL resize_file_api(const wchar_t* p, boost::uintmax_t size) { HANDLE handle = CreateFileW(p, GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); LARGE_INTEGER sz; sz.QuadPart = size; return handle != INVALID_HANDLE_VALUE && ::SetFilePointerEx(handle, sz, 0, FILE_BEGIN) && ::SetEndOfFile(handle) && ::CloseHandle(handle); }
That's ticket #6945. Fixed in develop by applying patch from Kaylyn Bogle. Fix should ship with 1.58.0 Thanks, --Beman
On 30 Dec 2014 at 15:40, Peter Dimov wrote:
... when SetFilePointerEx or SetEndOfFile fails.
BOOL resize_file_api(const wchar_t* p, boost::uintmax_t size) { HANDLE handle = CreateFileW(p, GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); LARGE_INTEGER sz; sz.QuadPart = size; return handle != INVALID_HANDLE_VALUE && ::SetFilePointerEx(handle, sz, 0, FILE_BEGIN) && ::SetEndOfFile(handle) && ::CloseHandle(handle); }
Additionally, that code is racy. Better is this: // WinVista and later have the SetFileInformationByHandle() function, but for WinXP // compatibility we use the kernel syscall directly static inline bool wintruncate(HANDLE h, off_t newsize) { windows_nt_kernel::init(); using namespace windows_nt_kernel; IO_STATUS_BLOCK isb={ 0 }; BOOST_AFIO_ERRHNT(NtSetInformationFile(h, &isb, &newsize, sizeof(newsize), FileEndOfFileInformation)); return true; } Niall -- ned Productions Limited Consulting http://www.nedproductions.biz/ http://ie.linkedin.com/in/nialldouglas/
participants (3)
-
Beman Dawes
-
Niall Douglas
-
Peter Dimov