Since we are multi-threaded using gmtime might cause a data race because gmtime reuses a global struct to write data into. Make sure that each thread uses their own struct tm and use gmtime_r instead.
Signed-off-by: Mark Wielaard <m...@klomp.org> --- debuginfod/ChangeLog | 5 +++++ debuginfod/debuginfod.cxx | 15 +++++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/debuginfod/ChangeLog b/debuginfod/ChangeLog index ae584b9b..83aaf4b7 100644 --- a/debuginfod/ChangeLog +++ b/debuginfod/ChangeLog @@ -1,3 +1,8 @@ +2021-12-01 Mark Wielaard <m...@klomp.org> + + * debuginfod-client.c (timestamp): Use gmtime_r instead of gmtime. + (add_mhd_last_modified): Likewise. + 2021-12-01 Mark Wielaard <m...@klomp.org> * debuginfod-client.c (debuginfod_query_server): Free tmp_url on diff --git a/debuginfod/debuginfod.cxx b/debuginfod/debuginfod.cxx index 3b4591dd..112c6701 100644 --- a/debuginfod/debuginfod.cxx +++ b/debuginfod/debuginfod.cxx @@ -855,10 +855,11 @@ timestamp (ostream &o) char datebuf[80]; char *now2 = NULL; time_t now_t = time(NULL); - struct tm *now = gmtime (&now_t); - if (now) + struct tm now; + struct tm *nowp = gmtime_r (&now_t, &now); + if (nowp) { - (void) strftime (datebuf, sizeof (datebuf), "%c", now); + (void) strftime (datebuf, sizeof (datebuf), "%c", nowp); now2 = datebuf; } @@ -1076,11 +1077,13 @@ conninfo (struct MHD_Connection * conn) static bool add_mhd_last_modified (struct MHD_Response *resp, time_t mtime) { - struct tm *now = gmtime (&mtime); - if (now != NULL) + struct tm now; + struct tm *nowp = gmtime_r (&mtime, &now); + if (nowp != NULL) { char datebuf[80]; - size_t rc = strftime (datebuf, sizeof (datebuf), "%a, %d %b %Y %T GMT", now); + size_t rc = strftime (datebuf, sizeof (datebuf), "%a, %d %b %Y %T GMT", + nowp); if (rc > 0 && rc < sizeof (datebuf)) if (MHD_add_response_header (resp, "Last-Modified", datebuf) == MHD_NO) return false; -- 2.18.4