From 78bf858a52f7a48f8578f0d7ff0045873fd7eb5a Mon Sep 17 00:00:00 2001 From: kettenis <> Date: Fri, 11 Jul 2014 09:51:37 +0000 Subject: [PATCH] Add locking for __cxa_finalize() as it modifies the page permissions of the __atexit tables and touches global variables. From Srinavasa Nagaraju through Android/Elliott Hughes. ok tedu@, guenther@ --- src/lib/libc/stdlib/atexit.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/lib/libc/stdlib/atexit.c b/src/lib/libc/stdlib/atexit.c index 34f76bb7..6532b382 100644 --- a/src/lib/libc/stdlib/atexit.c +++ b/src/lib/libc/stdlib/atexit.c @@ -1,4 +1,4 @@ -/* $OpenBSD: atexit.c,v 1.19 2014/07/10 21:14:22 tedu Exp $ */ +/* $OpenBSD: atexit.c,v 1.20 2014/07/11 09:51:37 kettenis Exp $ */ /* * Copyright (c) 2002 Daniel Hartmeier * All rights reserved. @@ -116,6 +116,7 @@ __cxa_finalize(void *dso) int n, pgsize = getpagesize(); static int call_depth; + _ATEXIT_LOCK(); call_depth++; restart: @@ -136,7 +137,9 @@ restart: p->fns[n].fn_ptr = NULL; mprotect(p, pgsize, PROT_READ); } + _ATEXIT_UNLOCK(); (*fn.fn_ptr)(fn.fn_arg); + _ATEXIT_LOCK(); if (restartloop) goto restart; } @@ -157,6 +160,7 @@ restart: } __atexit = NULL; } + _ATEXIT_UNLOCK(); } /*