From 2e6355c4f3813c346ded2a90997a4308114d2893 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Sun, 19 Mar 2023 14:40:39 -0700 Subject: [PATCH] Fix clock skew / crash issue with 'make -p' * NEWS: Mention this. * src/main.c (print_data_base): Use file_timestamp_sprintf instead of time+ctime, to avoid inconsistent clocks. See: https://www.gnu.org/software/gnulib/manual/html_node/time.html https://sourceware.org/bugzilla/show_bug.cgi?id=30200 This avoids output that incorrectly implies that the clock ran backwards. Avoiding ctime also means 'make' won't have undefined behavior if ctime crashes or returns a null pointer, which can happen if the system clock is set far in the past or future. --- NEWS | 5 +++++ src/main.c | 10 ++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/NEWS b/NEWS index 4ab15136..dcce8d93 100644 --- a/NEWS +++ b/NEWS @@ -9,6 +9,11 @@ which is contained in this distribution as the file doc/make.texi. See the README file and the GNU Make manual for instructions for reporting bugs. +* 'make --print-data-base' (or 'make -p') now outputs more-consistent + timestamps, e.g., "2023-03-19 14:23:42.570558743". Previously it + sometimes also used the form "Sun Mar 19 14:23:42 2023", and + sometimes used a clock that ticked slightly inconsistently. + Version 4.4.1 (26 Feb 2023) diff --git a/src/main.c b/src/main.c index a9d3a644..2a02e399 100644 --- a/src/main.c +++ b/src/main.c @@ -3744,11 +3744,13 @@ print_version (void) static void print_data_base (void) { - time_t when = time ((time_t *) 0); + int resolution; + char buf[FILE_TIMESTAMP_PRINT_LEN_BOUND + 1]; + file_timestamp_sprintf (buf, file_timestamp_now (&resolution)); print_version (); - printf (_("\n# Make data base, printed on %s"), ctime (&when)); + printf (_("\n# Make data base, printed on %s"), buf); print_variable_data_base (); print_dir_data_base (); @@ -3757,8 +3759,8 @@ print_data_base (void) print_vpath_data_base (); strcache_print_stats ("#"); - when = time ((time_t *) 0); - printf (_("\n# Finished Make data base on %s\n"), ctime (&when)); + file_timestamp_sprintf (buf, file_timestamp_now (&resolution)); + printf (_("\n# Finished Make data base on %s\n"), buf); } static void -- 2.37.2