Bug #76670 | GetLastError() should be called just after FindNextFile() at os0file.cc | ||
---|---|---|---|
Submitted: | 13 Apr 2015 4:16 | Modified: | 14 Apr 2015 9:41 |
Reporter: | Yasufumi Kinoshita | Email Updates: | |
Status: | Verified | Impact on me: | |
Category: | MySQL Server: InnoDB storage engine | Severity: | S3 (Non-critical) |
Version: | 5.6.23 | OS: | Windows |
Assigned to: | CPU Architecture: | Any |
[13 Apr 2015 4:16]
Yasufumi Kinoshita
[14 Apr 2015 9:35]
Mattias Jonsson
Looks like we could use the stack instead of a malloc to fix this issue: diff --git a/storage/innobase/os/os0file.cc b/storage/innobase/os/os0file.cc index fb7e8ca..ce2c103 100644 --- a/storage/innobase/os/os0file.cc +++ b/storage/innobase/os/os0file.cc @@ -892,31 +892,29 @@ os_file_readdir_next_file( os_file_stat_t* info) /*!< in/out: buffer where the info is returned * { #ifdef __WIN__ - LPWIN32_FIND_DATA lpFindFileData; + WIN32_FIND_DATA FindFileData; BOOL ret; - lpFindFileData = static_cast<LPWIN32_FIND_DATA>( - ut_malloc(sizeof(WIN32_FIND_DATA))); next_file: - ret = FindNextFile(dir, lpFindFileData); + ret = FindNextFile(dir, &FindFileData); if (ret) { - ut_a(strlen((char*) lpFindFileData->cFileName) + ut_a(strlen((char*) FindFileData.cFileName) < OS_FILE_MAX_PATH); - if (strcmp((char*) lpFindFileData->cFileName, ".") == 0 - || strcmp((char*) lpFindFileData->cFileName, "..") == 0) { + if (strcmp((char*) FindFileData.cFileName, ".") == 0 + || strcmp((char*) FindFileData.cFileName, "..") == 0) { goto next_file; } - strcpy(info->name, (char*) lpFindFileData->cFileName); + strcpy(info->name, (char*) FindFileData.cFileName); - info->size = (ib_int64_t)(lpFindFileData->nFileSizeLow) - + (((ib_int64_t)(lpFindFileData->nFileSizeHigh)) + info->size = (ib_int64_t)(FindFileData.nFileSizeLow) + + (((ib_int64_t)(FindFileData.nFileSizeHigh)) << 32); - if (lpFindFileData->dwFileAttributes + if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) { /* TODO: test Windows symlinks */ /* TODO: MySQL has apparently its own symlink @@ -924,7 +922,7 @@ next_file: redirect a database directory: REFMAN "windows-symbolic-links.html" */ info->type = OS_FILE_TYPE_LINK; - } else if (lpFindFileData->dwFileAttributes + } else if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { info->type = OS_FILE_TYPE_DIR; } else { @@ -936,8 +934,6 @@ next_file: } } - ut_free(lpFindFileData); - if (ret) { return(0); } else if (GetLastError() == ERROR_NO_MORE_FILES) {
[14 Apr 2015 9:41]
MySQL Verification Team
Hello Yasufumi, Thank you for the report, and Mattias for the quick patch. Verifying based on internal discussion with Mattias, and code inspection. Thanks, Umesh
[14 Apr 2015 13:40]
Mattias Jonsson
This is already fixed in 5.7, so it needs to be back ported to 5.6.