diff options
author | Ulrich Drepper <drepper@redhat.com> | 1999-06-26 18:01:25 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 1999-06-26 18:01:25 +0000 |
commit | ee0f7bd6d4d59ed45ae95cff7b536b2a3fd1fa27 (patch) | |
tree | 5ad88b14d989ea78b9f79d9c028f0e4c800a2d99 | |
parent | 50e3b3976077b529413aa52ca8dcb4746f4f8c9c (diff) | |
download | glibc-ee0f7bd6d4d59ed45ae95cff7b536b2a3fd1fa27.tar.gz |
(_dl_map_object_deps): When looking for the next occurence of the aux object start with the current list entry, not the new one. Adjust tail pointer in the unique list. Explain how the meaning of the variables changes.
-rw-r--r-- | elf/dl-deps.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/elf/dl-deps.c b/elf/dl-deps.c index 56f91f6dd0..b981d490df 100644 --- a/elf/dl-deps.c +++ b/elf/dl-deps.c @@ -304,7 +304,10 @@ _dl_map_object_deps (struct link_map *map, /* Allocate new entry. This always has to be done. */ newp = alloca (sizeof (struct list)); - /* Copy the content of the current entry over. */ + /* We want to insert the new map before the current one, + but we have no back links. So we copy the contents of + the current entry over. Note that ORIG and NEWP now + have switched their meanings. */ orig->dup = memcpy (newp, orig, sizeof (*newp)); /* Initialize new entry. */ @@ -333,7 +336,7 @@ _dl_map_object_deps (struct link_map *map, _dl_map_object. */ --args.aux->l_opencount; - for (late = orig; late->unique; late = late->unique) + for (late = newp; late->unique; late = late->unique) if (late->unique->map == args.aux) break; @@ -344,10 +347,13 @@ _dl_map_object_deps (struct link_map *map, move it to this earlier position. */ orig->unique = newp; - /* Now remove the later entry from the unique list. */ + /* Now remove the later entry from the unique list + and adjust the tail pointer. */ + if (utail == late->unique) + utail = late; late->unique = late->unique->unique; - /* We must move the earlier in the chain. */ + /* We must move the object earlier in the chain. */ if (args.aux->l_prev) args.aux->l_prev->l_next = args.aux->l_next; if (args.aux->l_next) |