Date: Thu, 04 Jan 2001 20:22:46 -0700 From: "Russell L. Carter" <rcarter@pinyon.org> To: "John Polstra" <jdp@polstra.com> Cc: hackers@FreeBSD.ORG Subject: Re: ld-elf.so.1: assert failed: /usr/src/libexec/rtld-elf/rtld.c:2033 Message-ID: <20010105032246.62E3D8F@pinyon.org> In-Reply-To: Message from John Polstra <jdp@polstra.com> of "Thu, 04 Jan 2001 16:26:30 PST." <200101050026.f050QU703172@vashon.polstra.com>
next in thread | previous in thread | raw e-mail | index | archive | help
%In article <20001230164716.6366F9B@pinyon.org>, %Russell L. Carter <rcarter@pinyon.org> wrote: %> %> Bingo! %> %> Thanks guys! % %Not so fast there, fella. You're not getting off that easily. ;-) %Could you please try the patch below? It is like the patch that Paul %sent, except it should handle error conditions better. % %This patch is against -current, but I think it will apply cleanly to %-stable too. My pleasure. This patch applies cleanly against a two day old -stable, and works just as well as the first patch, i.e., my program works as expected. Thanks! Russell %Thanks, %John % %Index: rtld.c %=================================================================== %RCS file: /home/ncvs/src/libexec/rtld-elf/rtld.c,v %retrieving revision 1.50 %diff -u -r1.50 rtld.c %--- rtld.c 2000/11/07 22:41:53 1.50 %+++ rtld.c 2001/01/05 00:13:18 %@@ -77,6 +77,8 @@ % static Obj_Entry *digest_phdr(const Elf_Phdr *, int, caddr_t, const char *); % static Obj_Entry *dlcheck(void *); % static bool donelist_check(DoneList *, const Obj_Entry *); %+static void errmsg_restore(char *); %+static char *errmsg_save(void); % static char *find_library(const char *, const Obj_Entry *); % static const char *gethints(void); % static void init_dag(Obj_Entry *); %@@ -457,6 +459,30 @@ % va_end(ap); % } % %+/* %+ * Return a dynamically-allocated copy of the current error message, if any. %+ */ %+static char * %+errmsg_save(void) %+{ %+ return error_message == NULL ? NULL : xstrdup(error_message); %+} %+ %+/* %+ * Restore the current error message from a copy which was previously saved %+ * by errmsg_save(). The copy is freed. %+ */ %+static void %+errmsg_restore(char *saved_msg) %+{ %+ if (saved_msg == NULL) %+ error_message = NULL; %+ else { %+ _rtld_error("%s", saved_msg); %+ free(saved_msg); %+ } %+} %+ % static const char * % basename(const char *name) % { %@@ -696,7 +722,7 @@ % if (obj == (Obj_Entry *) handle) % break; % %- if (obj == NULL || obj->dl_refcount == 0) { %+ if (obj == NULL || obj->refcount == 0 || obj->dl_refcount == 0) { % _rtld_error("Invalid shared object handle %p", handle); % return NULL; % } %@@ -1184,13 +1210,20 @@ % objlist_call_fini(Objlist *list) % { % Objlist_Entry *elm; %+ char *saved_msg; % %+ /* %+ * Preserve the current error message since a fini function might %+ * call into the dynamic linker and overwrite it. %+ */ %+ saved_msg = errmsg_save(); % STAILQ_FOREACH(elm, list, link) { % if (elm->obj->refcount == 0) { % dbg("calling fini function for %s", elm->obj->path); % (*elm->obj->fini)(); % } % } %+ errmsg_restore(saved_msg); % } % % /* %@@ -1202,11 +1235,18 @@ % objlist_call_init(Objlist *list) % { % Objlist_Entry *elm; %+ char *saved_msg; % %+ /* %+ * Preserve the current error message since an init function might %+ * call into the dynamic linker and overwrite it. %+ */ %+ saved_msg = errmsg_save(); % STAILQ_FOREACH(elm, list, link) { % dbg("calling init function for %s", elm->obj->path); % (*elm->obj->init)(); % } %+ errmsg_restore(saved_msg); % } % % static void %@@ -2030,7 +2070,8 @@ % { % const Needed_Entry *needed; % %- assert(root->refcount != 0); %+ if (root->refcount == 0) %+ return; % root->refcount--; % if (root->refcount == 0) % for (needed = root->needed; needed != NULL; needed = needed->next) % % %To Unsubscribe: send mail to majordomo@FreeBSD.org %with "unsubscribe freebsd-hackers" in the body of the message % To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-hackers" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20010105032246.62E3D8F>