pp: don't convert if bo size is smaller than the expected size 24/117624/2
authorBoram Park <boram1288.park@samsung.com>
Tue, 7 Mar 2017 02:33:31 +0000 (11:33 +0900)
committerBoram Park <boram1288.park@samsung.com>
Tue, 7 Mar 2017 02:40:24 +0000 (11:40 +0900)
Change-Id: I24bc03747b0638d44baeb6be3d6cb66acf62e7a8

src/tdm_drm_pp.c

index 9180f58..97ee9de 100644 (file)
@@ -166,12 +166,26 @@ _tdm_drm_pp_convert(tdm_drm_pp_buffer *buffer, tdm_info_pp *info)
        pixman_format_code_t src_format, dst_format;
        int sbw, dbw;
        int rotate = 0, hflip = 0;
+       tbm_bo bo = NULL;
+       int bo_cnt = 0;
+       int bo_size = 0;
 
        RETURN_VAL_IF_FAIL(buffer != NULL, TDM_ERROR_INVALID_PARAMETER);
        RETURN_VAL_IF_FAIL(buffer->src != NULL, TDM_ERROR_INVALID_PARAMETER);
        RETURN_VAL_IF_FAIL(buffer->dst != NULL, TDM_ERROR_INVALID_PARAMETER);
        RETURN_VAL_IF_FAIL(info != NULL, TDM_ERROR_INVALID_PARAMETER);
 
+       bo_cnt = tbm_surface_internal_get_num_bos(buffer->src);
+       RETURN_VAL_IF_FAIL(bo_cnt == 1, TDM_ERROR_INVALID_PARAMETER);
+
+       bo_cnt = tbm_surface_internal_get_num_bos(buffer->dst);
+       RETURN_VAL_IF_FAIL(bo_cnt == 1, TDM_ERROR_INVALID_PARAMETER);
+
+       bo = tbm_surface_internal_get_bo(buffer->src, 0);
+       RETURN_VAL_IF_FAIL(bo != NULL, TDM_ERROR_INVALID_PARAMETER);
+
+       bo_size = tbm_bo_size(bo);
+
        /* not handle buffers which have 2 more gem handles */
 
        memset(&src_info, 0, sizeof(tbm_surface_info_s));
@@ -214,6 +228,12 @@ _tdm_drm_pp_convert(tdm_drm_pp_buffer *buffer, tdm_info_pp *info)
        if (info->transform >= TDM_TRANSFORM_FLIPPED)
                hflip = 1;
 
+       if (bo_size < src_info.planes[0].stride * src_info.height) {
+               TDM_WRN("bo size(%d) is smaller than the expected size(%d)",
+                               bo_size, src_info.planes[0].stride * src_info.height);
+               goto fail_convert;
+       }
+
        _tdm_drm_pp_pixman_convert(PIXMAN_OP_SRC,
                                   src_info.planes[0].ptr, dst_info.planes[0].ptr,
                                   src_format, dst_format,