bin/83457: [ PATCH ] Unhandled malloc failure within libpthread's _thr_alloc()

Dan Lukes dan at obluda.cz
Thu Jul 14 14:10:10 GMT 2005


>Number:         83457
>Category:       bin
>Synopsis:       [ PATCH ] Unhandled malloc failure within libpthread's _thr_alloc()
>Confidential:   no
>Severity:       serious
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Thu Jul 14 14:10:09 GMT 2005
>Closed-Date:
>Last-Modified:
>Originator:     Dan Lukes
>Release:        FreeBSD 5.4-STABLE i386
>Organization:
Obludarium
>Environment:
System: FreeBSD kulesh.obluda.cz 5.4-STABLE FreeBSD 5.4-STABLE #8: Sat Jul 9 16:31:08 CEST 2005 dan at kulesh.obluda.cz:/usr/obj/usr/src/sys/KULESH i386
lib/libpthread/thread/thr_kern.c,v 1.112.2.2 2005/02/04 16:17:55 jhb

>Description:
	Unhandled malloc failure within libpthread's _thr_alloc()
>How-To-Repeat:
>Fix:

	The order of initialization of thread->tcb and thread->siginfo has
been swapped. It simplify cleanup after siginfo alloc failure (tcb is not
initialized yet, so it's not necesarry to destroy it)

	Over-nested if-else structures has been rearanged to improve
readability of code. Use 'goto' for exception handlings is not violation of
'structured programming rule'

--- patch begins here ---
--- lib/libpthread/thread/thr_kern.c.ORIG	Mon Feb 14 12:33:31 2005
+++ lib/libpthread/thread/thr_kern.c	Thu Jul 14 16:03:24 2005
@@ -2363,37 +2363,43 @@
 		}
 	}
 	if ((thread == NULL) &&
-	    ((thread = malloc(sizeof(struct pthread))) != NULL)) {
-		bzero(thread, sizeof(struct pthread));
-		if (curthread) {
-			_pthread_mutex_lock(&_tcb_mutex);
-			thread->tcb = _tcb_ctor(thread, 0 /* not initial tls */);
-			_pthread_mutex_unlock(&_tcb_mutex);
-		} else {
-			thread->tcb = _tcb_ctor(thread, 1 /* initial tls */);
-		}
-		if (thread->tcb == NULL) {
-			free(thread);
-			thread = NULL;
-		} else {
-			thread->siginfo = calloc(_SIG_MAXSIG,
-				sizeof(siginfo_t));
-			/*
-			 * Initialize thread locking.
-			 * Lock initializing needs malloc, so don't
-			 * enter critical region before doing this!
-			 */
-			if (_lock_init(&thread->lock, LCK_ADAPTIVE,
-			    _thr_lock_wait, _thr_lock_wakeup) != 0)
-				PANIC("Cannot initialize thread lock");
-			for (i = 0; i < MAX_THR_LOCKLEVEL; i++) {
-				_lockuser_init(&thread->lockusers[i],
-				    (void *)thread);
-				_LCK_SET_PRIVATE2(&thread->lockusers[i],
-				    (void *)thread);
-			}
-		}
+	    ((thread = calloc(1, sizeof(struct pthread))) == NULL))
+		goto done;
+
+	thread->siginfo = calloc(_SIG_MAXSIG, sizeof(siginfo_t));
+	if (thread->siginfo == NULL) {
+		free(thread);
+		thread = NULL;
+		goto done;
+	}
+
+	if (curthread) {
+		_pthread_mutex_lock(&_tcb_mutex);
+		thread->tcb = _tcb_ctor(thread, 0 /* not initial tls */);
+		_pthread_mutex_unlock(&_tcb_mutex);
+	} else {
+		thread->tcb = _tcb_ctor(thread, 1 /* initial tls */);
+	}
+	if (thread->tcb == NULL) {
+		free(thread);
+		thread = NULL;
+		goto done;
+	}
+
+	/*
+	 * Initialize thread locking.
+	 * Lock initializing needs malloc, so don't
+	 * enter critical region before doing this!
+	 */
+	if (_lock_init(&thread->lock, LCK_ADAPTIVE,
+	    _thr_lock_wait, _thr_lock_wakeup) != 0)
+		PANIC("Cannot initialize thread lock");
+	for (i = 0; i < MAX_THR_LOCKLEVEL; i++) {
+		_lockuser_init(&thread->lockusers[i], (void *)thread);
+		_LCK_SET_PRIVATE2(&thread->lockusers[i], (void *)thread);
 	}
+
+done:
 	return (thread);
 }
 
@@ -2180,7 +2180,7 @@
 {
 	struct kse *kse = NULL;
 	char *stack;
-	kse_critical_t crit;
+	kse_critical_t crit = NULL;
 	int i;
 
 	if ((curthread != NULL) && (free_kse_count > 0)) {
--- patch ends here ---
>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list