From c39ad27d9e76636527c37d030d7f7d651744a8f3 Mon Sep 17 00:00:00 2001 From: Freddie Chopin Date: Sat, 12 Dec 2015 11:52:21 +0100 Subject: Add missing lock releases in __register_exitproc(). In some code paths the __atexit_lock held by this function was not released when returning with an error. * libc/stdlib/__atexit.c (__register_exitproc): Always release lock before return. --- newlib/libc/stdlib/__atexit.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'newlib/libc') diff --git a/newlib/libc/stdlib/__atexit.c b/newlib/libc/stdlib/__atexit.c index 18edc8c91..a3d5bdfbf 100644 --- a/newlib/libc/stdlib/__atexit.c +++ b/newlib/libc/stdlib/__atexit.c @@ -83,12 +83,20 @@ _DEFUN (__register_exitproc, if (p->_ind >= _ATEXIT_SIZE) { #ifndef _ATEXIT_DYNAMIC_ALLOC +#ifndef __SINGLE_THREAD__ + __lock_release_recursive(__atexit_lock); +#endif return -1; #else /* Don't dynamically allocate the atexit array if malloc is not available. */ if (!malloc) - return -1; + { +#ifndef __SINGLE_THREAD__ + __lock_release_recursive(__atexit_lock); +#endif + return -1; + } p = (struct _atexit *) malloc (sizeof *p); if (p == NULL) -- cgit v1.2.3