vdpau: unlock the mutex on error paths in attribute setting.
authorDave Airlie <airlied@redhat.com>
Mon, 1 Sep 2014 22:57:53 +0000 (08:57 +1000)
committerDave Airlie <airlied@redhat.com>
Tue, 2 Sep 2014 21:58:50 +0000 (07:58 +1000)
Coverity pointed out we never dropped the lock here, so fix
it by using a common exit path.

Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
src/gallium/state_trackers/vdpau/mixer.c

index a724aa5b254ba88e44a3bf1cbd5e4bda1c4d93cc..4118eb86997e4796b34eed04c8593b99f711a041 100644 (file)
@@ -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;
 }
 
 /**