From f4ccf687a678919920ceed5f2a5892c8870e5f30 Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Tue, 2 Sep 2014 08:57:53 +1000 Subject: vdpau: unlock the mutex on error paths in attribute setting. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Coverity pointed out we never dropped the lock here, so fix it by using a common exit path. Reviewed-by: Christian König Signed-off-by: Dave Airlie --- src/gallium/state_trackers/vdpau/mixer.c | 38 ++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 12 deletions(-) (limited to 'src/gallium/state_trackers') diff --git a/src/gallium/state_trackers/vdpau/mixer.c b/src/gallium/state_trackers/vdpau/mixer.c index a724aa5b254..4118eb86997 100644 --- a/src/gallium/state_trackers/vdpau/mixer.c +++ b/src/gallium/state_trackers/vdpau/mixer.c @@ -643,6 +643,7 @@ vlVdpVideoMixerSetAttributeValues(VdpVideoMixer mixer, const float *vdp_csc; float val; unsigned i; + VdpStatus ret; if (!(attributes && attribute_values)) return VDP_STATUS_INVALID_POINTER; @@ -676,8 +677,10 @@ vlVdpVideoMixerSetAttributeValues(VdpVideoMixer mixer, case VDP_VIDEO_MIXER_ATTRIBUTE_NOISE_REDUCTION_LEVEL: val = *(float*)attribute_values[i]; - if (val < 0.f || val > 1.f) - return VDP_STATUS_INVALID_VALUE; + if (val < 0.f || val > 1.f) { + ret = VDP_STATUS_INVALID_VALUE; + goto fail; + } vmixer->noise_reduction.level = val * 10; vlVdpVideoMixerUpdateNoiseReductionFilter(vmixer); @@ -685,41 +688,52 @@ vlVdpVideoMixerSetAttributeValues(VdpVideoMixer mixer, case VDP_VIDEO_MIXER_ATTRIBUTE_LUMA_KEY_MIN_LUMA: val = *(float*)attribute_values[i]; - if (val < 0.f || val > 1.f) - return VDP_STATUS_INVALID_VALUE; + if (val < 0.f || val > 1.f) { + ret = VDP_STATUS_INVALID_VALUE; + goto fail; + } vmixer->luma_key_min = val; break; case VDP_VIDEO_MIXER_ATTRIBUTE_LUMA_KEY_MAX_LUMA: val = *(float*)attribute_values[i]; - if (val < 0.f || val > 1.f) - return VDP_STATUS_INVALID_VALUE; + if (val < 0.f || val > 1.f) { + ret = VDP_STATUS_INVALID_VALUE; + goto fail; + } vmixer->luma_key_max = val; break; case VDP_VIDEO_MIXER_ATTRIBUTE_SHARPNESS_LEVEL: val = *(float*)attribute_values[i]; - if (val < -1.f || val > 1.f) - return VDP_STATUS_INVALID_VALUE; + if (val < -1.f || val > 1.f) { + ret = VDP_STATUS_INVALID_VALUE; + goto fail; + } vmixer->sharpness.value = val; vlVdpVideoMixerUpdateSharpnessFilter(vmixer); break; case VDP_VIDEO_MIXER_ATTRIBUTE_SKIP_CHROMA_DEINTERLACE: - if (*(uint8_t*)attribute_values[i] > 1) - return VDP_STATUS_INVALID_VALUE; + if (*(uint8_t*)attribute_values[i] > 1) { + ret = VDP_STATUS_INVALID_VALUE; + goto fail; + } vmixer->skip_chroma_deint = *(uint8_t*)attribute_values[i]; vlVdpVideoMixerUpdateDeinterlaceFilter(vmixer); break; default: - pipe_mutex_unlock(vmixer->device->mutex); - return VDP_STATUS_INVALID_VIDEO_MIXER_ATTRIBUTE; + ret = VDP_STATUS_INVALID_VIDEO_MIXER_ATTRIBUTE; + goto fail; } } pipe_mutex_unlock(vmixer->device->mutex); return VDP_STATUS_OK; +fail: + pipe_mutex_unlock(vmixer->device->mutex); + return ret; } /** -- cgit v1.2.3