diff mbox series

dma-buf: st: fix error handling in test_get_fences()

Message ID 20211026083448.3471055-1-arnd@kernel.org
State New
Headers show
Series dma-buf: st: fix error handling in test_get_fences() | expand

Commit Message

Arnd Bergmann Oct. 26, 2021, 8:34 a.m. UTC
From: Arnd Bergmann <arnd@arndb.de>


The new driver incorrectly unwinds after errors, as clang points out:

drivers/dma-buf/st-dma-resv.c:295:7: error: variable 'i' is used uninitialized whenever 'if' condition is true [-Werror,-Wsometimes-uninitialized]
                if (r) {
                    ^
drivers/dma-buf/st-dma-resv.c:336:9: note: uninitialized use occurs here
        while (i--)
               ^
drivers/dma-buf/st-dma-resv.c:295:3: note: remove the 'if' if its condition is always false
                if (r) {
                ^~~~~~~~
drivers/dma-buf/st-dma-resv.c:288:6: error: variable 'i' is used uninitialized whenever 'if' condition is true [-Werror,-Wsometimes-uninitialized]
        if (r) {
            ^
drivers/dma-buf/st-dma-resv.c:336:9: note: uninitialized use occurs here
        while (i--)
               ^
drivers/dma-buf/st-dma-resv.c:288:2: note: remove the 'if' if its condition is always false
        if (r) {
        ^~~~~~~~
drivers/dma-buf/st-dma-resv.c:280:10: note: initialize the variable 'i' to silence this warning
        int r, i;
                ^
                 = 0

Skip cleaning up the bits that have not been allocated at this point.

Fixes: 1d51775cd3f5 ("dma-buf: add dma_resv selftest v4")
Signed-off-by: Arnd Bergmann <arnd@arndb.de>

---
I'm not familiar with these interfaces, so I'm just guessing where
we should jump after an error, please double-check and fix if necessary.
---
 drivers/dma-buf/st-dma-resv.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

-- 
2.29.2

Comments

Christian König Oct. 26, 2021, 10:55 a.m. UTC | #1
Am 26.10.21 um 10:34 schrieb Arnd Bergmann:
> From: Arnd Bergmann <arnd@arndb.de>

>

> The new driver incorrectly unwinds after errors, as clang points out:

>

> drivers/dma-buf/st-dma-resv.c:295:7: error: variable 'i' is used uninitialized whenever 'if' condition is true [-Werror,-Wsometimes-uninitialized]

>                  if (r) {

>                      ^

> drivers/dma-buf/st-dma-resv.c:336:9: note: uninitialized use occurs here

>          while (i--)

>                 ^

> drivers/dma-buf/st-dma-resv.c:295:3: note: remove the 'if' if its condition is always false

>                  if (r) {

>                  ^~~~~~~~

> drivers/dma-buf/st-dma-resv.c:288:6: error: variable 'i' is used uninitialized whenever 'if' condition is true [-Werror,-Wsometimes-uninitialized]

>          if (r) {

>              ^

> drivers/dma-buf/st-dma-resv.c:336:9: note: uninitialized use occurs here

>          while (i--)

>                 ^

> drivers/dma-buf/st-dma-resv.c:288:2: note: remove the 'if' if its condition is always false

>          if (r) {

>          ^~~~~~~~

> drivers/dma-buf/st-dma-resv.c:280:10: note: initialize the variable 'i' to silence this warning

>          int r, i;

>                  ^

>                   = 0

>

> Skip cleaning up the bits that have not been allocated at this point.

>

> Fixes: 1d51775cd3f5 ("dma-buf: add dma_resv selftest v4")

> Signed-off-by: Arnd Bergmann <arnd@arndb.de>


I already send out a patch to fix this up, but forgot to fix both gotos.

Going to add my rb and using that one here instead.

Thanks,
Christian.

> ---

> I'm not familiar with these interfaces, so I'm just guessing where

> we should jump after an error, please double-check and fix if necessary.

> ---

>   drivers/dma-buf/st-dma-resv.c | 5 +++--

>   1 file changed, 3 insertions(+), 2 deletions(-)

>

> diff --git a/drivers/dma-buf/st-dma-resv.c b/drivers/dma-buf/st-dma-resv.c

> index 6f3ba756da3e..bc32b3eedcb6 100644

> --- a/drivers/dma-buf/st-dma-resv.c

> +++ b/drivers/dma-buf/st-dma-resv.c

> @@ -287,7 +287,7 @@ static int test_get_fences(void *arg, bool shared)

>   	r = dma_resv_lock(&resv, NULL);

>   	if (r) {

>   		pr_err("Resv locking failed\n");

> -		goto err_free;

> +		goto err_resv;

>   	}

>   

>   	if (shared) {

> @@ -295,7 +295,7 @@ static int test_get_fences(void *arg, bool shared)

>   		if (r) {

>   			pr_err("Resv shared slot allocation failed\n");

>   			dma_resv_unlock(&resv);

> -			goto err_free;

> +			goto err_resv;

>   		}

>   

>   		dma_resv_add_shared_fence(&resv, f);

> @@ -336,6 +336,7 @@ static int test_get_fences(void *arg, bool shared)

>   	while (i--)

>   		dma_fence_put(fences[i]);

>   	kfree(fences);

> +err_resv:

>   	dma_resv_fini(&resv);

>   	dma_fence_put(f);

>   	return r;
Nathan Chancellor Oct. 26, 2021, 2:04 p.m. UTC | #2
On Tue, Oct 26, 2021 at 10:34:37AM +0200, Arnd Bergmann wrote:
> From: Arnd Bergmann <arnd@arndb.de>

> 

> The new driver incorrectly unwinds after errors, as clang points out:

> 

> drivers/dma-buf/st-dma-resv.c:295:7: error: variable 'i' is used uninitialized whenever 'if' condition is true [-Werror,-Wsometimes-uninitialized]

>                 if (r) {

>                     ^

> drivers/dma-buf/st-dma-resv.c:336:9: note: uninitialized use occurs here

>         while (i--)

>                ^

> drivers/dma-buf/st-dma-resv.c:295:3: note: remove the 'if' if its condition is always false

>                 if (r) {

>                 ^~~~~~~~

> drivers/dma-buf/st-dma-resv.c:288:6: error: variable 'i' is used uninitialized whenever 'if' condition is true [-Werror,-Wsometimes-uninitialized]

>         if (r) {

>             ^

> drivers/dma-buf/st-dma-resv.c:336:9: note: uninitialized use occurs here

>         while (i--)

>                ^

> drivers/dma-buf/st-dma-resv.c:288:2: note: remove the 'if' if its condition is always false

>         if (r) {

>         ^~~~~~~~

> drivers/dma-buf/st-dma-resv.c:280:10: note: initialize the variable 'i' to silence this warning

>         int r, i;

>                 ^

>                  = 0

> 

> Skip cleaning up the bits that have not been allocated at this point.

> 

> Fixes: 1d51775cd3f5 ("dma-buf: add dma_resv selftest v4")

> Signed-off-by: Arnd Bergmann <arnd@arndb.de>


Reviewed-by: Nathan Chancellor <nathan@kernel.org>


> ---

> I'm not familiar with these interfaces, so I'm just guessing where

> we should jump after an error, please double-check and fix if necessary.

> ---

>  drivers/dma-buf/st-dma-resv.c | 5 +++--

>  1 file changed, 3 insertions(+), 2 deletions(-)

> 

> diff --git a/drivers/dma-buf/st-dma-resv.c b/drivers/dma-buf/st-dma-resv.c

> index 6f3ba756da3e..bc32b3eedcb6 100644

> --- a/drivers/dma-buf/st-dma-resv.c

> +++ b/drivers/dma-buf/st-dma-resv.c

> @@ -287,7 +287,7 @@ static int test_get_fences(void *arg, bool shared)

>  	r = dma_resv_lock(&resv, NULL);

>  	if (r) {

>  		pr_err("Resv locking failed\n");

> -		goto err_free;

> +		goto err_resv;

>  	}

>  

>  	if (shared) {

> @@ -295,7 +295,7 @@ static int test_get_fences(void *arg, bool shared)

>  		if (r) {

>  			pr_err("Resv shared slot allocation failed\n");

>  			dma_resv_unlock(&resv);

> -			goto err_free;

> +			goto err_resv;

>  		}

>  

>  		dma_resv_add_shared_fence(&resv, f);

> @@ -336,6 +336,7 @@ static int test_get_fences(void *arg, bool shared)

>  	while (i--)

>  		dma_fence_put(fences[i]);

>  	kfree(fences);

> +err_resv:

>  	dma_resv_fini(&resv);

>  	dma_fence_put(f);

>  	return r;

> -- 

> 2.29.2

>
diff mbox series

Patch

diff --git a/drivers/dma-buf/st-dma-resv.c b/drivers/dma-buf/st-dma-resv.c
index 6f3ba756da3e..bc32b3eedcb6 100644
--- a/drivers/dma-buf/st-dma-resv.c
+++ b/drivers/dma-buf/st-dma-resv.c
@@ -287,7 +287,7 @@  static int test_get_fences(void *arg, bool shared)
 	r = dma_resv_lock(&resv, NULL);
 	if (r) {
 		pr_err("Resv locking failed\n");
-		goto err_free;
+		goto err_resv;
 	}
 
 	if (shared) {
@@ -295,7 +295,7 @@  static int test_get_fences(void *arg, bool shared)
 		if (r) {
 			pr_err("Resv shared slot allocation failed\n");
 			dma_resv_unlock(&resv);
-			goto err_free;
+			goto err_resv;
 		}
 
 		dma_resv_add_shared_fence(&resv, f);
@@ -336,6 +336,7 @@  static int test_get_fences(void *arg, bool shared)
 	while (i--)
 		dma_fence_put(fences[i]);
 	kfree(fences);
+err_resv:
 	dma_resv_fini(&resv);
 	dma_fence_put(f);
 	return r;