From ba0eb22c8beb1166780d7c7e11ef4e623b8017e9 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Tue, 1 Mar 2022 13:13:42 +0000 Subject: [PATCH] Fix a typo in the previous delta to bfdio.c. PR 25713 * bfdio.c (_bfd_real_fopen): Fix typo. --- bfd/ChangeLog | 9 ++++++++- bfd/bfdio.c | 42 ++++++++++++++++++++++-------------------- 2 files changed, 30 insertions(+), 21 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 843bdc8d8a1..4925fffaa15 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2022-03-01 Torbjörn Svensson + Fred Eisele + + PR 25713 + * bfdio.c (_bfd_real_fopen): Fix typo. + 2022-03-01 Nick Clifton PR 28848 @@ -6,9 +12,10 @@ TAG_FP_arch set then reset the TAG_ABI_HardFP_use. 2022-02-28 Torbjörn Svensson + Fred Eisele PR 25713 - * bfdio.c (_bfd_real_fopen): Fix handling of parhs longer than 260 + * bfdio.c (_bfd_real_fopen): Fix handling of paths longer than 260 characters on Windows hosts. 2022-02-28 Nick Clifton diff --git a/bfd/bfdio.c b/bfd/bfdio.c index 82310ffabc1..5c9a6555894 100644 --- a/bfd/bfdio.c +++ b/bfd/bfdio.c @@ -116,45 +116,47 @@ _bfd_real_fopen (const char *filename, const char *modes) } #elif defined (_WIN32) - /* PR 25713: Handle extra long path names possibly containing '..' and '.'. */ - - wchar_t **lpFilePart = {NULL}; - const wchar_t prefix[] = L"\\\\?\\"; - const wchar_t ccs[] = L", ccs=UNICODE"; - const size_t partPathLen = strlen(filename) + 1; + /* PR 25713: Handle extra long path names possibly containing '..' and '.'. */ + wchar_t ** lpFilePart = {NULL}; + const wchar_t prefix[] = L"\\\\?\\"; + const wchar_t ccs[] = L", ccs=UNICODE"; + const size_t partPathLen = strlen (filename) + 1; /* Converting the partial path from ascii to unicode. - 1) get the length: Calling with lpWideCharStr set to null returns the length. - 2) convert the string: Calling with cbMultiByte set to -1 includes the terminating null. */ - size_t partPathWSize = MultiByteToWideChar (CP_UTF8, 0, partPathOrig, -1, NULL, 0); - wchar_t *partPath = calloc (partPathWSize, sizeof(wchar_t)); + 1) Get the length: Calling with lpWideCharStr set to null returns the length. + 2) Convert the string: Calling with cbMultiByte set to -1 includes the terminating null. */ + size_t partPathWSize = MultiByteToWideChar (CP_UTF8, 0, filename, -1, NULL, 0); + wchar_t * partPath = calloc (partPathWSize, sizeof(wchar_t)); + size_t ix; - MultiByteToWideChar (CP_UTF8, 0, partPathOrig, -1, partPath, partPathWSize); + MultiByteToWideChar (CP_UTF8, 0, filename, -1, partPath, partPathWSize); /* Convert any UNIX style path separators into the DOS i.e. backslash separator. */ - size_t ix; for (ix = 0; ix < partPathLen; ix++) if (IS_UNIX_DIR_SEPARATOR(filename[ix])) partPath[ix] = '\\'; /* Getting the full path from the provided partial path. - 1) get the length: - 2) resolve the path. */ - long fullPathWSize = GetFullPathNameW (partPath, 0, NULL, lpFilePart); - wchar_t *fullPath = calloc (fullPathWSize + sizeof(prefix) + 1, sizeof(wchar_t)); + 1) Get the length. + 2) Resolve the path. */ + long fullPathWSize = GetFullPathNameW (partPath, 0, NULL, lpFilePart); + wchar_t * fullPath = calloc (fullPathWSize + sizeof(prefix) + 1, sizeof(wchar_t)); wcscpy (fullPath, prefix); - int prefixLen = sizeof(prefix) / sizeof(wchar_t); - wchar_t* fullPathOffset = fullPath + prefixLen - 1; + + int prefixLen = sizeof(prefix) / sizeof(wchar_t); + wchar_t * fullPathOffset = fullPath + prefixLen - 1; + GetFullPathNameW (partPath, fullPathWSize, fullPathOffset, lpFilePart); free (partPath); /* It is non-standard for modes to exceed 16 characters. */ - wchar_t modesW[16 + sizeof(ccs)]; + wchar_t modesW[16 + sizeof(ccs)]; + MultiByteToWideChar (CP_UTF8, 0, modes, -1, modesW, sizeof(modesW)); wcscat (modesW, ccs); - FILE* file = _wfopen (fullPath, mdesW); + FILE * file = _wfopen (fullPath, modesW); free (fullPath); return close_on_exec (file); -- 2.30.2