The present unix_stream_read_generic contains various code sequences of
the form
err = -EDISASTER;
if (<test>)
goto out;
This has the unfortunate side effect of possibly causing the error code
to bleed through to the final
out:
return copied ? : err;
and then to be wrongly returned if no data was copied because the caller
didn't supply a data buffer, as demonstrated by the program available at
http://pad.lv/1540731
Change it such that err is only set if an error condition was detected.
Signed-off-by: Rainer Weikusat <redacted>
---
With proper subject this time (at least I hope so).
From: Joseph Salisbury <hidden> Date: 2016-02-11 21:32:00
On 02/05/2016 05:30 PM, Rainer Weikusat wrote:
quoted hunk
The present unix_stream_read_generic contains various code sequences of
the form
err = -EDISASTER;
if (<test>)
goto out;
This has the unfortunate side effect of possibly causing the error code
to bleed through to the final
out:
return copied ? : err;
and then to be wrongly returned if no data was copied because the caller
didn't supply a data buffer, as demonstrated by the program available at
http://pad.lv/1540731
Change it such that err is only set if an error condition was detected.
Signed-off-by: Rainer Weikusat <redacted>
---
With proper subject this time (at least I hope so).
From: Ben Hutchings <hidden> Date: 2016-02-13 00:19:28
On Fri, 2016-02-05 at 22:30 +0000, Rainer Weikusat wrote:
The present unix_stream_read_generic contains various code sequences of
the form
err = -EDISASTER;
if ()
goto out;
[...]
I wish people would stop writing code like this. At one time it may
have been a useful micro-optimisation, avoiding an extra branch in the
successful case, but gcc now appears to do that itself. So it makes
the code less clear and runs the risk of introducing this sort of bug,
for no obvious benefit.
Ben.
--
Ben Hutchings
Sturgeon's Law: Ninety percent of everything is crap.