Tcl Source Code

View Ticket
Login
Ticket UUID: 597728
Title: mt-unsafe tzset() gets called improperly
Type: Bug Version: obsolete: 8.3.4
Submitter: vasiljevic Created on: 2002-08-20 12:09:43
Subsystem: 06. Time Measurement Assigned To: kennykb
Priority: 8 Severity:
Status: Closed Last Modified: 2003-02-04 03:30:22
Resolution: Fixed Closed By: kennykb
    Closed on: 2003-02-03 20:30:22
Description:
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.
User Comments: kennykb added on 2003-02-04 03:30:22:
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.

vasiljevic added on 2002-09-04 03:00:15:
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.

hobbs added on 2002-09-04 02:27:53:
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?

vasiljevic added on 2002-09-04 00:27:43:

File Added - 30364: tclClock.c.diff

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.

hobbs added on 2002-09-03 02:23:03:
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?

vasiljevic added on 2002-08-20 19:32:45:

File Added - 29418: tclClock.c.diff

vasiljevic added on 2002-08-20 19:31:58:
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.

Attachments: