[yocto] [prelink-cross][PATCH 1/1] rtld.c: LD_PRELOAD bugfix

Maninder Singh maninder1.s at samsung.com
Mon Sep 21 21:59:11 PDT 2015


This patch do following things:-
1. 	Fixes bug of adding preloaded libs in search scope of dependent 
	libraries which results in search scope of few symbols becomes 
	same for executable and library, so conflict doesn't occur for 
	those symbols and hence resulted in less number of conflicts.
2. 	Reduce code redundancy.
3. 	Buffer Overflow fix.

Signed-off-by: Maninder Singh <maninder1.s at samsung.com>
Signed-off-by: Vaneet Narang <v.narang at samsung.com>
Reviewed-by: Doha Hwang <doha.hwang at samsung.com>
---
 trunk/src/rtld/rtld.c |   27 ++++++++++++++++-----------
 1 files changed, 16 insertions(+), 11 deletions(-)

diff --git a/trunk/src/rtld/rtld.c b/trunk/src/rtld/rtld.c
index 50461b6..8af5052 100644
--- a/trunk/src/rtld/rtld.c
+++ b/trunk/src/rtld/rtld.c
@@ -606,7 +606,7 @@ load_dsos (DSO *dso, int host_paths)
 {
   struct dso_list *dso_list, *dso_list_tail, *cur_dso_ent, *new_dso_ent;
   struct stat64 st;
-  int total_preload = 0;
+  int total_preload = 0, temp_total_preload = 0;
   char * libname[MAX_PRELOADED_LIBS] = {NULL};
 
   /* Assume it's static unless we find DT_NEEDED entries */
@@ -632,19 +632,19 @@ load_dsos (DSO *dso, int host_paths)
 
   if(dso->ehdr.e_type == ET_EXEC && ld_preload) {
       char *next_lib =  ld_preload;
-      libname[total_preload] = ld_preload;
-      total_preload++;
-      next_lib=strchr(ld_preload,':');
-      while(next_lib!=NULL){
-	  *next_lib = '\0';
-	  next_lib++;
-	  libname[total_preload] = next_lib;
-	  total_preload++;
-	  next_lib=strchr(next_lib,':');
-      }
+      while(*next_lib != '\0' && (total_preload < MAX_PRELOADED_LIBS)){
+        libname[total_preload++] = next_lib;
+        next_lib=strchrnul(next_lib,':');
+        if(*next_lib == '\0')
+          break;
+        *next_lib = '\0';
+        next_lib++;
+     }
+    temp_total_preload = total_preload;
   }
   else {
       total_preload = 0;
+      temp_total_preload = 0;
   }
   while (cur_dso_ent != NULL)
     {
@@ -666,6 +666,11 @@ load_dsos (DSO *dso, int host_paths)
 	{
 	  int ndx, maxndx;
 	  maxndx = data->d_size / cur_dso->shdr[cur_dso->dynamic].sh_entsize;
+      if(!(cur_dso->ehdr.e_type == ET_EXEC))
+        total_preload = 0;
+      else
+        total_preload = temp_total_preload;
+
 	  for (ndx = 0; ndx < maxndx + total_preload; ++ndx)
 	    {
 
-- 
1.7.1




More information about the yocto mailing list