在 2025-12-29 01:35, Pali Rohár 写道:
--- mingw-w64-crt/Makefile.am | 1 + mingw-w64-crt/lib-common/msvcrt.def.in | 2 +- mingw-w64-crt/misc/_mktime32.c | 29 ++++++++++++++++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 mingw-w64-crt/misc/_mktime32.cdiff --git a/mingw-w64-crt/Makefile.am b/mingw-w64-crt/Makefile.am index d9578c909253..1e6d344bd40a 100644 --- a/mingw-w64-crt/Makefile.am +++ b/mingw-w64-crt/Makefile.am @@ -673,6 +673,7 @@ src_msvcrt64=\ misc/_initterm_e.c \ misc/_localtime32.c \ misc/_mkgmtime32.c \ + misc/_mktime32.c \ misc/_set_doserrno.c \ misc/_set_fmode.c \ misc/output_format.c \ diff --git a/mingw-w64-crt/lib-common/msvcrt.def.in b/mingw-w64-crt/lib-common/msvcrt.def.in index 1e7eda60a510..9caf981ac30c 100644 --- a/mingw-w64-crt/lib-common/msvcrt.def.in +++ b/mingw-w64-crt/lib-common/msvcrt.def.in @@ -1597,7 +1597,7 @@ _mbstrnlen _memicmp_l F_ARM_ANY(_mkgmtime32) ; i386 and x64 _mkgmtime32 replaced by emu F_ARM_ANY(_mktemp_s) ; i386 and x64 _mktemp_s replaced by emu -_mktime32 F_I386(== mktime) ; i386 _mktime32 replaced by alias +F_NON_X64(_mktime32 F_I386(== mktime)) ; i386 _mktime32 replaced by alias and x64 _mktime32 replaced by emu F_NON_I386(_msize_dbg) F_I386(_msize_debug) _printf_l diff --git a/mingw-w64-crt/misc/_mktime32.c b/mingw-w64-crt/misc/_mktime32.c new file mode 100644 index 000000000000..7b9ef1b73f8d --- /dev/null +++ b/mingw-w64-crt/misc/_mktime32.c @@ -0,0 +1,29 @@ +/** + * This file has no copyright assigned and is placed in the Public Domain. + * This file is part of the mingw-w64 runtime package. + * No warranty is given; refer to the file DISCLAIMER.PD within this package. + */ + +#include <time.h> +#include <stdint.h> +#include <errno.h> + +static __time32_t __cdecl emu__mktime32(struct tm *tmptr) +{ + struct tm tmbuf = *tmptr; + __time64_t time64 = _mktime64(&tmbuf); + if (time64 == -1) + return -1; + if (time64 < 0 || time64 > INT32_MAX) { + errno = EINVAL; + return -1; + }
POSIX says errno in this case should be `EOVERFLOW`.Besides, I don't see why `time64 < 0` should make any sense -- if `_mktime64()` ever returns a negative value such as -86400 then the value should be forwarded, and if `_mktime64()` fails in that case it would return -1. So this could be just
if (time64 < INT32_MIN || time64 > INT32_MAX) {
errno = EOVERFLOW;
return -1;
}
--
Best regards,
LIU Hao
OpenPGP_signature.asc
Description: OpenPGP digital signature
_______________________________________________ Mingw-w64-public mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/mingw-w64-public
