Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 28 Jan 2025 23:27:25 GMT
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 21502f9a926c - main - crtend: accurately check for the start of .ctors
Message-ID:  <202501282327.50SNRPBw076104@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by kib:

URL: https://cgit.FreeBSD.org/src/commit/?id=21502f9a926c7e0c24ce230bb029fde4bf570a14

commit 21502f9a926c7e0c24ce230bb029fde4bf570a14
Author:     Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2025-01-27 20:38:27 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2025-01-28 22:59:20 +0000

    crtend: accurately check for the start of .ctors
    
    For the hypothetic situation where crtbegin.o is not linked into the
    binary, but crtend.o is, which results in the missing starting sentinel
    in the ctors array, be careful to not iterate past the start of the
    section.
    
    Reviewed by:    andrew, dim
    Sponsored by:   The FreeBSD Foundation
    MFC after:      1 week
    Differential revision:  https://reviews.freebsd.org/D48700
---
 lib/csu/common/crtend.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/lib/csu/common/crtend.c b/lib/csu/common/crtend.c
index d9259729bb0e..bf25c1d836a9 100644
--- a/lib/csu/common/crtend.c
+++ b/lib/csu/common/crtend.c
@@ -21,7 +21,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#include <sys/cdefs.h>
+#include <sys/types.h>
 #include "crt.h"
 
 typedef void (*crt_func)(void);
@@ -45,15 +45,22 @@ static crt_func __DTOR_END__[] __section(".dtors") __used = {
 	(crt_func)0
 };
 
+extern const char startof_ctors[] __asm(".startof..ctors")
+    __weak_symbol __hidden;
+
 static void
 __do_global_ctors_aux(void)
 {
 	crt_func fn;
+	uintptr_t ctors_start;
 	int n;
 
+	ctors_start = (uintptr_t)&startof_ctors;
 	for (n = 1;; n++) {
 		fn = __CTOR_END__[-n];
-		if (fn == (crt_func)0 || fn == (crt_func)-1)
+		if (fn == (crt_func)0 || fn == (crt_func)-1 ||
+		    (ctors_start > 0 &&
+		    (uintptr_t)&__CTOR_END__[-n] < ctors_start))
 			break;
 		fn();
 	}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202501282327.50SNRPBw076104>