Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 14 Aug 2012 13:39:21 +0200
From:      Juergen Lock <nox@jelal.kn-bremen.de>
To:        Alexander Kabaev <kabaev@gmail.com>
Cc:        freebsd-multimedia@FreeBSD.org, Juergen Lock <nox@jelal.kn-bremen.de>, freebsd-ports@FreeBSD.org, Gary Jennejohn <gljennjohn@googlemail.com>
Subject:   Re: Another vlc 2.0.3 update (new ffmpeg! :)
Message-ID:  <20120814113921.GA94259@triton8.kn-bremen.de>
In-Reply-To: <20120813191852.1daed223@kan.dyndns.org>
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> <20120813191852.1daed223@kan.dyndns.org>

next in thread | previous in thread | raw e-mail | index | archive | help
[Now also posted here:]

On Mon, Aug 13, 2012 at 07:18:52PM -0400, Alexander Kabaev wrote:
> 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:
> > > 
> > > [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.
> 
 Thank you, that fixed both the build crash with the pulseaudio
knob enabled when the old vlc version was still installed as well
as the install crash with the notify knob enabled. :)

	Juergen
> -- 
> 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






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