summaryrefslogtreecommitdiffstats
path: root/libexec
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2012-03-27 14:10:15 +0000
committerkib <kib@FreeBSD.org>2012-03-27 14:10:15 +0000
commit4d91f78223dc434eb86fb079f5dbabed9a16eb79 (patch)
tree74569b2be2f16be7410069e0c69bc01a12326cf1 /libexec
parent2f1011004558a0b27cd95f1374185e37450b80e3 (diff)
downloadFreeBSD-src-4d91f78223dc434eb86fb079f5dbabed9a16eb79.zip
FreeBSD-src-4d91f78223dc434eb86fb079f5dbabed9a16eb79.tar.gz
Prevent rtld_verify_object_versions() from being called several times
for the same object. This can happen when object is a dependency of the dlopen()ed dso. When called several times, we waste time due to unneeded processing, and memory, because obj->vertab is allocated anew on each iteration. Reviewed by: kan MFC after: 2 weeks
Diffstat (limited to 'libexec')
-rw-r--r--libexec/rtld-elf/rtld.c4
-rw-r--r--libexec/rtld-elf/rtld.h1
2 files changed, 5 insertions, 0 deletions
diff --git a/libexec/rtld-elf/rtld.c b/libexec/rtld-elf/rtld.c
index e081e09..c4607b2 100644
--- a/libexec/rtld-elf/rtld.c
+++ b/libexec/rtld-elf/rtld.c
@@ -4158,6 +4158,10 @@ rtld_verify_object_versions(Obj_Entry *obj)
const Obj_Entry *depobj;
int maxvernum, vernum;
+ if (obj->ver_checked)
+ return (0);
+ obj->ver_checked = true;
+
maxvernum = 0;
/*
* Walk over defined and required version records and figure out
diff --git a/libexec/rtld-elf/rtld.h b/libexec/rtld-elf/rtld.h
index 08d7e99..6017957 100644
--- a/libexec/rtld-elf/rtld.h
+++ b/libexec/rtld-elf/rtld.h
@@ -230,6 +230,7 @@ typedef struct Struct_Obj_Entry {
bool mainprog : 1; /* True if this is the main program */
bool rtld : 1; /* True if this is the dynamic linker */
bool relocated : 1; /* True if processed by relocate_objects() */
+ bool ver_checked : 1; /* True if processed by rtld_verify_object_versions */
bool textrel : 1; /* True if there are relocations to text seg */
bool symbolic : 1; /* True if generated with "-Bsymbolic" */
bool bind_now : 1; /* True if all relocations should be made first */
OpenPOWER on IntegriCloud