This is the mail archive of the
mailing list for the Cygwin project.
Re: Seg Fault in strftime
- From: Brian Inglis <Brian dot Inglis at SystematicSw dot ab dot ca>
- To: cygwin at cygwin dot com
- Date: Sat, 1 Aug 2015 21:47:23 +0000 (UTC)
- Subject: Re: Seg Fault in strftime
- Authentication-results: sourceware.org; auth=none
- References: <CAOC2fq9A1DSjy=7Af=wVCkNEsttpd4Fj-0w_nNwnSb76WFt5WA at mail dot gmail dot com>
Michael Enright <mike <at> kmcardiff.com> writes:
> The tznam is set from the tmzone member and when this happens that
> member is garbage. This member is garbage POSSIBLY because of a
> configuration option in libmozjs. The calling code is in prmjtime.cpp
> fills in a struct tm from Spidermonkey's own broken-down time
> structure, 'a', and then if the configuration enables, it makes
> *another* struct tm with more fields filled in in order to get
> a.tm_zone's proper value. My guess is that the path is not enabled but
> the bits delivered to me do not disclose whether this righteous code
> path is enabled. __cygwin_gettzname is evidently compiled to expect
> the tm_zone member to exist because GDB shows it does exist.
> So did any aspect of this change recently? The application and library
> were getting along okay before I did cygwin updates. The last time I
> had tried to run this code was early June, at which time I was running
> it dozens of times a day.
> Also it appears that the tm_zone member is an extension. I haven't
> been able to find POSIX guidance about how applications are supposed
> use struct tm in compliance in the presence of implementation-defined
> fields. POSIX example code shows a usage that does access the 'at
> least' fields. The language allows for implementation-defined fields.
> No mechanism is provided within POSIX to allow an application to
> discover additional fields and take care of them. It seems to me that
> an application can then assume that when it provides a struct tm as
> input, filling in the time and date reasonably, it is always
> sufficient to fill in the 'at least' fields and the implementation is
> the one who has to assume that the rest of the fields might not be
> filled in.
Two problems I have encountered in the past with manually constructed struct tm:
- failing to set struct tm.tm_isdst member to -1, or any negative value, so
that mktime(3) will determine whether DST is in effect, and set the struct
tm.tzname array from the tzdb
- failing to call mktime(3) for each struct tm variable to normalize the
struct tm members, determine if DST is in effect if struct tm.tm_isdst
member is -1, and set the struct tm.tzname array from the tzdb.
Check back in the code to see if struct tm.tm_isdst is set and to what
value, and if mktime(3) is called on each struct tm after it is filled.
- failing to call mktime()
Problem reports: http://cygwin.com/problems.html
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple