diff --git a/configure.ac b/configure.ac index 347ba78f0e..ae69ca1444 100644 --- a/configure.ac +++ b/configure.ac @@ -848,6 +848,11 @@ AC_CHECK_TYPES(socklen_t, [], [], [[ #include ]]) +AC_CHECK_SIZEOF(time_t) +if test "x$ac_cv_sizeof_time_t" = "x8"; then + AC_DEFINE(HAVE_64BIT_TIME_T, 1, [Define if time_t is 64-bit]) +fi + dnl ###################################################################### dnl Checks for typedefs, structures, and compiler characteristics. dnl ###################################################################### diff --git a/libpromises/cf3.defs.h b/libpromises/cf3.defs.h index 63469802d1..fe02dba7c3 100644 --- a/libpromises/cf3.defs.h +++ b/libpromises/cf3.defs.h @@ -562,7 +562,12 @@ typedef enum #define CF_BOOL "true,false,yes,no,on,off" #define CF_LINKRANGE "symlink,hardlink,relative,absolute" -#define CF_TIMERANGE "0,2147483647" /* i.e. "0,0x7fffffff" */ + +#ifdef HAVE_64BIT_TIME_T +# define CF_TIMERANGE "0,99999999999" /* Same as other max int values */ +#else +# define CF_TIMERANGE "0,2147483647" /* i.e. "0,0x7fffffff" */ +#endif /* Syntax checker accepts absurdly big numbers for backwards * compatibility. WARNING: internally they are stored as longs, possibly diff --git a/tests/acceptance/00_basics/03_bodies/file-select-Y2038.cf b/tests/acceptance/00_basics/03_bodies/file-select-Y2038.cf new file mode 100644 index 0000000000..f1b8bd5335 --- /dev/null +++ b/tests/acceptance/00_basics/03_bodies/file-select-Y2038.cf @@ -0,0 +1,27 @@ +body common control +{ + inputs => { + "../../default.cf.sub", + }; + bundlesequence => { default("$(this.promise_filename)") }; + version => "1.0"; +} + +bundle agent test +{ + meta: + "description" string => "Test that the agent does not crash on dates after 2038."; + +} + +bundle agent check +{ + meta: + "test_skip_unsupported" string => "!64_bit"; + + classes: + "ok" expression => "class_defined_from_included_bundle"; + methods: + "" usebundle => dcs_passif_output(".*Pass.*", "", "$(sys.cf_agent) -Kf $(this.promise_filename).sub", $(this.promise_filename)); + +} diff --git a/tests/acceptance/00_basics/03_bodies/file-select-Y2038.cf.sub b/tests/acceptance/00_basics/03_bodies/file-select-Y2038.cf.sub new file mode 100644 index 0000000000..f2563a37bb --- /dev/null +++ b/tests/acceptance/00_basics/03_bodies/file-select-Y2038.cf.sub @@ -0,0 +1,24 @@ +bundle agent main { + files: + "/test" + file_select => y2040, + classes => always("y2038_ok"); + + reports: + y2038_ok:: + "Pass"; +} + +body file_select y2040 { + mtime => irange(2238260800,2238260863); + file_result => "mtime.leaf_name"; +} + +body classes always(x) +{ + promise_repaired => { "$(x)" }; + promise_kept => { "$(x)" }; + repair_failed => { "$(x)" }; + repair_denied => { "$(x)" }; + repair_timeout => { "$(x)" }; +}