On Mon, 13 Aug 2012 23:52:12 +0200 Juergen Lock <n...@jelal.kn-bremen.de> wrote:
> On Mon, Aug 13, 2012 at 08:12:42PM +0200, Gary Jennejohn wrote: > > On Mon, 13 Aug 2012 02:41:35 -0400 > > Alexander Kabaev <kab...@gmail.com> wrote: > > > > [snip lots of gdb trace] > > > > > Please check the use of _SC_GETPW_R_SIZE_MAX in vlcpulse.c. This > > > constant is unsupported, so the module tries to allocate a stack > > > buffer with negative size, smashing the stack dead. > > > > > > > Seems like a good idea, but I replaced the rather sloppy > > buf[sysctl(_SC_GETPW_R_SIZE_MAX)]; > > with > > buf[2048]; > > and vlc still core dumps when trying to generate plugins.dat. > > Yeah that seems to be a different issue (rtld). > Juergen Please try this patch. -- Alexander Kabaev
diff --git a/libexec/rtld-elf/rtld.c b/libexec/rtld-elf/rtld.c index 95358aa..6f6ac70 100644 --- a/libexec/rtld-elf/rtld.c +++ b/libexec/rtld-elf/rtld.c @@ -1743,6 +1743,27 @@ init_dag(Obj_Entry *root) root->dag_inited = true; } +static void +process_nodelete(Obj_Entry *root) +{ + const Objlist_Entry *elm; + + /* + * Walk over object DAG and process every dependent object + * that is marked as DF_1_NODELETE. They need to grow own + * dag, which should then be ref-ed separately. + */ + STAILQ_FOREACH(elm, &root->dagmembers, link) { + if (elm->obj != NULL && elm->obj->z_nodelete && + !elm->obj->ref_nodel) { + dbg("obj %s nodelete", elm->obj->path); + init_dag(elm->obj); + ref_dag(elm->obj); + elm->obj->ref_nodel = true; + } + } + root->dag_inited = true; +} /* * Initialize the dynamic linker. The argument is the address at which * the dynamic linker has been mapped into memory. The primary task of @@ -1932,12 +1953,6 @@ process_needed(Obj_Entry *obj, Needed_Entry *needed, int flags) flags & ~RTLD_LO_NOLOAD); if (obj1 == NULL && !ld_tracing && (flags & RTLD_LO_FILTEES) == 0) return (-1); - if (obj1 != NULL && obj1->z_nodelete && !obj1->ref_nodel) { - dbg("obj %s nodelete", obj1->path); - init_dag(obj1); - ref_dag(obj1); - obj1->ref_nodel = true; - } } return (0); } @@ -2833,8 +2848,12 @@ dlopen_object(const char *name, int fd, Obj_Entry *refobj, int lo_flags, /* Make list of init functions to call. */ initlist_add_objects(obj, &obj->next, &initlist); } + /* + * Process all no_delete objects here, given them own + * DAGs to prevent their dependencies from being unloaded. + */ + process_nodelete(obj); } else { - /* * Bump the reference counts for objects on this DAG. If * this is the first dlopen() call for the object that was
signature.asc
Description: PGP signature