#2013 mt-unsafe tzset() gets called improperly

obsolete: 8.3.4
closed-fixed
Kevin B KENNY
8
2003-02-03
2002-08-20
Zoran Vasiljevic
No

Sun Solaris (2.5.1+) build gets configured
with undefined HAVE_TZSET *and* undefined
HAVE_TM_ZONE.
This leads to multiple threads calling the
MT-unsafe tzset() function in tclClock.c
which brings MT-enabled Tcl shell to core.

This happens for at least Tcl8.3.4
(and maybe lower) and for Tcl8.4a4
and (probably) others as well.

The wording from FormatClock() function
in tclClock.c:272 says:

/*
* Some systems forgot to call tzset in localtime, make
sure its done.
*/

So I think, the Sun Solaris should also
be included in this list. This should
be changed in the tcl.m4 which already
covers this case for ULTRIX-4-* and
OSF1-V* systems.

Discussion

1 2 > >> (Page 1 of 2)
  • Logged In: YES
    user_id=95086

    Attached is a cvs diff between the original and
    my patched version. The diff is taken against
    Tcl8.3.4 core distro.

     
  • cvs diff tclClock.c

     
    Attachments
  • Jeffrey Hobbs
    Jeffrey Hobbs
    2002-09-02

    Logged In: YES
    user_id=72656

    I can't make this match any code in 8.3.4-cvs or 8.4. Could
    you please make a -u diff out of it, preferrably on the head?

     
  • Logged In: YES
    user_id=95086

    Please take a look at attached diff.
    This is output of "diff -u" and is done
    on the current HEAD.

     
  •  
    Attachments
  • Jeffrey Hobbs
    Jeffrey Hobbs
    2002-09-03

    Logged In: YES
    user_id=72656

    This patch looks suspicious. First, it is a reverse patch.
    But the problem is that it adds a mutex lock around an
    existing one, without handling the existing case. It also
    uses 'format' in the TclpStrftime where a dstring was used
    before. It looks perhaps like this wasn't exactly diffed
    against the 8.4 (or 8.3) cvs head. Or am I missing something?

     
  • Jeffrey Hobbs
    Jeffrey Hobbs
    2002-09-03

    • assigned_to: hobbs --> vasiljevic
     
  • Logged In: YES
    user_id=95086

    Sorry. You are right. I think I was still sleeping
    when I did this. Please ignore.

    The whole point can be simplified as this:
    For platforms having *both* HAVE_TM_ZONE and
    HAVE_TZSET *not* defined, the code enters the
    tzset()function unprotected. This results in subtle and
    difficult to find bugs which again result in core.
    It is pretty clear from the code that tzset will be entered
    twice for the !defined(HAVE_TM_ZONE) && !defined(WIN32)
    platforms, with Sun Solaris being one of them.

    It is pretty late here and I have no 8.4 patch ready.
    I did the change in my 8.3.4 copy and did not
    correctly moved it to 8.4 in the file I've posted.
    If you can wait until tomorrow I will prepare new one,
    otherwise you can just lock this part yourself. It is
    really trivial.

     
  • Kevin B KENNY
    Kevin B KENNY
    2002-10-30

    • labels: 105687 --> 06. Time Measurement
    • priority: 7 --> 8
    • assigned_to: vasiljevic --> kennykb
     
  • Kevin B KENNY
    Kevin B KENNY
    2003-02-03

    Logged In: YES
    user_id=99768

    Hmm, I thought I closed this one when I committed the change.
    Anyway, I did commit the change. Really.

     
1 2 > >> (Page 1 of 2)