Prevent FreeBSD's strftime from segfaulting by setting tm_zone.
This commit is contained in:
parent
fe6a9db1e5
commit
5e3f793326
10
scsh/time1.c
10
scsh/time1.c
|
@ -322,7 +322,7 @@ s48_value date2time(s48_value sec, s48_value min, s48_value hour,
|
||||||
s48_value format_date(s48_value sch_fmt, s48_value sch_sec, s48_value sch_min,
|
s48_value format_date(s48_value sch_fmt, s48_value sch_sec, s48_value sch_min,
|
||||||
s48_value sch_hour, s48_value sch_mday,
|
s48_value sch_hour, s48_value sch_mday,
|
||||||
s48_value sch_month, s48_value sch_year,
|
s48_value sch_month, s48_value sch_year,
|
||||||
s48_value tz, s48_value sch_summer,
|
s48_value sch_tz, s48_value sch_summer,
|
||||||
s48_value sch_week_day, s48_value sch_year_day)
|
s48_value sch_week_day, s48_value sch_year_day)
|
||||||
{
|
{
|
||||||
struct tm d;
|
struct tm d;
|
||||||
|
@ -349,6 +349,10 @@ s48_value format_date(s48_value sch_fmt, s48_value sch_sec, s48_value sch_min,
|
||||||
d.tm_yday = s48_extract_fixnum(sch_year_day);
|
d.tm_yday = s48_extract_fixnum(sch_year_day);
|
||||||
d.tm_isdst = (S48_EQ_P (sch_summer, S48_FALSE)) ? 0 : 1;
|
d.tm_isdst = (S48_EQ_P (sch_summer, S48_FALSE)) ? 0 : 1;
|
||||||
|
|
||||||
|
#ifdef HAVE_TM_ZONE
|
||||||
|
d.tm_zone = s48_extract_string(sch_tz); /* FreeBSD's strftime reads this */
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Copy fmt -> fmt2, converting ~ escape codes to % escape codes.
|
/* Copy fmt -> fmt2, converting ~ escape codes to % escape codes.
|
||||||
** Set zone=1 if fmt has a ~Z.
|
** Set zone=1 if fmt has a ~Z.
|
||||||
** Build up an estimate of how large the target buffer needs to be.
|
** Build up an estimate of how large the target buffer needs to be.
|
||||||
|
@ -404,8 +408,8 @@ s48_value format_date(s48_value sch_fmt, s48_value sch_sec, s48_value sch_min,
|
||||||
*q++ = 'x'; *q = '\0'; /* Append the guard "x" suffix and nul-terminate. */
|
*q++ = 'x'; *q = '\0'; /* Append the guard "x" suffix and nul-terminate. */
|
||||||
|
|
||||||
/* Fix up the time-zone if it is being used and the user passed one in. */
|
/* Fix up the time-zone if it is being used and the user passed one in. */
|
||||||
if( zone && S48_STRING_P(tz) ) {
|
if( zone && S48_STRING_P(sch_tz) ) {
|
||||||
oldenv = make_newenv(tz, newenv);
|
oldenv = make_newenv(sch_tz, newenv);
|
||||||
if( !oldenv ) {
|
if( !oldenv ) {
|
||||||
int err = errno;
|
int err = errno;
|
||||||
Free(fmt);
|
Free(fmt);
|
||||||
|
|
Loading…
Reference in New Issue