BASH PATCH REPORT ================= Bash-Release: 4.2 Patch-ID: bash42-005 Bug-Reported-by: Dennis Williamson Bug-Reference-ID: Bug-Reference-URL: http://lists.gnu.org/archive/html/bug-bash/2011-02/msg00147.html Bug-Description: Systems that use tzset() to set the local timezone require the TZ variable to be in the environment. Bash must make sure the environment has been modified with any updated value for TZ before calling tzset(). This affects prompt string expansions and the `%T' printf conversion specification on systems that do not allow bash to supply a replacement for getenv(3). Patch (apply with `patch -p0'): *** ../bash-4.2-patched/variables.h 2010-12-02 20:22:01.000000000 -0500 --- ./variables.h 2011-02-19 19:57:12.000000000 -0500 *************** *** 314,317 **** --- 314,318 ---- extern void sort_variables __P((SHELL_VAR **)); + extern int chkexport __P((char *)); extern void maybe_make_export_env __P((void)); extern void update_export_env_inplace __P((char *, int, char *)); *** ../bash-4.2-patched/variables.c 2011-01-24 20:07:48.000000000 -0500 --- ./variables.c 2011-02-19 20:04:50.000000000 -0500 *************** *** 3654,3657 **** --- 3654,3673 ---- } + int + chkexport (name) + char *name; + { + SHELL_VAR *v; + + v = find_variable (name); + if (exported_p (v)) + { + array_needs_making = 1; + maybe_make_export_env (); + return 1; + } + return 0; + } + void maybe_make_export_env () *************** *** 4215,4219 **** { "TEXTDOMAINDIR", sv_locale }, ! #if defined (HAVE_TZSET) && defined (PROMPT_STRING_DECODE) { "TZ", sv_tz }, #endif --- 4231,4235 ---- { "TEXTDOMAINDIR", sv_locale }, ! #if defined (HAVE_TZSET) { "TZ", sv_tz }, #endif *************** *** 4559,4568 **** #endif /* HISTORY */ ! #if defined (HAVE_TZSET) && defined (PROMPT_STRING_DECODE) void sv_tz (name) char *name; { ! tzset (); } #endif --- 4575,4585 ---- #endif /* HISTORY */ ! #if defined (HAVE_TZSET) void sv_tz (name) char *name; { ! if (chkexport (name)) ! tzset (); } #endif *** ../bash-4.2-patched/parse.y 2011-01-02 15:48:11.000000000 -0500 --- ./parse.y 2011-02-19 20:05:00.000000000 -0500 *************** *** 5136,5139 **** --- 5136,5142 ---- /* Make the current time/date into a string. */ (void) time (&the_time); + #if defined (HAVE_TZSET) + sv_tz ("TZ"); /* XXX -- just make sure */ + #endif tm = localtime (&the_time); *** ../bash-4.2-patched/builtins/printf.def 2010-11-23 10:02:55.000000000 -0500 --- ./builtins/printf.def 2011-02-19 20:05:04.000000000 -0500 *************** *** 466,469 **** --- 466,472 ---- else secs = arg; + #if defined (HAVE_TZSET) + sv_tz ("TZ"); /* XXX -- just make sure */ + #endif tm = localtime (&secs); n = strftime (timebuf, sizeof (timebuf), timefmt, tm); *** ../bash-4.2-patched/patchlevel.h Sat Jun 12 20:14:48 2010 --- ./patchlevel.h Thu Feb 24 21:41:34 2011 *************** *** 26,30 **** looks for to find the patch level (for the sccs version string). */ ! #define PATCHLEVEL 4 #endif /* _PATCHLEVEL_H_ */ --- 26,30 ---- looks for to find the patch level (for the sccs version string). */ ! #define PATCHLEVEL 5 #endif /* _PATCHLEVEL_H_ */