msvcrt *stat32* functions do not work for time before year 1970.
Add similar underflow checks into mingw-w64 emulations.
---
 mingw-w64-crt/stdio/_fstat32i64.c | 6 +++---
 mingw-w64-crt/stdio/_stat32i64.c  | 6 +++---
 mingw-w64-crt/stdio/_wstat32i64.c | 6 +++---
 3 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/mingw-w64-crt/stdio/_fstat32i64.c 
b/mingw-w64-crt/stdio/_fstat32i64.c
index 1bd63cd6001c..d10c35577e5c 100644
--- a/mingw-w64-crt/stdio/_fstat32i64.c
+++ b/mingw-w64-crt/stdio/_fstat32i64.c
@@ -30,9 +30,9 @@ int __cdecl _fstat32i64(int _FileDes,struct _stat32i64 *_Stat)
   _Stat->st_gid=st.st_gid;
   _Stat->st_rdev=st.st_rdev;
   _Stat->st_size=st.st_size;
-  _Stat->st_atime=((st.st_atime > INT32_MAX) ? -1 : st.st_atime);
-  _Stat->st_mtime=((st.st_mtime > INT32_MAX) ? -1 : st.st_mtime);
-  _Stat->st_ctime=((st.st_ctime > INT32_MAX) ? -1 : st.st_ctime);
+  _Stat->st_atime=((st.st_atime < 0 || st.st_atime > INT32_MAX) ? -1 : 
st.st_atime);
+  _Stat->st_mtime=((st.st_mtime < 0 || st.st_mtime > INT32_MAX) ? -1 : 
st.st_mtime);
+  _Stat->st_ctime=((st.st_ctime < 0 || st.st_ctime > INT32_MAX) ? -1 : 
st.st_ctime);
   return 0;
 }
 int (__cdecl *__MINGW_IMP_SYMBOL(_fstat32i64))(int, struct _stat32i64 *) = 
_fstat32i64;
diff --git a/mingw-w64-crt/stdio/_stat32i64.c b/mingw-w64-crt/stdio/_stat32i64.c
index 641f2f556e29..3d3d2702a051 100644
--- a/mingw-w64-crt/stdio/_stat32i64.c
+++ b/mingw-w64-crt/stdio/_stat32i64.c
@@ -30,9 +30,9 @@ int __cdecl _stat32i64(const char *_Name,struct _stat32i64 
*_Stat)
   _Stat->st_gid=st.st_gid;
   _Stat->st_rdev=st.st_rdev;
   _Stat->st_size=st.st_size;
-  _Stat->st_atime=((st.st_atime > INT32_MAX) ? -1 : st.st_atime);
-  _Stat->st_mtime=((st.st_mtime > INT32_MAX) ? -1 : st.st_mtime);
-  _Stat->st_ctime=((st.st_ctime > INT32_MAX) ? -1 : st.st_ctime);
+  _Stat->st_atime=((st.st_atime < 0 || st.st_atime > INT32_MAX) ? -1 : 
st.st_atime);
+  _Stat->st_mtime=((st.st_mtime < 0 || st.st_mtime > INT32_MAX) ? -1 : 
st.st_mtime);
+  _Stat->st_ctime=((st.st_ctime < 0 || st.st_ctime > INT32_MAX) ? -1 : 
st.st_ctime);
   return 0;
 }
 int (__cdecl *__MINGW_IMP_SYMBOL(_stat32i64))(const char *, struct _stat32i64 
*) = _stat32i64;
diff --git a/mingw-w64-crt/stdio/_wstat32i64.c 
b/mingw-w64-crt/stdio/_wstat32i64.c
index dab760069cbc..b6f2e0b0cab9 100644
--- a/mingw-w64-crt/stdio/_wstat32i64.c
+++ b/mingw-w64-crt/stdio/_wstat32i64.c
@@ -30,9 +30,9 @@ int __cdecl _wstat32i64(const wchar_t *_Name,struct 
_stat32i64 *_Stat)
   _Stat->st_gid=st.st_gid;
   _Stat->st_rdev=st.st_rdev;
   _Stat->st_size=st.st_size;
-  _Stat->st_atime=((st.st_atime > INT32_MAX) ? -1 : st.st_atime);
-  _Stat->st_mtime=((st.st_mtime > INT32_MAX) ? -1 : st.st_mtime);
-  _Stat->st_ctime=((st.st_ctime > INT32_MAX) ? -1 : st.st_ctime);
+  _Stat->st_atime=((st.st_atime < 0 || st.st_atime > INT32_MAX) ? -1 : 
st.st_atime);
+  _Stat->st_mtime=((st.st_mtime < 0 || st.st_mtime > INT32_MAX) ? -1 : 
st.st_mtime);
+  _Stat->st_ctime=((st.st_ctime < 0 || st.st_ctime > INT32_MAX) ? -1 : 
st.st_ctime);
   return 0;
 }
 int (__cdecl *__MINGW_IMP_SYMBOL(_wstat32i64))(const wchar_t *, struct 
_stat32i64 *) = _wstat32i64;
-- 
2.20.1



_______________________________________________
Mingw-w64-public mailing list
Mingw-w64-public@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to