This is the mail archive of the
newlib@sourceware.org
mailing list for the newlib project.
[PATCH] Properly initialize dynamically created '_atexit' structures
- From: Meador Inge <meadori at codesourcery dot com>
- To: <newlib at sourceware dot org>
- Date: Fri, 16 Aug 2013 17:53:45 -0500
- Subject: [PATCH] Properly initialize dynamically created '_atexit' structures
Hi All,
This patch fixes an issue that occurs when greater than _ATEXIT_SIZE
exit procedures of type '__et_cxa' are registered, small reentrant
structure support is enabled, and dynamic allocation of atexit entries
is enabled. This bug is fairly easy to run into if you have a C++
program with lots of objects that have static storage duration. The
control flow where the problem is encountered in '__register_exitproc'
goes like:
1. 'p->_ind >= _ATEXIT_SIZE' is true and a new '_atexit' structure
is dynamically allocated and stored in 'p'.
2. 'p->_on_exit_args_ptr' is *not* set to NULL.
3. 'type != __et_atexit' is true.
4. At this point a new '_on_exit_args' structure should be created
as well, but if 'p->_on_exit_args_ptr' happens to be non-NULL,
then it isn't and bad things happen later when 'p->_on_exit_args_ptr'
is used.
The problem is fixed by properly initializing '_on_exit_args_ptr' to
NULL.
OK?
2013-08-16 Meador Inge <meadori@codesourcery.com>
* libc/stdlib/__atexit.c (__register_exitproc): NULL-ify
'_on_exit_args_ptr' when creating a new '_atexit' structure
while '_REENT_SMALL' is defined.
diff --git a/newlib/libc/stdlib/__atexit.c b/newlib/libc/stdlib/__atexit.c
index d36a1a4..18edc8c 100644
--- a/newlib/libc/stdlib/__atexit.c
+++ b/newlib/libc/stdlib/__atexit.c
@@ -104,6 +104,8 @@ _DEFUN (__register_exitproc,
#ifndef _REENT_SMALL
p->_on_exit_args._fntypes = 0;
p->_on_exit_args._is_cxa = 0;
+#else
+ p->_on_exit_args_ptr = NULL;
#endif
#endif
}