| From: Tomas Bortoli <tomasbortoli@gmail.com> |
| Date: Fri, 27 Jul 2018 13:05:58 +0200 |
| Subject: 9p: fix multiple NULL-pointer-dereferences |
| |
| commit 10aa14527f458e9867cf3d2cc6b8cb0f6704448b upstream. |
| |
| Added checks to prevent GPFs from raising. |
| |
| Link: http://lkml.kernel.org/r/20180727110558.5479-1-tomasbortoli@gmail.com |
| Signed-off-by: Tomas Bortoli <tomasbortoli@gmail.com> |
| Reported-by: syzbot+1a262da37d3bead15c39@syzkaller.appspotmail.com |
| Signed-off-by: Dominique Martinet <dominique.martinet@cea.fr> |
| [bwh: Backported to 3.16: |
| - Drop changes in trans_xen.c |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| --- a/net/9p/trans_fd.c |
| +++ b/net/9p/trans_fd.c |
| @@ -934,7 +934,7 @@ p9_fd_create_tcp(struct p9_client *clien |
| if (err < 0) |
| return err; |
| |
| - if (valid_ipaddr4(addr) < 0) |
| + if (addr == NULL || valid_ipaddr4(addr) < 0) |
| return -EINVAL; |
| |
| csocket = NULL; |
| @@ -982,6 +982,9 @@ p9_fd_create_unix(struct p9_client *clie |
| |
| csocket = NULL; |
| |
| + if (addr == NULL) |
| + return -EINVAL; |
| + |
| if (strlen(addr) >= UNIX_PATH_MAX) { |
| pr_err("%s (%d): address too long: %s\n", |
| __func__, task_pid_nr(current), addr); |
| --- a/net/9p/trans_rdma.c |
| +++ b/net/9p/trans_rdma.c |
| @@ -623,6 +623,9 @@ rdma_create_trans(struct p9_client *clie |
| struct ib_qp_init_attr qp_attr; |
| struct ib_device_attr devattr; |
| |
| + if (addr == NULL) |
| + return -EINVAL; |
| + |
| /* Parse the transport specific mount options */ |
| err = parse_opts(args, &opts); |
| if (err < 0) |
| --- a/net/9p/trans_virtio.c |
| +++ b/net/9p/trans_virtio.c |
| @@ -622,6 +622,9 @@ p9_virtio_create(struct p9_client *clien |
| int ret = -ENOENT; |
| int found = 0; |
| |
| + if (devname == NULL) |
| + return -EINVAL; |
| + |
| mutex_lock(&virtio_9p_lock); |
| list_for_each_entry(chan, &virtio_chan_list, chan_list) { |
| if (!strncmp(devname, chan->tag, chan->tag_len) && |