Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 13 Aug 2012 19:18:52 -0400
From:      Alexander Kabaev <kabaev@gmail.com>
To:        Juergen Lock <nox@jelal.kn-bremen.de>
Cc:        freebsd-multimedia@FreeBSD.org, Rainer Hurling <rhurlin@gwdg.de>, freebsd-ports@FreeBSD.org, Gary Jennejohn <gljennjohn@googlemail.com>
Subject:   Re: Another vlc 2.0.3 update (new ffmpeg! :)
Message-ID:  <20120813191852.1daed223@kan.dyndns.org>
In-Reply-To: <20120813215212.GA72798@triton8.kn-bremen.de>
References:  <20120812143124.GA21414@triton8.kn-bremen.de> <5027E2EA.2070508@gwdg.de> <20120812171133.GA26625@triton8.kn-bremen.de> <5027E471.1020800@gwdg.de> <5028022B.3020005@gwdg.de> <20120812231210.GA35081@triton8.kn-bremen.de> <20120813024135.3501fcee@kan.dyndns.org> <20120813201242.5108f145@ernst.jennejohn.org> <20120813215212.GA72798@triton8.kn-bremen.de>

next in thread | previous in thread | raw e-mail | index | archive | help
--Sig_/yt9HDrw2DBQtoVJR3VGWHu3
Content-Type: multipart/mixed; boundary="MP_/9mQ1t0s1jcj1C7K5p0G.9PV"

--MP_/9mQ1t0s1jcj1C7K5p0G.9PV
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

On Mon, 13 Aug 2012 23:52:12 +0200
Juergen Lock <nox@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 <kabaev@gmail.com> wrote:
> >=20
> > [snip lots of gdb trace]
> >=20
> > > 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.
> > >=20
> >=20
> > 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.
>=20
> Yeah that seems to be a different issue (rtld).
> 	Juergen

Please try this patch.

--=20
Alexander Kabaev

--MP_/9mQ1t0s1jcj1C7K5p0G.9PV
Content-Type: text/x-patch
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename=rtld-defer-nodelete.diff

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 =3D true;
 }
=20
+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 !=3D 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 =3D true;
+	}
+    }
+    root->dag_inited =3D 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 =3D=3D NULL && !ld_tracing && (flags & RTLD_LO_FILTEES) =3D=3D 0)
 	    return (-1);
-	if (obj1 !=3D NULL && obj1->z_nodelete && !obj1->ref_nodel) {
-	    dbg("obj %s nodelete", obj1->path);
-	    init_dag(obj1);
-	    ref_dag(obj1);
-	    obj1->ref_nodel =3D true;
-	}
     }
     return (0);
 }
@@ -2833,8 +2848,12 @@ dlopen_object(const char *name, int fd, Obj_Entry *r=
efobj, 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

--MP_/9mQ1t0s1jcj1C7K5p0G.9PV--

--Sig_/yt9HDrw2DBQtoVJR3VGWHu3
Content-Type: application/pgp-signature; name=signature.asc
Content-Disposition: attachment; filename=signature.asc

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.19 (FreeBSD)

iD8DBQFQKYthQ6z1jMm+XZYRAnIYAJ45YI4/99OyBPiriOVesCHgH1ETCgCfeEkr
YIY9G/AHwpxDMkECk/3W0og=
=obK2
-----END PGP SIGNATURE-----

--Sig_/yt9HDrw2DBQtoVJR3VGWHu3--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20120813191852.1daed223>