These functions are nativelly available since msvcr80.dll and are available
also in 64-bit versions of OS system msvcrt.dll library.
So do not include these functions into libmingwex.a library, but only into
explicit CRT import libraries for older than msvcr80.dll. This allows to
use native versions of those functions from UCRT or 64-bit msvcrt.dll.
UCRT and msvcrt implementation do not touch output buffer on the failure.
So remove explicit clear of the output buffer from mingw-w64 emulation.
Replace strncpy by memcpy and hardcoded number 260 by appropriate sizeof()
call, and add _Static_assert() check to ensure that memcpy call does not
overflow.
Add missing import symbols via __MINGW_IMP_SYMBOL macro.
---
mingw-w64-crt/Makefile.am | 14 +++++++++++++-
mingw-w64-crt/stdio/_findfirst64i32.c | 10 ++++------
mingw-w64-crt/stdio/_findnext64i32.c | 14 ++++++--------
mingw-w64-crt/stdio/_wfindfirst64i32.c | 10 ++++------
mingw-w64-crt/stdio/_wfindnext64i32.c | 14 ++++++--------
5 files changed, 33 insertions(+), 29 deletions(-)
diff --git a/mingw-w64-crt/Makefile.am b/mingw-w64-crt/Makefile.am
index de45a2591cdc..9714b855810d 100644
--- a/mingw-w64-crt/Makefile.am
+++ b/mingw-w64-crt/Makefile.am
@@ -607,7 +607,9 @@ src_msvcrt32=\
misc/wcstoumax.c \
secapi/wcstok_s.c \
stdio/_findfirst64.c \
+ stdio/_findfirst64i32.c \
stdio/_findnext64.c \
+ stdio/_findnext64i32.c \
stdio/_fseeki64.c \
stdio/_fstat64.c \
stdio/_fstat64i32.c \
@@ -618,7 +620,9 @@ src_msvcrt32=\
stdio/_vscprintf.c \
stdio/_vscwprintf.c \
stdio/_wfindfirst64.c \
+ stdio/_wfindfirst64i32.c \
stdio/_wfindnext64.c \
+ stdio/_wfindnext64i32.c \
stdio/_wstat64.c \
stdio/_wstat64i32.c \
string/msvcr80pre_wcstok.c
@@ -709,9 +713,13 @@ src_msvcrtarm32=\
misc/__initenv.c \
misc/__winitenv.c \
secapi/msvcrt_arm_wcstok_s.c \
+ stdio/_findfirst64i32.c \
+ stdio/_findnext64i32.c \
stdio/_fstat64i32.c \
stdio/_setmaxstdio.c \
stdio/_stat64i32.c \
+ stdio/_wfindfirst64i32.c \
+ stdio/_wfindnext64i32.c \
stdio/_wstat64i32.c \
stdio/gets.c \
stdio/scanf.S \
@@ -968,10 +976,14 @@ src_pre_msvcr80=\
misc/wcsnlen.c \
secapi/getenv_s.c \
secapi/wcstok_s.c \
+ stdio/_findfirst64i32.c \
+ stdio/_findnext64i32.c \
stdio/_fseeki64.c \
stdio/_fstat64i32.c \
stdio/_ftelli64.c \
stdio/_stat64i32.c \
+ stdio/_wfindfirst64i32.c \
+ stdio/_wfindnext64i32.c \
stdio/_wstat64i32.c \
stdio/mingw_lock.c \
stdio/msvcr80pre_ftruncate64.c \
@@ -1216,7 +1228,7 @@ src_libmingwex=\
ssp/stpcpy_chk.c ssp/strcpy_chk.c ssp/strncat_chk.c
ssp/strncpy_chk.c \
\
stdio/strtok_r.c \
- stdio/_Exit.c stdio/_findfirst64i32.c stdio/_findnext64i32.c
stdio/_wfindfirst64i32.c stdio/_wfindnext64i32.c \
+ stdio/_Exit.c \
stdio/asprintf.c \
stdio/mingw_ftruncate64.c stdio/lltoa.c stdio/lltow.c \
stdio/__mingw_fix_stat.h stdio/__mingw_fix_stat_finish.c \
diff --git a/mingw-w64-crt/stdio/_findfirst64i32.c
b/mingw-w64-crt/stdio/_findfirst64i32.c
index 020ecee6a659..8871469a97e5 100644
--- a/mingw-w64-crt/stdio/_findfirst64i32.c
+++ b/mingw-w64-crt/stdio/_findfirst64i32.c
@@ -1,4 +1,3 @@
-#define __CRT__NO_INLINE
#include <io.h>
#include <string.h>
@@ -6,16 +5,15 @@ intptr_t __cdecl _findfirst64i32(const char *_Filename,struct
_finddata64i32_t *
{
struct __finddata64_t fd;
intptr_t ret = _findfirst64(_Filename,&fd);
- if (ret == -1) {
- *_FindData = (struct _finddata64i32_t){0};
+ if (ret == -1)
return -1;
- }
_FindData->attrib=fd.attrib;
_FindData->time_create=fd.time_create;
_FindData->time_access=fd.time_access;
_FindData->time_write=fd.time_write;
_FindData->size=(_fsize_t) fd.size;
- strncpy(_FindData->name,fd.name,260);
+ _Static_assert(sizeof(_FindData->name) == sizeof(fd.name), "mismatch size of
_FindData->name and fd.name");
+ memcpy(_FindData->name,fd.name,sizeof(_FindData->name));
return ret;
}
-
+intptr_t (__cdecl *__MINGW_IMP_SYMBOL(_findfirst64i32))(const char *, struct
_finddata64i32_t *) = _findfirst64i32;
diff --git a/mingw-w64-crt/stdio/_findnext64i32.c
b/mingw-w64-crt/stdio/_findnext64i32.c
index e756846b928f..95257fe7d823 100644
--- a/mingw-w64-crt/stdio/_findnext64i32.c
+++ b/mingw-w64-crt/stdio/_findnext64i32.c
@@ -1,4 +1,3 @@
-#define __CRT__NO_INLINE
#include <io.h>
#include <string.h>
@@ -6,16 +5,15 @@ int __cdecl _findnext64i32(intptr_t _FindHandle,struct
_finddata64i32_t *_FindDa
{
struct __finddata64_t fd;
int ret = _findnext64(_FindHandle,&fd);
- if (ret == -1) {
- *_FindData = (struct _finddata64i32_t){0};
- return -1;
- }
+ if (ret != 0)
+ return ret;
_FindData->attrib=fd.attrib;
_FindData->time_create=fd.time_create;
_FindData->time_access=fd.time_access;
_FindData->time_write=fd.time_write;
_FindData->size=(_fsize_t) fd.size;
- strncpy(_FindData->name,fd.name,260);
- return ret;
+ _Static_assert(sizeof(_FindData->name) == sizeof(fd.name), "mismatch size of
_FindData->name and fd.name");
+ memcpy(_FindData->name,fd.name,sizeof(_FindData->name));
+ return 0;
}
-
+int (__cdecl *__MINGW_IMP_SYMBOL(_findnext64i32))(intptr_t, struct
_finddata64i32_t *) = _findnext64i32;
diff --git a/mingw-w64-crt/stdio/_wfindfirst64i32.c
b/mingw-w64-crt/stdio/_wfindfirst64i32.c
index 6cfe849f39ff..d459fb63945f 100644
--- a/mingw-w64-crt/stdio/_wfindfirst64i32.c
+++ b/mingw-w64-crt/stdio/_wfindfirst64i32.c
@@ -1,4 +1,3 @@
-#define __CRT__NO_INLINE
#include <io.h>
#include <string.h>
@@ -6,16 +5,15 @@ intptr_t __cdecl _wfindfirst64i32(const wchar_t
*_Filename,struct _wfinddata64i3
{
struct _wfinddata64_t fd;
intptr_t ret = _wfindfirst64(_Filename,&fd);
- if (ret == -1) {
- *_FindData = (struct _wfinddata64i32_t){0};
+ if (ret == -1)
return -1;
- }
_FindData->attrib=fd.attrib;
_FindData->time_create=fd.time_create;
_FindData->time_access=fd.time_access;
_FindData->time_write=fd.time_write;
_FindData->size=(_fsize_t) fd.size;
- memcpy(_FindData->name,fd.name,260*sizeof(wchar_t));
+ _Static_assert(sizeof(_FindData->name) == sizeof(fd.name), "mismatch size of
_FindData->name and fd.name");
+ memcpy(_FindData->name,fd.name,sizeof(_FindData->name));
return ret;
}
-
+intptr_t (__cdecl *__MINGW_IMP_SYMBOL(_wfindfirst64i32))(const wchar_t *,
struct _wfinddata64i32_t *) = _wfindfirst64i32;
diff --git a/mingw-w64-crt/stdio/_wfindnext64i32.c
b/mingw-w64-crt/stdio/_wfindnext64i32.c
index 9753916ea5fe..fefbcaf09099 100644
--- a/mingw-w64-crt/stdio/_wfindnext64i32.c
+++ b/mingw-w64-crt/stdio/_wfindnext64i32.c
@@ -1,4 +1,3 @@
-#define __CRT__NO_INLINE
#include <io.h>
#include <string.h>
@@ -6,16 +5,15 @@ int __cdecl _wfindnext64i32(intptr_t _FindHandle,struct
_wfinddata64i32_t *_Find
{
struct _wfinddata64_t fd;
int ret = _wfindnext64(_FindHandle,&fd);
- if (ret == -1) {
- *_FindData = (struct _wfinddata64i32_t){0};
- return -1;
- }
+ if (ret != 0)
+ return ret;
_FindData->attrib=fd.attrib;
_FindData->time_create=fd.time_create;
_FindData->time_access=fd.time_access;
_FindData->time_write=fd.time_write;
_FindData->size=(_fsize_t) fd.size;
- memcpy(_FindData->name,fd.name,260*sizeof(wchar_t));
- return ret;
+ _Static_assert(sizeof(_FindData->name) == sizeof(fd.name), "mismatch size of
_FindData->name and fd.name");
+ memcpy(_FindData->name,fd.name,sizeof(_FindData->name));
+ return 0;
}
-
+int (__cdecl *__MINGW_IMP_SYMBOL(_wfindnext64i32))(intptr_t, struct
_wfinddata64i32_t *) = _wfindnext64i32;
--
2.20.1
_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public