summaryrefslogtreecommitdiff
path: root/dyn_load.c
diff options
context:
space:
mode:
authorIvan Maidanski <ivmai@mail.ru>2015-10-26 08:25:54 +0300
committerIvan Maidanski <ivmai@mail.ru>2015-10-26 08:25:54 +0300
commit7a1f75f30855ee1984463d085d3c90e6b2c05940 (patch)
treed287012cf19c5b2a6714c5fb943b1acda5057818 /dyn_load.c
parent0a37e6034137c7d5a4472b657739a1659fb20ee3 (diff)
downloadbdwgc-7a1f75f30855ee1984463d085d3c90e6b2c05940.tar.gz
Check DATASTART is less than DATAEND even assertions off
* dyn_load.c (GC_register_dynamic_libraries_dl_iterate_phdr): Abort with the appropriate message if DATASTART is NULL or greater than DATAEND (same for DATASTART2 and DATAEND2). * os_dep.c (GC_init_linux_data_start, GC_register_data_segments): Likewise. * os_dep.c (GC_init_linux_data_start, GC_register_data_segments): Remove assertion about DATASTART and DATAEND. * os_dep.c (GC_init_linux_data_start): Code refactoring.
Diffstat (limited to 'dyn_load.c')
-rw-r--r--dyn_load.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/dyn_load.c b/dyn_load.c
index c8d051ab..0afdb86a 100644
--- a/dyn_load.c
+++ b/dyn_load.c
@@ -624,11 +624,20 @@ STATIC GC_bool GC_register_dynamic_libraries_dl_iterate_phdr(void)
# else
dataend = DATAEND;
# endif
+ if (NULL == datastart || (word)datastart > (word)dataend)
+ ABORT_ARG2("Wrong DATASTART/END pair",
+ ": %p .. %p", datastart, dataend);
/* dl_iterate_phdr may forget the static data segment in */
/* statically linked executables. */
GC_add_roots_inner(datastart, dataend, TRUE);
# if defined(DATASTART2)
+ if ((word)DATASTART2 - 1U >= (word)DATAEND2) {
+ /* Subtract one to check also for NULL */
+ /* without a compiler warning. */
+ ABORT_ARG2("Wrong DATASTART/END2 pair",
+ ": %p .. %p", DATASTART2, DATAEND2);
+ }
GC_add_roots_inner(DATASTART2, DATAEND2, TRUE);
# endif
}