Files
kernel_amazon_mt8127-common/fs
Al Viro 75894adb0c leak in O_DIRECT readv past the EOF
In all versions from 2.5.62 to 3.15, on each iteration through the loop
by iovec array in do_blockdev_direct_IO() we used to do this:
                sdio.head = 0;
                sdio.tail = 0;
...
                retval = do_direct_IO(dio, &sdio, &map_bh);

                if (retval) {
                        dio_cleanup(dio, &sdio);
                        break;
                }

with another dio_cleanup() done after the loop, catching the situation when
retval had been 0.  Consider the situation when e.g. the 3rd iovec in 4-iovec
array passed to readv() has crossed the EOF.  do_direct_IO() returns 0 and
buggers off *without* exhausting the page array.  The loop proceeds to the
next iovec without calling dio_cleanup() and resets sdio.head and sdio.tail.
That reset of sdio.{head,tail} has prevented the eventual dio_cleanup() from
seeing anything and the page reference end up leaking.

Commit 7b2c99d15559 (new helper: iov_iter_get_pages()) in 3.16 had eliminated
the loop by iovec array, along with sdio.head and sdio.tail resets.  Backporting
that is too much work - the minimal fix is simply to make sure that the only case
when do_direct_IO() buggers off early without returning non-zero will not skip
dio_cleanup().

The fix applies to all versions from 2.5.62 to 3.15.

Reported-and-tested-by: Venki Pallipadi <venki@cohesity.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Willy Tarreau <w@1wt.eu>
2017-11-01 22:12:42 +01:00
..
2013-05-07 20:16:25 -07:00
2017-06-08 00:47:01 +02:00
2013-04-29 15:41:42 -04:00
2013-03-23 14:15:31 -07:00
2013-05-07 20:16:25 -07:00
2016-02-19 14:22:39 -08:00
2016-02-25 11:57:46 -08:00
2013-04-29 15:40:23 -04:00
2013-10-05 07:13:09 -07:00
2013-05-07 20:16:25 -07:00
2015-07-03 19:48:08 -07:00
2015-07-10 10:40:22 -07:00
2015-07-03 19:48:08 -07:00
2013-04-17 13:25:09 +01:00
2015-07-03 19:48:08 -07:00
2013-05-31 15:16:33 -04:00
2017-02-10 11:03:29 +01:00