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 majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to