From 95a4fc87264e5fdeb5452d63d3b2df217a2f19b2 Mon Sep 17 00:00:00 2001 From: Yaakov Selkowitz Date: Wed, 25 Mar 2015 16:26:07 -0500 Subject: [PATCH] strftime: use tzname if TM_ZONE is NULL This avoids a strlen(NULL) crash a few lines later. * libc/time/strftime.c (strftime) <%Z>: Initialize tznam to NULL. Use _tzname as fallback if TM_ZONE is NULL. --- newlib/ChangeLog | 5 +++++ newlib/libc/time/strftime.c | 6 +++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/newlib/ChangeLog b/newlib/ChangeLog index 7c57c94cd..6e45e940b 100644 --- a/newlib/ChangeLog +++ b/newlib/ChangeLog @@ -1,3 +1,8 @@ +2015-03-30 Yaakov Selkowitz + + * libc/time/strftime.c (strftime) <%Z>: Initialize tznam to NULL. + Use _tzname as fallback if TM_ZONE is NULL. + 2015-03-30 Yaakov Selkowitz * libc/include/libgen.h (_BASENAME_DEFINED): Define. diff --git a/newlib/libc/time/strftime.c b/newlib/libc/time/strftime.c index 7db338364..ee604c2e4 100644 --- a/newlib/libc/time/strftime.c +++ b/newlib/libc/time/strftime.c @@ -1311,7 +1311,7 @@ recurse: if (tim_p->tm_isdst >= 0) { size_t size; - const char *tznam; + const char *tznam = NULL; TZ_LOCK; #if defined (__CYGWIN__) @@ -1320,9 +1320,9 @@ recurse: tznam = __cygwin_gettzname (tim_p); #elif defined (__TM_ZONE) tznam = tim_p->__TM_ZONE; -#else - tznam = _tzname[tim_p->tm_isdst > 0]; #endif + if (!tznam) + tznam = _tzname[tim_p->tm_isdst > 0]; /* Note that in case of wcsftime this loop only works for timezone abbreviations using the portable codeset (aka ASCII). This seems to be the case, but if that ever changes, this