# \[PATCH 00/11\] fix error return code

- Subsystems: FRAMEBUFFER LAYER, OMAP DISPLAY SUBSYSTEM and FRAMEBUFFER SUPPORT (DSS2), ARM/ARTPEC MACHINE SUPPORT, BLOCK LAYER, DRM DRIVERS, DRM DRIVERS AND MISC GPU PATCHES, DRM DRIVERS FOR EXYNOS, DRM DRIVERS FOR GMA500 (Poulsbo, Moorestown and derivative chipsets), DRM DRIVERS FOR TI OMAP, GPIO SUBSYSTEM, INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN) DRIVERS, MELLANOX ETHERNET SWITCH DRIVERS, MULTIMEDIA CARD (MMC), SECURE DIGITAL (SD) AND SDIO SUBSYSTEM, NETWORKING DRIVERS, NETWORKING \[GENERAL\], NETWORKING \[IPSEC\], OMAP MMC SUPPORT, THE REST, TI ETHERNET SWITCH DRIVER (CPSW), TI KEYSTONE MULTICORE NAVIGATOR DRIVERS, USB GADGET/PERIPHERAL SUBSYSTEM, USB SUBSYSTEM
- Maintainers: Helge Deller, Jesper Nilsson, Lars Persson, Jens Axboe, David Airlie, Simona Vetter, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, Inki Dae, Seung-Woo Kim, Kyungmin Park, Patrik Jakobsson, Tomi Valkeinen, Linus Walleij, Bartosz Golaszewski, Dmitry Torokhov, Ido Schimmel, Petr Machata, Ulf Hansson, Andrew Lunn, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Steffen Klassert, Herbert Xu, Aaro Koskinen, Linus Torvalds, Nishanth Menon, Santosh Shilimkar, Neill Kapron, Greg Kroah-Hartman
- Series: 11 patches touching 12 files, +27/-9
- List: linux-fbdev
- 3 messages, 2 authors
- Page: https://ratatoskr.run/linux-fbdev/2015/08/4562177/t

## \[PATCH 00/11\] fix error return code

- From: Julia Lawall \<hidden\>
- Date: 2015-08-23 00:21:50 
- Message: https://ratatoskr.run/linux-fbdev/2015/08/4562177.md

```text
The complate semantic patch that finds this problem is as follows:
(http://coccinelle.lip6.fr/)

// <smpl>
@ok exists@
identifier f,ret,i;
expression e;
constant c;
@@

// identify a function that returns a negative return value at least once.
f(...) {
... when any
(
return -c@i;
|
ret = -c@i;
... when != ret = e
return ret;
|
if (ret < 0) { ... return ret; }
)
... when any
}

@r exists@
identifier ret,ok.f,fn;
expression e1,e2,e3,e4,e5,e6,x;
statement S,S1;
position p1,p2,p3;
@@

// identify a case where the return variable is set to a non-negative value
// and then returned in error-handling code
f(...) {
... when any
(
if@p1 (\(ret < 0\|ret != 0\))
 { ... return ret; }
|
ret@p1 = 0
)
... when != \(ret = e1\|ret++\|ret--\|ret+á\|ret-á\)
    when != &ret
    when any
(
 if (<+... ret = e5 ...+>) S1
|
 if (<+... &ret ...+>) S1
|
if@p2(<+...x = fn(...)...+>)
 {
  ... when != ret = e6
      when forall
 return@p3 ret;
}
|
break;
|
x = fn(...)
... when != \(ret = e4\|ret++\|ret--\|ret+ä\|ret-ä\)
    when != &ret
(
 if (<+... ret = e3 ...+>) S
|
 if (<+... &ret ...+>) S
|
if@p2(<+...\(x != 0\|x < 0\|x = NULL\|IS_ERR(x)\)...+>)
 {
  ... when != ret = e2
      when forall
 return@p3 ret;
}
)
)
... when any
}

@printer depends on r@
position p;
identifier ok.f,pr;
constant char [] c;
@@

f(...) { <...pr@p(...,c,...)...> }

@bad0 exists@
identifier r.ret,ok.f,g != {ERR_PTR,IS_ERR};
position p != printer.p;
@@

f(...) { ... when any
g@p(...,ret,...)
... when any
 }

@bad depends on !bad0 exists@
position r.p1,r.p2;
statement S1,S2;
identifier r.ret;
expression e1;
@@

// ignore the above if there is some path where the variable is set to
// something else
(
if@p1 (\(ret < 0\|ret != 0\)) S1
|
ret@p1 = 0
)
... when any
 \(ret = e1\|ret++\|ret--\|ret+á\|ret-á\|&ret\)
... when any
if@p2(...) S2

@bad1 depends on !bad0 && !bad exists@
position r.p2;
statement S2;
identifier r.ret;
expression e1;
constant c;
@@

ret = -c
... when != \(ret = e1\|ret++\|ret--\|ret+á\|ret-á\)
    when != &ret
    when any
if@p2(...) S2

@bad2 depends on !bad0 && !bad && !bad1 exists@
position r.p1,r.p2;
identifier r.ret;
expression e1;
statement S2;
constant c;
@@

// likewise ignore it if there has been an intervening return
ret@p1 = 0
... when != if (...) { ... ret = e1 ... return ret; }
    when != if (...) { ... return -c; }
    when any
if@p2(...) S2

@script:python depends on !bad0 && !bad && !bad1 && !bad2@
p1 << r.p1;
p2 << r.p2;
p3 << r.p3;
@@

cocci.print_main("",p1)
cocci.print_secs("",p2)
cocci.print_secs("",p3)
// </smpl>

```

## \[PATCH 04/11\] fbdev: ssd1307fb: fix error return code

- From: Julia Lawall \<hidden\>
- Date: 2015-08-23 00:22:06 
- Message: https://ratatoskr.run/linux-fbdev/2015/08/4562181.md

```text
Propagate error code on failure.  Also changed %ld to %d in dev_err to use
ret variable rather than putting two calls to PTR_ERR.

A simplified version of the semantic match that finds the first problem is as
follows: (http://coccinelle.lip6.fr/)

// <smpl>
@@
identifier ret; expression e1,e2;
@@
(
if (\(ret < 0\|ret != 0\))
 { ... return ret; }
|
ret = 0
)
... when != ret = e1
    when != &ret
*if(...)
{
  ... when != ret = e2
      when forall
 return ret;
}
// </smpl>

Signed-off-by: Julia Lawall <redacted>

---
 drivers/video/fbdev/ssd1307fb.c |    5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 3e153c0..1611215 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -656,8 +656,9 @@ static int ssd1307fb_probe(struct i2c_client *client,
 	bl = backlight_device_register(bl_name, &client->dev, par,
 				       &ssd1307fb_bl_ops, NULL);
 	if (IS_ERR(bl)) {
-		dev_err(&client->dev, "unable to register backlight device: %ld\n",
-			PTR_ERR(bl));
+		ret = PTR_ERR(bl);
+		dev_err(&client->dev, "unable to register backlight device: %d\n",
+			ret);
 		goto bl_init_error;
 	}
 
```

## Re: \[PATCH 04/11\] fbdev: ssd1307fb: fix error return code

- From: Tomi Valkeinen \<hidden\>
- Date: 2015-09-01 10:40:08 
- Message: https://ratatoskr.run/linux-fbdev/2015/09/4567550.md

```text


On 23/08/15 03:11, Julia Lawall wrote:
> Propagate error code on failure.  Also changed %ld to %d in dev_err to use
> ret variable rather than putting two calls to PTR_ERR.
> 
> A simplified version of the semantic match that finds the first problem is as
> follows: (http://coccinelle.lip6.fr/)
> 
> // <smpl>
> @@
> identifier ret; expression e1,e2;
> @@
> (
> if (\(ret < 0\|ret != 0\))
>  { ... return ret; }
> |
> ret = 0
> )
> ... when != ret = e1
>     when != &ret
> *if(...)
> {
>   ... when != ret = e2
>       when forall
>  return ret;
> }
> // </smpl>
> 
> Signed-off-by: Julia Lawall <redacted>
> 
> ---
>  drivers/video/fbdev/ssd1307fb.c |    5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
> index 3e153c0..1611215 100644
> --- a/drivers/video/fbdev/ssd1307fb.c
> +++ b/drivers/video/fbdev/ssd1307fb.c
> @@ -656,8 +656,9 @@ static int ssd1307fb_probe(struct i2c_client *client,
>  	bl = backlight_device_register(bl_name, &client->dev, par,
>  				       &ssd1307fb_bl_ops, NULL);
>  	if (IS_ERR(bl)) {
> -		dev_err(&client->dev, "unable to register backlight device: %ld\n",
> -			PTR_ERR(bl));
> +		ret = PTR_ERR(bl);
> +		dev_err(&client->dev, "unable to register backlight device: %d\n",
> +			ret);
>  		goto bl_init_error;
>  	}

Thanks, queued for 4.3.

 Tomi

```
