diff mbox

[U-Boot] Fix bad return value checks (detected with Coccinelle)

Message ID 55DC8534.6060900@tuxfamily.org
State Accepted
Delegated to: Tom Rini
Headers show

Commit Message

Thomas Huth Aug. 25, 2015, 3:09 p.m. UTC
In the "Getting Started with Coccinelle - KVM edition" presentation that
has been held by Julia Lawall at the KVM forum 2015 (see the slides at
http://events.linuxfoundation.org/sites/events/files/slides/tutorial_kvm_0.pdf),
she pointed out some bad return value checks in U-Boot that can be
detected with Coccinelle by using the following config file:

@@
identifier x,y;
identifier f;
statement S;
@@
x = f(...);
(
 if (x < 0) S
|
 if (
-     y
+     x
 < 0) S
)

This patch now fixes these issues.

Signed-off-by: Thomas Huth <huth@tuxfamily.org>
---
 Note: I haven't tested this patch at all, so please review carefully.
 I just wanted to let you know about these issues in case you haven't
 been aware of them yet. And in case if somebody else already reported
 them, please excuse the double information, I wasn't reading the
 u-boot mailing list so far yet.

Comments

Thomas Huth Aug. 29, 2015, 9:59 a.m. UTC | #1
Am Tue, 25 Aug 2015 17:09:40 +0200
schrieb Thomas Huth <huth@tuxfamily.org>:

> In the "Getting Started with Coccinelle - KVM edition" presentation
> that has been held by Julia Lawall at the KVM forum 2015 (see the
> slides at
> http://events.linuxfoundation.org/sites/events/files/slides/tutorial_kvm_0.pdf),
> she pointed out some bad return value checks in U-Boot that can be
> detected with Coccinelle by using the following config file:
> 
> @@
> identifier x,y;
> identifier f;
> statement S;
> @@
> x = f(...);
> (
>  if (x < 0) S
> |
>  if (
> -     y
> +     x
>  < 0) S
> )
> 
> This patch now fixes these issues.
> 
> Signed-off-by: Thomas Huth <huth@tuxfamily.org>
> ---
>  Note: I haven't tested this patch at all, so please review carefully.
>  I just wanted to let you know about these issues in case you haven't
>  been aware of them yet. And in case if somebody else already reported
>  them, please excuse the double information, I wasn't reading the
>  u-boot mailing list so far yet.
> 
> diff -u -p a/board/samsung/origen/tools/mkorigenspl.c
> b/board/samsung/origen/tools/mkorigenspl.c ---
> a/board/samsung/origen/tools/mkorigenspl.c +++
> b/board/samsung/origen/tools/mkorigenspl.c @@ -52,7 +52,7 @@ int
> main(int argc, char **argv) }
>  
>  	ofd = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, FILE_PERM);
> -	if (ifd < 0) {
> +	if (ofd < 0) {
>  		fprintf(stderr, "%s: Can't open %s: %s\n",
>  			argv[0], argv[2], strerror(errno));
>  		if (ifd)
> diff -u -p a/board/samsung/smdkv310/tools/mksmdkv310spl.c
> b/board/samsung/smdkv310/tools/mksmdkv310spl.c ---
> a/board/samsung/smdkv310/tools/mksmdkv310spl.c +++
> b/board/samsung/smdkv310/tools/mksmdkv310spl.c @@ -50,7 +50,7 @@ int
> main(int argc, char **argv) }
>  
>  	ofd = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, FILE_PERM);
> -	if (ifd < 0) {
> +	if (ofd < 0) {
>  		fprintf(stderr, "%s: Can't open %s: %s\n",
>  			argv[0], argv[2], strerror(errno));
>  		if (ifd)
> diff -u -p a/drivers/hwmon/lm81.c b/drivers/hwmon/lm81.c
> --- a/drivers/hwmon/lm81.c
> +++ b/drivers/hwmon/lm81.c
> @@ -90,7 +90,7 @@ int dtt_init_one(int sensor)
>  	if (adr < 0)
>  		return 1;
>  	rev = dtt_read (sensor, DTT_REV);
> -	if (adr < 0)
> +	if (rev < 0)
>  		return 1;
>  
>  	debug ("DTT:   Found LM81@%x Rev: %d\n", adr, rev);
> diff -u -p a/tools/fit_check_sign.c b/tools/fit_check_sign.c
> --- a/tools/fit_check_sign.c
> +++ b/tools/fit_check_sign.c
> @@ -75,7 +75,7 @@ int main(int argc, char **argv)
>  	if (ffd < 0)
>  		return EXIT_FAILURE;
>  	kfd = mmap_fdt(cmdname, keyfile, 0, &key_blob, &ksbuf,
> false);
> -	if (ffd < 0)
> +	if (kfd < 0)
>  		return EXIT_FAILURE;
>  
>  	image_set_host_blob(key_blob);
> diff -u -p a/tools/mkexynosspl.c b/tools/mkexynosspl.c
> --- a/tools/mkexynosspl.c
> +++ b/tools/mkexynosspl.c
> @@ -110,7 +110,7 @@ int main(int argc, char **argv)
>  	}
>  
>  	ofd = open(argv[of_index], O_WRONLY | O_CREAT | O_TRUNC,
> FILE_PERM);
> -	if (ifd < 0) {
> +	if (ofd < 0) {
>  		fprintf(stderr, "%s: Can't open %s: %s\n",
>  			prog_name, argv[of_index], strerror(errno));
>  		exit(EXIT_FAILURE);

ping ... now with maintainers on CC: :-)

 Regards,
  Thomas
Fabio Estevam Aug. 30, 2015, 5:33 p.m. UTC | #2
On Tue, Aug 25, 2015 at 12:09 PM, Thomas Huth <huth@tuxfamily.org> wrote:

> This patch now fixes these issues.
>
> Signed-off-by: Thomas Huth <huth@tuxfamily.org>
> ---
>  Note: I haven't tested this patch at all, so please review carefully.
>  I just wanted to let you know about these issues in case you haven't
>  been aware of them yet. And in case if somebody else already reported
>  them, please excuse the double information, I wasn't reading the
>  u-boot mailing list so far yet.

You should split these changes into multiple patches.

Regards,

Fabio Estevam
Tom Rini Oct. 24, 2015, 9:15 p.m. UTC | #3
On Tue, Aug 25, 2015 at 05:09:40PM +0200, Thomas Huth wrote:

> In the "Getting Started with Coccinelle - KVM edition" presentation that
> has been held by Julia Lawall at the KVM forum 2015 (see the slides at
> http://events.linuxfoundation.org/sites/events/files/slides/tutorial_kvm_0.pdf),
> she pointed out some bad return value checks in U-Boot that can be
> detected with Coccinelle by using the following config file:
> 
> @@
> identifier x,y;
> identifier f;
> statement S;
> @@
> x = f(...);
> (
>  if (x < 0) S
> |
>  if (
> -     y
> +     x
>  < 0) S
> )
> 
> This patch now fixes these issues.
> 
> Signed-off-by: Thomas Huth <huth@tuxfamily.org>

Applied to u-boot/master, thanks!
diff mbox

Patch

diff -u -p a/board/samsung/origen/tools/mkorigenspl.c b/board/samsung/origen/tools/mkorigenspl.c
--- a/board/samsung/origen/tools/mkorigenspl.c
+++ b/board/samsung/origen/tools/mkorigenspl.c
@@ -52,7 +52,7 @@  int main(int argc, char **argv)
 	}
 
 	ofd = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, FILE_PERM);
-	if (ifd < 0) {
+	if (ofd < 0) {
 		fprintf(stderr, "%s: Can't open %s: %s\n",
 			argv[0], argv[2], strerror(errno));
 		if (ifd)
diff -u -p a/board/samsung/smdkv310/tools/mksmdkv310spl.c b/board/samsung/smdkv310/tools/mksmdkv310spl.c
--- a/board/samsung/smdkv310/tools/mksmdkv310spl.c
+++ b/board/samsung/smdkv310/tools/mksmdkv310spl.c
@@ -50,7 +50,7 @@  int main(int argc, char **argv)
 	}
 
 	ofd = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, FILE_PERM);
-	if (ifd < 0) {
+	if (ofd < 0) {
 		fprintf(stderr, "%s: Can't open %s: %s\n",
 			argv[0], argv[2], strerror(errno));
 		if (ifd)
diff -u -p a/drivers/hwmon/lm81.c b/drivers/hwmon/lm81.c
--- a/drivers/hwmon/lm81.c
+++ b/drivers/hwmon/lm81.c
@@ -90,7 +90,7 @@  int dtt_init_one(int sensor)
 	if (adr < 0)
 		return 1;
 	rev = dtt_read (sensor, DTT_REV);
-	if (adr < 0)
+	if (rev < 0)
 		return 1;
 
 	debug ("DTT:   Found LM81@%x Rev: %d\n", adr, rev);
diff -u -p a/tools/fit_check_sign.c b/tools/fit_check_sign.c
--- a/tools/fit_check_sign.c
+++ b/tools/fit_check_sign.c
@@ -75,7 +75,7 @@  int main(int argc, char **argv)
 	if (ffd < 0)
 		return EXIT_FAILURE;
 	kfd = mmap_fdt(cmdname, keyfile, 0, &key_blob, &ksbuf, false);
-	if (ffd < 0)
+	if (kfd < 0)
 		return EXIT_FAILURE;
 
 	image_set_host_blob(key_blob);
diff -u -p a/tools/mkexynosspl.c b/tools/mkexynosspl.c
--- a/tools/mkexynosspl.c
+++ b/tools/mkexynosspl.c
@@ -110,7 +110,7 @@  int main(int argc, char **argv)
 	}
 
 	ofd = open(argv[of_index], O_WRONLY | O_CREAT | O_TRUNC, FILE_PERM);
-	if (ifd < 0) {
+	if (ofd < 0) {
 		fprintf(stderr, "%s: Can't open %s: %s\n",
 			prog_name, argv[of_index], strerror(errno));
 		exit(EXIT_FAILURE);