[PATCH 08/14] exynos/fimg2d: check buffer space in g2d_blend()

2015-08-31 Thread Inki Dae
On 2015년 08월 24일 23:14, Tobias Jakobi wrote:
> Move parameter validation to the top and also validate
> the select mode of the source image and the requested
> blending operation before starting command submission.
> 
> Signed-off-by: Tobias Jakobi 
> ---
>  exynos/exynos_fimg2d.c | 66 
> +-
>  1 file changed, 39 insertions(+), 27 deletions(-)
> 
> diff --git a/exynos/exynos_fimg2d.c b/exynos/exynos_fimg2d.c
> index 781aff5..5acccf8 100644
> --- a/exynos/exynos_fimg2d.c
> +++ b/exynos/exynos_fimg2d.c
> @@ -623,7 +623,45 @@ g2d_blend(struct g2d_context *ctx, struct g2d_image *src,
>   union g2d_point_val pt;
>   union g2d_bitblt_cmd_val bitblt;
>   union g2d_blend_func_val blend;
> - unsigned int src_w = 0, src_h = 0, dst_w = 0, dst_h = 0;
> + unsigned int gem_space;
> + unsigned int src_w, src_h, dst_w, dst_h;
> +
> + src_w = w;
> + src_h = h;
> + if (src_x + w > src->width)
> + src_w = src->width - src_x;
> + if (src_y + h > src->height)
> + src_h = src->height - src_y;
> +
> + dst_w = w;
> + dst_h = h;
> + if (dst_x + w > dst->width)
> + dst_w = dst->width - dst_x;
> + if (dst_y + h > dst->height)
> + dst_h = dst->height - dst_y;
> +
> + w = MIN(src_w, dst_w);
> + h = MIN(src_h, dst_h);
> +
> + if (w <= 0 || h <= 0) {
> + fprintf(stderr, "invalid width or height.\n");
> + return -EINVAL;
> + }
> +
> + if (g2d_validate_select_mode(src->select_mode)) {
> + fprintf(stderr , "invalid select mode for source.\n");
> + return -EINVAL;
> + }
> +
> + if (g2d_validate_blending_op(op)) {
> + fprintf(stderr , "unsupported blending operation.\n");
> + return -EINVAL;
> + }
> +
> + gem_space = src->select_mode == G2D_SELECT_MODE_NORMAL ? 2 : 1;
> +
> + if (g2d_check_space(ctx, 12, gem_space))
> + return -ENOSPC;

As I mentioned before, above two lines could be integrated with other
patches.

Thanks,
Inki Dae

>  
>   bitblt.val = 0;
>   blend.val = 0;
> @@ -651,32 +689,6 @@ g2d_blend(struct g2d_context *ctx, struct g2d_image *src,
>   case G2D_SELECT_MODE_BGCOLOR:
>   g2d_add_cmd(ctx, BG_COLOR_REG, src->color);
>   break;
> - default:
> - fprintf(stderr , "failed to set src.\n");
> - return -EINVAL;
> - }
> -
> - src_w = w;
> - src_h = h;
> - if (src_x + w > src->width)
> - src_w = src->width - src_x;
> - if (src_y + h > src->height)
> - src_h = src->height - src_y;
> -
> - dst_w = w;
> - dst_h = h;
> - if (dst_x + w > dst->width)
> - dst_w = dst->width - dst_x;
> - if (dst_y + h > dst->height)
> - dst_h = dst->height - dst_y;
> -
> - w = MIN(src_w, dst_w);
> - h = MIN(src_h, dst_h);
> -
> - if (w <= 0 || h <= 0) {
> - fprintf(stderr, "invalid width or height.\n");
> - g2d_reset(ctx);
> - return -EINVAL;
>   }
>  
>   bitblt.data.alpha_blend_mode = G2D_ALPHA_BLEND_MODE_ENABLE;
> 



[PATCH 08/14] exynos/fimg2d: check buffer space in g2d_blend()

2015-08-24 Thread Tobias Jakobi
Move parameter validation to the top and also validate
the select mode of the source image and the requested
blending operation before starting command submission.

Signed-off-by: Tobias Jakobi 
---
 exynos/exynos_fimg2d.c | 66 +-
 1 file changed, 39 insertions(+), 27 deletions(-)

diff --git a/exynos/exynos_fimg2d.c b/exynos/exynos_fimg2d.c
index 781aff5..5acccf8 100644
--- a/exynos/exynos_fimg2d.c
+++ b/exynos/exynos_fimg2d.c
@@ -623,7 +623,45 @@ g2d_blend(struct g2d_context *ctx, struct g2d_image *src,
union g2d_point_val pt;
union g2d_bitblt_cmd_val bitblt;
union g2d_blend_func_val blend;
-   unsigned int src_w = 0, src_h = 0, dst_w = 0, dst_h = 0;
+   unsigned int gem_space;
+   unsigned int src_w, src_h, dst_w, dst_h;
+
+   src_w = w;
+   src_h = h;
+   if (src_x + w > src->width)
+   src_w = src->width - src_x;
+   if (src_y + h > src->height)
+   src_h = src->height - src_y;
+
+   dst_w = w;
+   dst_h = h;
+   if (dst_x + w > dst->width)
+   dst_w = dst->width - dst_x;
+   if (dst_y + h > dst->height)
+   dst_h = dst->height - dst_y;
+
+   w = MIN(src_w, dst_w);
+   h = MIN(src_h, dst_h);
+
+   if (w <= 0 || h <= 0) {
+   fprintf(stderr, "invalid width or height.\n");
+   return -EINVAL;
+   }
+
+   if (g2d_validate_select_mode(src->select_mode)) {
+   fprintf(stderr , "invalid select mode for source.\n");
+   return -EINVAL;
+   }
+
+   if (g2d_validate_blending_op(op)) {
+   fprintf(stderr , "unsupported blending operation.\n");
+   return -EINVAL;
+   }
+
+   gem_space = src->select_mode == G2D_SELECT_MODE_NORMAL ? 2 : 1;
+
+   if (g2d_check_space(ctx, 12, gem_space))
+   return -ENOSPC;

bitblt.val = 0;
blend.val = 0;
@@ -651,32 +689,6 @@ g2d_blend(struct g2d_context *ctx, struct g2d_image *src,
case G2D_SELECT_MODE_BGCOLOR:
g2d_add_cmd(ctx, BG_COLOR_REG, src->color);
break;
-   default:
-   fprintf(stderr , "failed to set src.\n");
-   return -EINVAL;
-   }
-
-   src_w = w;
-   src_h = h;
-   if (src_x + w > src->width)
-   src_w = src->width - src_x;
-   if (src_y + h > src->height)
-   src_h = src->height - src_y;
-
-   dst_w = w;
-   dst_h = h;
-   if (dst_x + w > dst->width)
-   dst_w = dst->width - dst_x;
-   if (dst_y + h > dst->height)
-   dst_h = dst->height - dst_y;
-
-   w = MIN(src_w, dst_w);
-   h = MIN(src_h, dst_h);
-
-   if (w <= 0 || h <= 0) {
-   fprintf(stderr, "invalid width or height.\n");
-   g2d_reset(ctx);
-   return -EINVAL;
}

bitblt.data.alpha_blend_mode = G2D_ALPHA_BLEND_MODE_ENABLE;
-- 
2.0.5