Bug introduced in 3b93f911d5

From: Anton Altaparmakov
Date: Thu Aug 07 2014 - 19:11:59 EST


Hi Al,

Was just looking at __generic_file_write_iter() and found a bug in the code that you added in 3b93f911d5.

Consider the case where generic_file_direct_write() returns a partial write, i.e. written > 0 && written < count.

Also consider that the following generic_perform_write() fails with an error, i.e. status < 0.

This code then does something very bogus:

if (unlikely(status < 0) && !written) {
err = status;
goto out;
}
iocb->ki_pos = pos + status;
...
endbyte = pos + status - 1;

The if condition is false as written is > 0 yet status is negative thus iocb->ki_pos is set to pos + status where status is negative thus ki_pos is actually set to "pos - random value".

And similar for "endbyte" being set to "pos - random value - 1", etc.

Doesn't seem like that is what you intended?

Best regards,

Anton
--
Anton Altaparmakov <aia21 at cam.ac.uk> (replace at with @)
University of Cambridge Information Services, Roger Needham Building
7 JJ Thomson Avenue, Cambridge, CB3 0RB, UK

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/