diff mbox

drm/vc4: fix a bounds check

Message ID 20170113074900.GB30524@mwanda (mailing list archive)
State New, archived
Headers show

Commit Message

Dan Carpenter Jan. 13, 2017, 7:49 a.m. UTC
We accidentally return success even if vc4_full_res_bounds_check() fails.

Fixes: d5b1a78a772f ("drm/vc4: Add support for drawing 3D frames.")
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
---
Not tested.

Comments

Eric Engestrom Jan. 16, 2017, 11:40 p.m. UTC | #1
On Friday, 2017-01-13 10:49:00 +0300, Dan Carpenter wrote:
> We accidentally return success even if vc4_full_res_bounds_check() fails.
> 
> Fixes: d5b1a78a772f ("drm/vc4: Add support for drawing 3D frames.")
> Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
> ---
> Not tested.

It would be good to test it, but the previous code would always return 0,
and from a quick look the callers expect non-zero values on error, so
this makes more sense at least.
Reviewed-by: Eric Engestrom <eric@engestrom.ch>

> 
> diff --git a/drivers/gpu/drm/vc4/vc4_render_cl.c b/drivers/gpu/drm/vc4/vc4_render_cl.c
> index 08886a3..5cdd003 100644
> --- a/drivers/gpu/drm/vc4/vc4_render_cl.c
> +++ b/drivers/gpu/drm/vc4/vc4_render_cl.c
> @@ -461,7 +461,7 @@ static int vc4_rcl_surface_setup(struct vc4_exec_info *exec,
>  		}
>  
>  		ret = vc4_full_res_bounds_check(exec, *obj, surf);
> -		if (!ret)
> +		if (ret)
>  			return ret;
>  
>  		return 0;

This now boils down to `return vc4_full_res_bounds_check(...);`, so you
could get rid of the `ret` variable completely :)
Dan Carpenter Jan. 17, 2017, 7:42 a.m. UTC | #2
On Mon, Jan 16, 2017 at 11:40:10PM +0000, Eric Engestrom wrote:
> > diff --git a/drivers/gpu/drm/vc4/vc4_render_cl.c b/drivers/gpu/drm/vc4/vc4_render_cl.c
> > index 08886a3..5cdd003 100644
> > --- a/drivers/gpu/drm/vc4/vc4_render_cl.c
> > +++ b/drivers/gpu/drm/vc4/vc4_render_cl.c
> > @@ -461,7 +461,7 @@ static int vc4_rcl_surface_setup(struct vc4_exec_info *exec,
> >  		}
> >  
> >  		ret = vc4_full_res_bounds_check(exec, *obj, surf);
> > -		if (!ret)
> > +		if (ret)
> >  			return ret;
> >  
> >  		return 0;
> 
> This now boils down to `return vc4_full_res_bounds_check(...);`, so you
> could get rid of the `ret` variable completely :)

I tried to leave it the original style which the author intended.
That's also my prefered style.  I like big chunky "return 0;".  I
actually found this bug by looking at places where people return a
variable where a literal would work:

	if (!ret)
		return ret;

It's ambiguos if they intended to return a negative, or if they
condition is reversed.  The other reason why I slightly prefer his style
is because people get so "clever" with the last condition in a function
and it drives me nuts.  They'll do a series of checks like this:

	if (fail)
		goto;
	if (fail)
		goto;
	if (fail)
		goto;
	if (success)
		return;
label:

We should be testing for failure generally, but this particular kind of
success check is like nails on a chalk board for me.  My younger self
is guilty of this cleverness as well....

Of course, the other way: "return vc4_full_res_bounds_check();" is
fine too.  It's not something that bothers me.  I guess I just would
do whatever the original author prefers.

regards,
dan carpenter
Eric Anholt Jan. 17, 2017, 10:18 a.m. UTC | #3
Dan Carpenter <dan.carpenter@oracle.com> writes:

> We accidentally return success even if vc4_full_res_bounds_check() fails.
>
> Fixes: d5b1a78a772f ("drm/vc4: Add support for drawing 3D frames.")
> Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>

Thanks.  Reviewed, added Eric's review, and pushed to -fixes.
diff mbox

Patch

diff --git a/drivers/gpu/drm/vc4/vc4_render_cl.c b/drivers/gpu/drm/vc4/vc4_render_cl.c
index 08886a3..5cdd003 100644
--- a/drivers/gpu/drm/vc4/vc4_render_cl.c
+++ b/drivers/gpu/drm/vc4/vc4_render_cl.c
@@ -461,7 +461,7 @@  static int vc4_rcl_surface_setup(struct vc4_exec_info *exec,
 		}
 
 		ret = vc4_full_res_bounds_check(exec, *obj, surf);
-		if (!ret)
+		if (ret)
 			return ret;
 
 		return 0;