I recently redisovered the fact that actime_r and ctime_r, like asctime and ctime, are unsafe functions in the same sense that gets is unsafe: they can overrun their output buffers and there's no simple way for the user to detect in advance whether this will happen. So GNU apps shouldn't use these functions, and I propose that we remove these function emulations from gnulib, as follows. Any objections?
--- ../gnulib/lib/time_r.h 2005-07-11 04:21:55.000000000 -0700 +++ lib/time_r.h 2006-03-10 01:39:10.000000000 -0800 @@ -1,6 +1,6 @@ /* Reentrant time functions like localtime_r. - Copyright (C) 2003, 2005 Free Software Foundation, Inc. + Copyright (C) 2003, 2005, 2006 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -27,25 +27,20 @@ #include <time.h> #if !HAVE_TIME_R_POSIX -# undef asctime_r -# undef ctime_r + +/* Don't bother with asctime_r and ctime_r, since these functions are + not safe (like asctime and ctime, they can overrun their 26-byte + output buffers when given outlandish struct tm values), and we + don't want to encourage applications to use unsafe functions. Use + strftime or even sprintf instead. */ + # undef gmtime_r # undef localtime_r -# define asctime_r rpl_asctime_r -# define ctime_r rpl_ctime_r # define gmtime_r rpl_gmtime_r # define localtime_r rpl_localtime_r /* See the POSIX:2001 specification - <http://www.opengroup.org/susv3xsh/asctime.html>. */ -char *asctime_r (struct tm const * restrict, char * restrict); - -/* See the POSIX:2001 specification - <http://www.opengroup.org/susv3xsh/ctime.html>. */ -char *ctime_r (time_t const *, char *); - -/* See the POSIX:2001 specification <http://www.opengroup.org/susv3xsh/gmtime.html>. */ struct tm *gmtime_r (time_t const * restrict, struct tm * restrict); --- ../gnulib/lib/time_r.c 2005-09-19 10:28:15.000000000 -0700 +++ lib/time_r.c 2006-03-10 01:34:06.000000000 -0800 @@ -44,18 +44,6 @@ copy_tm_result (struct tm *dest, struct } -char * -asctime_r (struct tm const * restrict tm, char * restrict buf) -{ - return copy_string_result (buf, asctime (tm)); -} - -char * -ctime_r (time_t const *t, char *buf) -{ - return copy_string_result (buf, ctime (t)); -} - struct tm * gmtime_r (time_t const * restrict t, struct tm * restrict tp) { _______________________________________________ bug-gnulib mailing list bug-gnulib@gnu.org http://lists.gnu.org/mailman/listinfo/bug-gnulib