>From aaa9611a61fe9fd8eaa9b7f6ec63bd2d889dc4ab Mon Sep 17 00:00:00 2001
From: Mohammed Khoory <mkhoory@eiast.ae>
Date: Mon, 4 Nov 2013 10:49:44 +0900
Subject: [PATCH] Fixed comparison of ELF object names

---
 rtl-obj.c | 40 ++++++++++++++++++++++++----------------
 rtl-obj.h | 16 ++++++++++++++++
 rtl.c     | 25 ++++++++++++++++++++++---
 3 files changed, 62 insertions(+), 19 deletions(-)

diff --git a/rtl-obj.c b/rtl-obj.c
index 23ed582..dc110b7 100644
--- a/rtl-obj.c
+++ b/rtl-obj.c
@@ -115,11 +115,14 @@ rtems_rtl_obj_unresolved (rtems_rtl_obj_t* obj)
   return (obj->flags & RTEMS_RTL_OBJ_UNRESOLVED) != 0 ? true : false;
 }
 
-static bool
-rtems_rtl_obj_parse_name (rtems_rtl_obj_t* obj, const char* name)
+bool
+rtems_rtl_parse_name(const char* name,
+                     const char** aname,
+                     const char** oname,
+                     int* ooffset)
 {
-  const char* aname = NULL;
-  const char* oname = NULL;
+  const char* anameTemp = NULL;
+  const char* onameTemp = NULL;
   const char* colon;
   const char* end;
 
@@ -133,14 +136,14 @@ rtems_rtl_obj_parse_name (rtems_rtl_obj_t* obj, const char* name)
   if (colon == NULL || colon < strrchr(name, '/'));
     colon = end;
 
-  oname = rtems_rtl_alloc_new (RTEMS_RTL_ALLOC_OBJECT, colon - name + 1, true);
-  if (!oname)
+  onameTemp = rtems_rtl_alloc_new (RTEMS_RTL_ALLOC_OBJECT, colon - name + 1, true);
+  if (!onameTemp)
   {
     rtems_rtl_set_error (ENOMEM, "no memory for object file name");
     return false;
   }
 
-  memcpy ((void*) oname, name, colon - name);
+  memcpy ((void*) onameTemp, name, colon - name);
 
   /*
    * If the pointers match there is no ':' delimiter.
@@ -153,7 +156,7 @@ rtems_rtl_obj_parse_name (rtems_rtl_obj_t* obj, const char* name)
      * The file name is an archive and the object file name is next after the
      * delimiter. Move the pointer to the archive name.
      */
-    aname = oname;
+    anameTemp = onameTemp;
     ++colon;
 
     /*
@@ -166,15 +169,15 @@ rtems_rtl_obj_parse_name (rtems_rtl_obj_t* obj, const char* name)
       at = end;
 
 
-    oname = rtems_rtl_alloc_new (RTEMS_RTL_ALLOC_OBJECT, at - colon + 1, true);
-    if (!oname)
+    onameTemp = rtems_rtl_alloc_new (RTEMS_RTL_ALLOC_OBJECT, at - colon + 1, true);
+    if (!onameTemp)
     {
-      rtems_rtl_alloc_del (RTEMS_RTL_ALLOC_OBJECT, (void*) aname);
+      rtems_rtl_alloc_del (RTEMS_RTL_ALLOC_OBJECT, (void*) anameTemp);
       rtems_rtl_set_error (ENOMEM, "no memory for object file name");
       return false;
     }
 
-    memcpy ((void*) oname, colon, at - colon);
+    memcpy ((void*) onameTemp, colon, at - colon);
 
     if (at != end)
     {
@@ -183,17 +186,22 @@ rtems_rtl_obj_parse_name (rtems_rtl_obj_t* obj, const char* name)
        * does not parse 0 will be returned and the archive will be
        * searched.
        */
-      obj->ooffset = strtoul (at + 1, 0, 0);
+      *ooffset = strtoul (at + 1, 0, 0);
     }
   }
 
-  obj->oname = oname;
-  obj->aname = aname;
-
+  *oname = onameTemp;
+  *aname = anameTemp;
   return true;
 }
 
 static bool
+rtems_rtl_obj_parse_name (rtems_rtl_obj_t* obj, const char* name)
+{
+  return rtems_rtl_parse_name (name, &(obj->aname), &(obj->oname), &(obj->ooffset));
+}
+
+static bool
 rtems_rtl_seek_read (int fd, off_t off, size_t len, uint8_t* buffer)
 {
   if (lseek (fd, off, SEEK_SET) < 0)
diff --git a/rtl-obj.h b/rtl-obj.h
index 2f7c403..740d50b 100644
--- a/rtl-obj.h
+++ b/rtl-obj.h
@@ -281,6 +281,22 @@ bool rtems_rtl_obj_free (rtems_rtl_obj_t* obj);
 bool rtems_rtl_obj_unresolved (rtems_rtl_obj_t* obj);
 
 /**
+ * Parses a filename and returns newly allocated strings with the archive name,
+ * object name, and the object's offset
+ *
+ * @param name The filename of the object
+ * @param aname Address of a string pointer that holds the archive name
+ * @param oname Address of a string pointer that holds the object name
+ * @param ooffset Address of an int that holds the object offset
+ * @retval true The parsing was successful
+ * @retval false The parsing was unsuccessful
+ */
+bool rtems_rtl_parse_name(const char* name,
+                          const char** aname,
+                          const char** oname,
+                          int* ooffset);
+
+/**
  * Load the object file.
  *
  * @param obj The object file's descriptor.
diff --git a/rtl.c b/rtl.c
index 9429046..7ef241a 100644
--- a/rtl.c
+++ b/rtl.c
@@ -375,18 +375,37 @@ rtems_rtl_obj_t*
 rtems_rtl_find_obj (const char* name)
 {
   rtems_chain_node* node;
+  rtems_rtl_obj_t* found = NULL;
+  const char* aname = NULL;
+  const char* oname = NULL;
+  int ooffset;
+
+  if (!rtems_rtl_parse_name (name, &aname, &oname, &ooffset))
+    return NULL;
 
   node = rtems_chain_first (&rtl->objects);
 
   while (!rtems_chain_is_tail (&rtl->objects, node))
   {
     rtems_rtl_obj_t* obj = (rtems_rtl_obj_t*) node;
-    if (rtems_rtl_match_name (obj, name))
-      return obj;
+
+    if ((aname == NULL && strcmp (obj->oname, oname) == 0) ||
+        (aname != NULL && strcmp (obj->aname, aname) == 0 && strcmp (obj->oname, oname) == 0))
+    {
+        found = obj;
+        break;
+    }
+
     node = rtems_chain_next (node);
   }
 
-  return NULL;
+  if (!aname)
+    rtems_rtl_alloc_del(RTEMS_RTL_ALLOC_OBJECT, (void*) aname);
+
+  if (!oname)
+    rtems_rtl_alloc_del(RTEMS_RTL_ALLOC_OBJECT, (void*) oname);
+
+  return found;
 }
 
 rtems_rtl_obj_t*
-- 
1.8.0.msysgit.0

