[Spice-devel] [PATCH spice-server v2] gstreamer: Check if ORC library can work
Frediano Ziglio
fziglio at redhat.com
Tue Aug 29 09:35:23 UTC 2017
>
> On 08/18/2017 02:32 PM, Frediano Ziglio wrote:
> > ORC lirabry is used internally by GStreamer to generate code
> > dynamically.
> > If ORC cannot allocate executable memory the failure cause
> > an abort(3) to be called.
> > This happens on some SELinux configuration that disable executable
> > memory allocation (execmem boolean).
> > Check that ORC could work before attempting to use GStreamer to
> > avoid crashes. The log will report an error.
> >
> > Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> > ---
> > configure.ac | 6 ++++++
> > server/Makefile.am | 2 ++
> > server/gstreamer-encoder.c | 30 ++++++++++++++++++++++++++++++
> > 3 files changed, 38 insertions(+)
> >
>
> <snip>
> > +/* Check if ORC library can work.
> > + * ORC library is used quite extensively by GStreamer
> > + * to generate code dynamically. If ORC cannot work GStreamer
> > + * will abort(3) the entire process.
> > + */
> > +static bool orc_check(void)
> > +{
> > + static bool orc_checked = false;
> > + static bool orc_dynamic_code_ok = false;
> > +
> > + if (SPICE_UNLIKELY(!orc_checked)) {
> > + OrcCode *code = orc_code_new();
> > + if (code) {
> > + /* allocating 0 byte for code make the function not crash
> > + * but doing all initializations and checks */
>
> Hi Freidano,
>
> man malloc suggests that if size is 0, NULL may be returned even
> if successful.
>
orc_code_allocate_codemem has nothing to do with malloc,
the purpose is to allocate a writeble and executable
memory buffer which is forbidden by some SELinux settings
> Does it crash if allocating, but not writing/executing, e.g. 16 bytes ?
>
The function crash if called with a size != 0 in this case.
If is not clear could you suggest a better comment?
Or extend it.
> Uri.
>
> > + orc_code_allocate_codemem(code, 0);
> > + orc_dynamic_code_ok = code->code != NULL;
> > + orc_code_free(code);
> > + }
> > + orc_checked = true;
> > + }
> > + return orc_dynamic_code_ok;
> > +}
> > +
> > VideoEncoder *gstreamer_encoder_new(SpiceVideoCodecType codec_type,
> > uint64_t starting_bit_rate,
> > VideoEncoderRateControlCbs *cbs,
> > @@ -1721,6 +1746,11 @@ VideoEncoder
> > *gstreamer_encoder_new(SpiceVideoCodecType codec_type,
> > return NULL;
> > }
> >
> > + // avoid aborting the process
> > + if (!orc_check()) {
> > + return NULL;
> > + }
> > +
> > SpiceGstEncoder *encoder = spice_new0(SpiceGstEncoder, 1);
> > encoder->base.destroy = spice_gst_encoder_destroy;
> > encoder->base.encode_frame = spice_gst_encoder_encode_frame;
> >
>
>
Frediano
More information about the Spice-devel
mailing list