Files
linux/include/linux
Jann Horn a0ce2f0aa6 splice: don't merge into linked buffers
Before this patch, it was possible for two pipes to affect each other after
data had been transferred between them with tee():

============
$ cat tee_test.c

int main(void) {
  int pipe_a[2];
  if (pipe(pipe_a)) err(1, "pipe");
  int pipe_b[2];
  if (pipe(pipe_b)) err(1, "pipe");
  if (write(pipe_a[1], "abcd", 4) != 4) err(1, "write");
  if (tee(pipe_a[0], pipe_b[1], 2, 0) != 2) err(1, "tee");
  if (write(pipe_b[1], "xx", 2) != 2) err(1, "write");

  char buf[5];
  if (read(pipe_a[0], buf, 4) != 4) err(1, "read");
  buf[4] = 0;
  printf("got back: '%s'\n", buf);
}
$ gcc -o tee_test tee_test.c
$ ./tee_test
got back: 'abxx'
$
============

As suggested by Al Viro, fix it by creating a separate type for
non-mergeable pipe buffers, then changing the types of buffers in
splice_pipe_to_pipe() and link_pipe().

Cc: <stable@vger.kernel.org>
Fixes: 7c77f0b3f9 ("splice: implement pipe to pipe splicing")
Fixes: 70524490ee ("[PATCH] splice: add support for sys_tee()")
Suggested-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Jann Horn <jannh@google.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
2019-02-01 02:01:45 -05:00
..
2018-11-14 10:56:33 -08:00
2018-12-11 09:57:47 -08:00
2018-10-16 11:13:50 +02:00
2018-11-12 10:33:49 +01:00
2018-05-26 09:16:44 +02:00
2018-06-15 18:10:01 -03:00
2018-11-26 18:41:21 -05:00
2018-12-07 22:26:38 -07:00
2018-12-18 17:50:47 +01:00
2018-11-07 13:44:59 -07:00
2018-11-07 13:44:59 -07:00
2018-12-18 17:50:47 +01:00
2018-10-19 13:24:31 -07:00
2018-09-06 15:12:24 -06:00
2017-11-15 18:21:04 -08:00
2018-06-15 18:10:01 -03:00
2018-03-26 15:09:38 +02:00
2018-08-22 10:52:48 -07:00
2017-08-24 13:23:03 -07:00
2018-12-03 17:40:18 +01:00
2018-11-13 21:55:24 +01:00
2018-01-01 12:40:27 -07:00
2018-12-20 19:13:07 +01:00
2017-08-07 17:22:14 +02:00
2018-07-12 10:04:29 -04:00
2018-12-19 10:42:08 +01:00
2017-11-13 01:41:20 +01:00
2018-12-28 16:55:46 -08:00
2018-07-27 09:57:23 +10:00
2018-12-28 12:11:52 -08:00
2018-06-28 20:32:51 +09:00
2018-12-10 09:22:34 +01:00
2018-11-10 08:03:52 -07:00
2018-10-21 10:46:33 -04:00
2018-12-07 12:59:08 -08:00
2018-03-26 08:53:43 -06:00
2018-11-07 13:42:32 -07:00
2018-11-19 19:03:46 -07:00
2018-06-22 13:43:27 +09:00
2018-04-11 10:28:38 -07:00
2017-11-15 18:21:01 -08:00
2018-12-06 13:57:03 +01:00
2018-07-12 21:35:28 +02:00
2017-12-01 13:09:40 -08:00
2018-11-30 13:29:04 +00:00
2018-04-12 09:41:19 -07:00
2017-08-28 20:51:22 +02:00
2018-06-05 08:50:16 -04:00
2018-06-07 17:34:35 -07:00
2019-01-04 13:13:48 -08:00
2019-01-04 13:13:48 -08:00
2018-06-07 17:34:39 -07:00
2018-03-26 13:14:43 -04:00
2018-03-26 13:14:43 -04:00
2018-10-17 13:56:58 -07:00
2018-08-22 10:52:45 -07:00
2018-01-28 22:17:24 -05:00
2017-07-25 18:05:25 +02:00
2018-12-13 09:58:57 +01:00
2018-12-06 15:45:46 +01:00
2018-01-08 08:22:45 -06:00
2018-07-10 17:22:35 +02:00
2018-06-07 17:34:36 -07:00
2018-10-21 10:46:39 -04:00
2017-11-09 10:23:28 +01:00
2018-09-18 17:52:15 -05:00
2018-07-19 11:34:23 +01:00
2018-10-26 16:26:35 -07:00
2017-11-17 16:10:04 -08:00
2018-07-21 10:43:12 -05:00
2017-11-13 01:33:48 +01:00
2018-10-08 22:53:10 +11:00
2018-08-22 10:52:46 -07:00
2018-05-31 00:13:56 +08:00
2018-12-03 17:11:02 -08:00
2018-07-20 01:11:45 +02:00
2018-08-02 17:33:06 -04:00
2018-05-11 17:28:45 -07:00
2018-09-25 20:17:35 -07:00
2018-03-01 08:33:05 -07:00
2017-11-07 12:22:21 +01:00
2018-12-21 11:50:02 -05:00
2018-06-07 17:34:35 -07:00
2018-12-06 17:22:53 +01:00
2018-07-07 17:25:23 +02:00
2018-07-03 09:20:44 +02:00
2018-08-16 12:14:42 -07:00
2018-01-15 12:07:46 -08:00
2018-06-20 11:35:56 +02:00
2018-09-29 22:47:49 -04:00
2018-02-06 18:32:47 -08:00
2018-10-11 09:16:44 -07:00
2018-12-10 10:17:45 +01:00
2018-09-25 20:33:24 +02:00
2018-02-06 18:32:44 -08:00
2017-12-20 09:53:54 -07:00
2018-09-11 14:11:51 +02:00
2018-12-22 12:15:29 +01:00
2018-05-14 09:51:34 -04:00
2017-08-15 09:02:08 -07:00