Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 6 Sep 2009 23:56:45 GMT
From:      Mikulas Patocka <mikulas@artax.karlin.mff.cuni.cz>
To:        freebsd-gnats-submit@FreeBSD.org
Subject:   threads/138603: localtime handles pthread errors badly
Message-ID:  <200909062356.n86Nujih005656@www.freebsd.org>
Resent-Message-ID: <200909070000.n87005wa096800@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         138603
>Category:       threads
>Synopsis:       localtime handles pthread errors badly
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-threads
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Mon Sep 07 00:00:05 UTC 2009
>Closed-Date:
>Last-Modified:
>Originator:     Mikulas Patocka
>Release:        8.0-BETA3
>Organization:
>Environment:
not FreeBSD, I just use some of its libraries
>Description:
localtime function calls _pthread_key_create and treats negative value as an error.

In reality, _pthread_key_create return positive number on error and zero on non-error. _pthread_key_create doesn't set errno.
>How-To-Repeat:
Found during source review.
Could be triggered by filling-up the threadspecific key table and calling localtime().
>Fix:
A patch is attached.

Patch attached with submission follows:

--- libc.bak/stdtime/localtime.c	2009-08-03 10:13:06.000000000 +0200
+++ libc/stdtime/localtime.c	2009-09-07 01:48:32.000000000 +0200
@@ -23,6 +23,7 @@
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <pthread.h>
+#include <errno.h>
 #include "private.h"
 #include "un-namespace.h"
 
@@ -1418,8 +1419,10 @@
 		if (localtime_key < 0) {
 			_pthread_mutex_lock(&localtime_mutex);
 			if (localtime_key < 0) {
-				if (_pthread_key_create(&localtime_key, free) < 0) {
+				int r;
+				if ((r = _pthread_key_create(&localtime_key, free))) {
 					_pthread_mutex_unlock(&localtime_mutex);
+					errno = r;
 					return(NULL);
 				}
 			}
@@ -1517,8 +1520,10 @@
 		if (gmtime_key < 0) {
 			_pthread_mutex_lock(&gmtime_mutex);
 			if (gmtime_key < 0) {
-				if (_pthread_key_create(&gmtime_key, free) < 0) {
+				int r;
+				if ((r = _pthread_key_create(&gmtime_key, free))) {
 					_pthread_mutex_unlock(&gmtime_mutex);
+					errno = r;
 					return(NULL);
 				}
 			}


>Release-Note:
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200909062356.n86Nujih005656>