OSDN Git Service

fix __cxa_finalize() implementation to be thread safe.
authorSrinavasa Nagaraju <srinavasa.x.nagaraju@sonyericsson.com>
Tue, 28 Feb 2012 03:08:22 +0000 (12:08 +0900)
committerJohan Redestig <johan.redestig@sonymobile.com>
Tue, 31 Jul 2012 10:30:28 +0000 (12:30 +0200)
__cxa_finalize() modifies the access permissions of __atexit
global variable without acquiring  _ATEXIT_LOCK(). Fix it prevent
any possible races.

Change-Id: I11939d0ebcbf6f360c14163222d40a449d96948e

libc/stdlib/atexit.c

index f4bcab9..55b7132 100644 (file)
@@ -131,6 +131,7 @@ __cxa_finalize(void *dso)
        if (__atexit_invalid)
                return;
 
+       _ATEXIT_LOCK();
        call_depth++;
 
        for (p = __atexit; p != NULL; p = p->next) {
@@ -149,6 +150,7 @@ __cxa_finalize(void *dso)
                                p->fns[n].fn_ptr.cxa_func = NULL;
                                mprotect(p, pgsize, PROT_READ);
                        }
+                       _ATEXIT_UNLOCK();
 #if ANDROID
                         /* it looks like we should always call the function
                          * with an argument, even if dso is not NULL. Otherwise
@@ -162,6 +164,7 @@ __cxa_finalize(void *dso)
                        else
                                (*fn.fn_ptr.std_func)();
 #endif /* !ANDROID */
+                       _ATEXIT_LOCK();
                }
        }
 
@@ -178,6 +181,7 @@ __cxa_finalize(void *dso)
                }
                __atexit = NULL;
        }
+       _ATEXIT_UNLOCK();
 }
 
 /*