From b5fa435a2a972656b05a715a4af0a7ef52be66df Mon Sep 17 00:00:00 2001 From: Janne Blomqvist Date: Thu, 27 Jan 2011 22:22:37 +0200 Subject: [PATCH] Pr 47431 CTIME/FDATE thread-safety using ctime_r() From-SVN: r169338 --- libgfortran/ChangeLog | 12 ++++++++++++ libgfortran/config.h.in | 3 +++ libgfortran/configure | 2 +- libgfortran/configure.ac | 2 +- libgfortran/intrinsics/ctime.c | 31 +++++++++++++++++++++++++------ 5 files changed, 42 insertions(+), 8 deletions(-) diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index c096acfbb00c..2515ca5e38a3 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,15 @@ +2011-01-27 Janne Blomqvist + + PR libfortran/47431 + * config.h.in: Regenerated. + * configure: Regenerated. + * configure.ac: Add check for ctime_r(). + * intrinsics/ctime.c (ctime_r): Fallback implementation. + (fdate): Use ctime_r() instead of ctime(). + (fdate_sub): Likewise. + (ctime): Likewise. + (ctime_sub): Likewise. + 2011-01-27 Janne Blomqvist PR libfortran/47432 diff --git a/libgfortran/config.h.in b/libgfortran/config.h.in index 65414c75fc69..913628cf09b3 100644 --- a/libgfortran/config.h.in +++ b/libgfortran/config.h.in @@ -318,6 +318,9 @@ /* Define to 1 if you have the `ctime' function. */ #undef HAVE_CTIME +/* Define to 1 if you have the `ctime_r' function. */ +#undef HAVE_CTIME_R + /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H diff --git a/libgfortran/configure b/libgfortran/configure index 836dfdc05e3e..b87210675a4f 100755 --- a/libgfortran/configure +++ b/libgfortran/configure @@ -16367,7 +16367,7 @@ _ACEOF fi done -for ac_func in localtime_r gmtime_r strerror_r getpwuid_r ttyname_r +for ac_func in localtime_r gmtime_r strerror_r getpwuid_r ttyname_r ctime_r do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" diff --git a/libgfortran/configure.ac b/libgfortran/configure.ac index 87d2340ab6cb..e8f842cf7f8c 100644 --- a/libgfortran/configure.ac +++ b/libgfortran/configure.ac @@ -251,7 +251,7 @@ AC_CHECK_FUNCS(chdir strerror getlogin gethostname kill link symlink perror) AC_CHECK_FUNCS(sleep time ttyname signal alarm ctime clock access fork execl) AC_CHECK_FUNCS(wait setmode execvp pipe dup2 close fdopen strcasestr getrlimit) AC_CHECK_FUNCS(gettimeofday stat fstat lstat getpwuid vsnprintf dup getcwd) -AC_CHECK_FUNCS(localtime_r gmtime_r strerror_r getpwuid_r ttyname_r) +AC_CHECK_FUNCS(localtime_r gmtime_r strerror_r getpwuid_r ttyname_r ctime_r) # Check for glibc backtrace functions AC_CHECK_FUNCS(backtrace backtrace_symbols) diff --git a/libgfortran/intrinsics/ctime.c b/libgfortran/intrinsics/ctime.c index 98bf29d7d213..2729616bff07 100644 --- a/libgfortran/intrinsics/ctime.c +++ b/libgfortran/intrinsics/ctime.c @@ -1,8 +1,8 @@ /* Implementation of the CTIME and FDATE g77 intrinsics. - Copyright (C) 2005, 2007, 2009 Free Software Foundation, Inc. + Copyright (C) 2005, 2007, 2009, 2011 Free Software Foundation, Inc. Contributed by François-Xavier Coudert -This file is part of the GNU Fortran 95 runtime library (libgfortran). +This file is part of the GNU Fortran runtime library (libgfortran). Libgfortran is free software; you can redistribute it and/or modify it under the terms of the GNU General Public @@ -41,6 +41,21 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #include +#ifndef HAVE_CTIME_R +static char * +ctime_r (const time_t * timep, char * buf __attribute__((unused))) +{ +#ifdef HAVE_CTIME + return ctime (timep); +#else + return NULL; +#endif +} +#endif + +/* ctime_r() buffer size needs to be at least 26 bytes. */ +#define CSZ 26 + extern void fdate (char **, gfc_charlen_type *); export_proto(fdate); @@ -48,9 +63,10 @@ void fdate (char ** date, gfc_charlen_type * date_len) { #if defined(HAVE_TIME) && defined(HAVE_CTIME) + char cbuf[CSZ]; int i; time_t now = time(NULL); - *date = ctime (&now); + *date = ctime_r (&now, cbuf); if (*date != NULL) { *date = strdup (*date); @@ -79,6 +95,7 @@ void fdate_sub (char * date, gfc_charlen_type date_len) { #if defined(HAVE_TIME) && defined(HAVE_CTIME) + char cbuf[CSZ]; int i; char *d; time_t now = time(NULL); @@ -86,7 +103,7 @@ fdate_sub (char * date, gfc_charlen_type date_len) memset (date, ' ', date_len); #if defined(HAVE_TIME) && defined(HAVE_CTIME) - d = ctime (&now); + d = ctime_r (&now, cbuf); if (d != NULL) { i = 0; @@ -105,9 +122,10 @@ void PREFIX(ctime) (char ** date, gfc_charlen_type * date_len, GFC_INTEGER_8 t) { #if defined(HAVE_CTIME) + char cbuf[CSZ]; time_t now = t; int i; - *date = ctime (&now); + *date = ctime_r (&now, cbuf); if (*date != NULL) { *date = strdup (*date); @@ -136,6 +154,7 @@ void ctime_sub (GFC_INTEGER_8 * t, char * date, gfc_charlen_type date_len) { #if defined(HAVE_CTIME) + char cbuf[CSZ]; int i; char *d; time_t now = *t; @@ -143,7 +162,7 @@ ctime_sub (GFC_INTEGER_8 * t, char * date, gfc_charlen_type date_len) memset (date, ' ', date_len); #if defined(HAVE_CTIME) - d = ctime (&now); + d = ctime_r (&now, cbuf); if (d != NULL) { i = 0; -- 2.39.2