From: Mark Salter <[email protected]>

This adds some DSBT index sanity checks to the runtime linker. It
catches libraries which have no index (index 0) and libraries which
try to use an already used index.

Signed-off-by: Bernd Schmidt <[email protected]>
---
 ldso/ldso/dl-elf.c |   29 ++++++++++++++++++++++++++++-
 1 files changed, 28 insertions(+), 1 deletions(-)

diff --git a/ldso/ldso/dl-elf.c b/ldso/ldso/dl-elf.c
index 7227bfd..0efe7c7 100644
--- a/ldso/ldso/dl-elf.c
+++ b/ldso/ldso/dl-elf.c
@@ -813,13 +813,40 @@ struct elf_resolve *_dl_load_elf_shared_library(int 
secure,
                int idx = tpnt->loadaddr.map->dsbt_index;
                unsigned *dsbt = tpnt->loadaddr.map->dsbt_table;
 
+               if (idx == 0) {
+                       /* This DSO has not been assigned an index */
+                       _dl_dprintf(2, "%s: '%s' is missing a dsbt index 
assignment!\n",
+                                   _dl_progname, libname);
+                       _dl_exit(1);
+               }
+
                /*
                 * Setup dsbt slot for this module in dsbt of all modules.
                 */
                for (t = _dl_loaded_modules; t; t = t->next) {
                        /* find a dsbt table from another module */
-                       if (ref == NULL && t != tpnt)
+                       if (ref == NULL && t != tpnt) {
                                ref = t;
+
+                               /* make sure index is not already used */
+                               if (t->loadaddr.map->dsbt_table[idx]) {
+                                       struct elf_resolve *dup;
+                                       char *dup_name;
+
+                                       for (dup = _dl_loaded_modules; dup; dup 
= dup->next)
+                                               if (dup != tpnt && 
dup->loadaddr.map->dsbt_index == idx)
+                                                       break;
+                                       if (dup)
+                                               dup_name = dup->libname;
+                                       else if (idx == 1)
+                                               dup_name = "runtime linker";
+                                       else
+                                               dup_name = "unknown library";
+                                       _dl_dprintf(2, "%s: '%s' dsbt index %d 
already used by %s!\n",
+                                                   _dl_progname, libname, idx, 
dup_name);
+                                       _dl_exit(1);
+                               }
+                       }
                        t->loadaddr.map->dsbt_table[idx] = (unsigned)dsbt;
                }
                if (ref)
-- 
1.7.3.4

_______________________________________________
uClibc mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/uclibc

Reply via email to