--- a/gpr/src/gpr_imports.c 2022-02-27 10:10:34.053638209 +0100 +++ b/gpr/src/gpr_imports.c 2022-02-27 10:12:03.898276758 +0100 @@ -114,6 +114,44 @@ const char *__gnat_default_libgcc_subdir = "lib"; #endif +#include +#include +#include +#include + + extern long long __gnat_file_time(char* name) + { + long long result; + + if (name == NULL) { + return LLONG_MIN; + } + /* Number of seconds between and . */ + static const long long ada_epoch_offset = (136 * 365 + 44 * 366) * 86400LL; + struct stat sb; + if (stat(name, &sb) != 0) { + return LLONG_MIN; + } + + // return (sb.st_mtim.tv_sec - ada_epoch_offset) * 1E9 + // + sb.st_mtim.tv_nsec; + // with check overflow below + + if (__builtin_ssubll_overflow(sb.st_mtim.tv_sec, ada_epoch_offset, &result)) { + return LLONG_MIN; + } + + if (__builtin_smulll_overflow(result, 1E9, &result)) { + return LLONG_MIN; + } + + if (__builtin_saddll_overflow(result, sb.st_mtim.tv_nsec, &result)) { + return LLONG_MIN; + } + + return result; + } + #ifdef __cplusplus } #endif