]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.4-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 21 Jan 2019 12:01:22 +0000 (13:01 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 21 Jan 2019 12:01:22 +0000 (13:01 +0100)
added patches:
block-loop-use-global-lock-for-ioctl-operation.patch
loop-fix-double-mutex_unlock-loop_ctl_mutex-in-loop_control_ioctl.patch
loop-fold-__loop_release-into-loop_release.patch
loop-get-rid-of-loop_index_mutex.patch
sctp-allocate-sctp_sockaddr_entry-with-kzalloc.patch
selinux-fix-gpf-on-invalid-policy.patch
tipc-fix-uninit-value-in-tipc_nl_compat_bearer_enable.patch
tipc-fix-uninit-value-in-tipc_nl_compat_doit.patch
tipc-fix-uninit-value-in-tipc_nl_compat_link_reset_stats.patch
tipc-fix-uninit-value-in-tipc_nl_compat_link_set.patch
tipc-fix-uninit-value-in-tipc_nl_compat_name_table_dump.patch

12 files changed:
queue-4.4/block-loop-use-global-lock-for-ioctl-operation.patch [new file with mode: 0644]
queue-4.4/loop-fix-double-mutex_unlock-loop_ctl_mutex-in-loop_control_ioctl.patch [new file with mode: 0644]
queue-4.4/loop-fold-__loop_release-into-loop_release.patch [new file with mode: 0644]
queue-4.4/loop-get-rid-of-loop_index_mutex.patch [new file with mode: 0644]
queue-4.4/sctp-allocate-sctp_sockaddr_entry-with-kzalloc.patch [new file with mode: 0644]
queue-4.4/selinux-fix-gpf-on-invalid-policy.patch [new file with mode: 0644]
queue-4.4/series
queue-4.4/tipc-fix-uninit-value-in-tipc_nl_compat_bearer_enable.patch [new file with mode: 0644]
queue-4.4/tipc-fix-uninit-value-in-tipc_nl_compat_doit.patch [new file with mode: 0644]
queue-4.4/tipc-fix-uninit-value-in-tipc_nl_compat_link_reset_stats.patch [new file with mode: 0644]
queue-4.4/tipc-fix-uninit-value-in-tipc_nl_compat_link_set.patch [new file with mode: 0644]
queue-4.4/tipc-fix-uninit-value-in-tipc_nl_compat_name_table_dump.patch [new file with mode: 0644]

diff --git a/queue-4.4/block-loop-use-global-lock-for-ioctl-operation.patch b/queue-4.4/block-loop-use-global-lock-for-ioctl-operation.patch
new file mode 100644 (file)
index 0000000..f32cb64
--- /dev/null
@@ -0,0 +1,195 @@
+From 310ca162d779efee8a2dc3731439680f3e9c1e86 Mon Sep 17 00:00:00 2001
+From: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
+Date: Thu, 8 Nov 2018 14:01:02 +0100
+Subject: block/loop: Use global lock for ioctl() operation.
+
+From: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
+
+commit 310ca162d779efee8a2dc3731439680f3e9c1e86 upstream.
+
+syzbot is reporting NULL pointer dereference [1] which is caused by
+race condition between ioctl(loop_fd, LOOP_CLR_FD, 0) versus
+ioctl(other_loop_fd, LOOP_SET_FD, loop_fd) due to traversing other
+loop devices at loop_validate_file() without holding corresponding
+lo->lo_ctl_mutex locks.
+
+Since ioctl() request on loop devices is not frequent operation, we don't
+need fine grained locking. Let's use global lock in order to allow safe
+traversal at loop_validate_file().
+
+Note that syzbot is also reporting circular locking dependency between
+bdev->bd_mutex and lo->lo_ctl_mutex [2] which is caused by calling
+blkdev_reread_part() with lock held. This patch does not address it.
+
+[1] https://syzkaller.appspot.com/bug?id=f3cfe26e785d85f9ee259f385515291d21bd80a3
+[2] https://syzkaller.appspot.com/bug?id=bf154052f0eea4bc7712499e4569505907d15889
+
+Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
+Reported-by: syzbot <syzbot+bf89c128e05dd6c62523@syzkaller.appspotmail.com>
+Reviewed-by: Jan Kara <jack@suse.cz>
+Signed-off-by: Jan Kara <jack@suse.cz>
+Signed-off-by: Jens Axboe <axboe@kernel.dk>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/block/loop.c |   42 +++++++++++++++++++++---------------------
+ drivers/block/loop.h |    1 -
+ 2 files changed, 21 insertions(+), 22 deletions(-)
+
+--- a/drivers/block/loop.c
++++ b/drivers/block/loop.c
+@@ -82,6 +82,7 @@
+ static DEFINE_IDR(loop_index_idr);
+ static DEFINE_MUTEX(loop_index_mutex);
++static DEFINE_MUTEX(loop_ctl_mutex);
+ static int max_part;
+ static int part_shift;
+@@ -1044,7 +1045,7 @@ static int loop_clr_fd(struct loop_devic
+        */
+       if (atomic_read(&lo->lo_refcnt) > 1) {
+               lo->lo_flags |= LO_FLAGS_AUTOCLEAR;
+-              mutex_unlock(&lo->lo_ctl_mutex);
++              mutex_unlock(&loop_ctl_mutex);
+               return 0;
+       }
+@@ -1093,12 +1094,12 @@ static int loop_clr_fd(struct loop_devic
+       if (!part_shift)
+               lo->lo_disk->flags |= GENHD_FL_NO_PART_SCAN;
+       loop_unprepare_queue(lo);
+-      mutex_unlock(&lo->lo_ctl_mutex);
++      mutex_unlock(&loop_ctl_mutex);
+       /*
+-       * Need not hold lo_ctl_mutex to fput backing file.
+-       * Calling fput holding lo_ctl_mutex triggers a circular
++       * Need not hold loop_ctl_mutex to fput backing file.
++       * Calling fput holding loop_ctl_mutex triggers a circular
+        * lock dependency possibility warning as fput can take
+-       * bd_mutex which is usually taken before lo_ctl_mutex.
++       * bd_mutex which is usually taken before loop_ctl_mutex.
+        */
+       fput(filp);
+       return 0;
+@@ -1361,7 +1362,7 @@ static int lo_ioctl(struct block_device
+       struct loop_device *lo = bdev->bd_disk->private_data;
+       int err;
+-      mutex_lock_nested(&lo->lo_ctl_mutex, 1);
++      mutex_lock_nested(&loop_ctl_mutex, 1);
+       switch (cmd) {
+       case LOOP_SET_FD:
+               err = loop_set_fd(lo, mode, bdev, arg);
+@@ -1370,7 +1371,7 @@ static int lo_ioctl(struct block_device
+               err = loop_change_fd(lo, bdev, arg);
+               break;
+       case LOOP_CLR_FD:
+-              /* loop_clr_fd would have unlocked lo_ctl_mutex on success */
++              /* loop_clr_fd would have unlocked loop_ctl_mutex on success */
+               err = loop_clr_fd(lo);
+               if (!err)
+                       goto out_unlocked;
+@@ -1406,7 +1407,7 @@ static int lo_ioctl(struct block_device
+       default:
+               err = lo->ioctl ? lo->ioctl(lo, cmd, arg) : -EINVAL;
+       }
+-      mutex_unlock(&lo->lo_ctl_mutex);
++      mutex_unlock(&loop_ctl_mutex);
+ out_unlocked:
+       return err;
+@@ -1539,16 +1540,16 @@ static int lo_compat_ioctl(struct block_
+       switch(cmd) {
+       case LOOP_SET_STATUS:
+-              mutex_lock(&lo->lo_ctl_mutex);
++              mutex_lock(&loop_ctl_mutex);
+               err = loop_set_status_compat(
+                       lo, (const struct compat_loop_info __user *) arg);
+-              mutex_unlock(&lo->lo_ctl_mutex);
++              mutex_unlock(&loop_ctl_mutex);
+               break;
+       case LOOP_GET_STATUS:
+-              mutex_lock(&lo->lo_ctl_mutex);
++              mutex_lock(&loop_ctl_mutex);
+               err = loop_get_status_compat(
+                       lo, (struct compat_loop_info __user *) arg);
+-              mutex_unlock(&lo->lo_ctl_mutex);
++              mutex_unlock(&loop_ctl_mutex);
+               break;
+       case LOOP_SET_CAPACITY:
+       case LOOP_CLR_FD:
+@@ -1592,7 +1593,7 @@ static void __lo_release(struct loop_dev
+       if (atomic_dec_return(&lo->lo_refcnt))
+               return;
+-      mutex_lock(&lo->lo_ctl_mutex);
++      mutex_lock(&loop_ctl_mutex);
+       if (lo->lo_flags & LO_FLAGS_AUTOCLEAR) {
+               /*
+                * In autoclear mode, stop the loop thread
+@@ -1609,7 +1610,7 @@ static void __lo_release(struct loop_dev
+               loop_flush(lo);
+       }
+-      mutex_unlock(&lo->lo_ctl_mutex);
++      mutex_unlock(&loop_ctl_mutex);
+ }
+ static void lo_release(struct gendisk *disk, fmode_t mode)
+@@ -1655,10 +1656,10 @@ static int unregister_transfer_cb(int id
+       struct loop_device *lo = ptr;
+       struct loop_func_table *xfer = data;
+-      mutex_lock(&lo->lo_ctl_mutex);
++      mutex_lock(&loop_ctl_mutex);
+       if (lo->lo_encryption == xfer)
+               loop_release_xfer(lo);
+-      mutex_unlock(&lo->lo_ctl_mutex);
++      mutex_unlock(&loop_ctl_mutex);
+       return 0;
+ }
+@@ -1820,7 +1821,6 @@ static int loop_add(struct loop_device *
+       if (!part_shift)
+               disk->flags |= GENHD_FL_NO_PART_SCAN;
+       disk->flags |= GENHD_FL_EXT_DEVT;
+-      mutex_init(&lo->lo_ctl_mutex);
+       atomic_set(&lo->lo_refcnt, 0);
+       lo->lo_number           = i;
+       spin_lock_init(&lo->lo_lock);
+@@ -1933,19 +1933,19 @@ static long loop_control_ioctl(struct fi
+               ret = loop_lookup(&lo, parm);
+               if (ret < 0)
+                       break;
+-              mutex_lock(&lo->lo_ctl_mutex);
++              mutex_lock(&loop_ctl_mutex);
+               if (lo->lo_state != Lo_unbound) {
+                       ret = -EBUSY;
+-                      mutex_unlock(&lo->lo_ctl_mutex);
++                      mutex_unlock(&loop_ctl_mutex);
+                       break;
+               }
+               if (atomic_read(&lo->lo_refcnt) > 0) {
+                       ret = -EBUSY;
+-                      mutex_unlock(&lo->lo_ctl_mutex);
++                      mutex_unlock(&loop_ctl_mutex);
+                       break;
+               }
+               lo->lo_disk->private_data = NULL;
+-              mutex_unlock(&lo->lo_ctl_mutex);
++              mutex_unlock(&loop_ctl_mutex);
+               idr_remove(&loop_index_idr, lo->lo_number);
+               loop_remove(lo);
+               break;
+--- a/drivers/block/loop.h
++++ b/drivers/block/loop.h
+@@ -55,7 +55,6 @@ struct loop_device {
+       spinlock_t              lo_lock;
+       int                     lo_state;
+-      struct mutex            lo_ctl_mutex;
+       struct kthread_worker   worker;
+       struct task_struct      *worker_task;
+       bool                    use_dio;
diff --git a/queue-4.4/loop-fix-double-mutex_unlock-loop_ctl_mutex-in-loop_control_ioctl.patch b/queue-4.4/loop-fix-double-mutex_unlock-loop_ctl_mutex-in-loop_control_ioctl.patch
new file mode 100644 (file)
index 0000000..4a999a6
--- /dev/null
@@ -0,0 +1,40 @@
+From 628bd85947091830a8c4872adfd5ed1d515a9cf2 Mon Sep 17 00:00:00 2001
+From: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
+Date: Mon, 12 Nov 2018 08:42:14 -0700
+Subject: loop: Fix double mutex_unlock(&loop_ctl_mutex) in loop_control_ioctl()
+
+From: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
+
+commit 628bd85947091830a8c4872adfd5ed1d515a9cf2 upstream.
+
+Commit 0a42e99b58a20883 ("loop: Get rid of loop_index_mutex") forgot to
+remove mutex_unlock(&loop_ctl_mutex) from loop_control_ioctl() when
+replacing loop_index_mutex with loop_ctl_mutex.
+
+Fixes: 0a42e99b58a20883 ("loop: Get rid of loop_index_mutex")
+Reported-by: syzbot <syzbot+c0138741c2290fc5e63f@syzkaller.appspotmail.com>
+Reviewed-by: Ming Lei <ming.lei@redhat.com>
+Reviewed-by: Jan Kara <jack@suse.cz>
+Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
+Signed-off-by: Jens Axboe <axboe@kernel.dk>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/block/loop.c |    2 --
+ 1 file changed, 2 deletions(-)
+
+--- a/drivers/block/loop.c
++++ b/drivers/block/loop.c
+@@ -1936,12 +1936,10 @@ static long loop_control_ioctl(struct fi
+                       break;
+               if (lo->lo_state != Lo_unbound) {
+                       ret = -EBUSY;
+-                      mutex_unlock(&loop_ctl_mutex);
+                       break;
+               }
+               if (atomic_read(&lo->lo_refcnt) > 0) {
+                       ret = -EBUSY;
+-                      mutex_unlock(&loop_ctl_mutex);
+                       break;
+               }
+               lo->lo_disk->private_data = NULL;
diff --git a/queue-4.4/loop-fold-__loop_release-into-loop_release.patch b/queue-4.4/loop-fold-__loop_release-into-loop_release.patch
new file mode 100644 (file)
index 0000000..01028fe
--- /dev/null
@@ -0,0 +1,64 @@
+From 967d1dc144b50ad005e5eecdfadfbcfb399ffff6 Mon Sep 17 00:00:00 2001
+From: Jan Kara <jack@suse.cz>
+Date: Thu, 8 Nov 2018 14:01:03 +0100
+Subject: loop: Fold __loop_release into loop_release
+
+From: Jan Kara <jack@suse.cz>
+
+commit 967d1dc144b50ad005e5eecdfadfbcfb399ffff6 upstream.
+
+__loop_release() has a single call site. Fold it there. This is
+currently not a huge win but it will make following replacement of
+loop_index_mutex more obvious.
+
+Signed-off-by: Jan Kara <jack@suse.cz>
+Signed-off-by: Jens Axboe <axboe@kernel.dk>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/block/loop.c |   16 +++++++---------
+ 1 file changed, 7 insertions(+), 9 deletions(-)
+
+--- a/drivers/block/loop.c
++++ b/drivers/block/loop.c
+@@ -1586,12 +1586,15 @@ out:
+       return err;
+ }
+-static void __lo_release(struct loop_device *lo)
++static void lo_release(struct gendisk *disk, fmode_t mode)
+ {
++      struct loop_device *lo;
+       int err;
++      mutex_lock(&loop_index_mutex);
++      lo = disk->private_data;
+       if (atomic_dec_return(&lo->lo_refcnt))
+-              return;
++              goto unlock_index;
+       mutex_lock(&loop_ctl_mutex);
+       if (lo->lo_flags & LO_FLAGS_AUTOCLEAR) {
+@@ -1601,7 +1604,7 @@ static void __lo_release(struct loop_dev
+                */
+               err = loop_clr_fd(lo);
+               if (!err)
+-                      return;
++                      goto unlock_index;
+       } else {
+               /*
+                * Otherwise keep thread (if running) and config,
+@@ -1611,12 +1614,7 @@ static void __lo_release(struct loop_dev
+       }
+       mutex_unlock(&loop_ctl_mutex);
+-}
+-
+-static void lo_release(struct gendisk *disk, fmode_t mode)
+-{
+-      mutex_lock(&loop_index_mutex);
+-      __lo_release(disk->private_data);
++unlock_index:
+       mutex_unlock(&loop_index_mutex);
+ }
diff --git a/queue-4.4/loop-get-rid-of-loop_index_mutex.patch b/queue-4.4/loop-get-rid-of-loop_index_mutex.patch
new file mode 100644 (file)
index 0000000..9b6fb3d
--- /dev/null
@@ -0,0 +1,161 @@
+From 0a42e99b58a208839626465af194cfe640ef9493 Mon Sep 17 00:00:00 2001
+From: Jan Kara <jack@suse.cz>
+Date: Thu, 8 Nov 2018 14:01:04 +0100
+Subject: loop: Get rid of loop_index_mutex
+
+From: Jan Kara <jack@suse.cz>
+
+commit 0a42e99b58a208839626465af194cfe640ef9493 upstream.
+
+Now that loop_ctl_mutex is global, just get rid of loop_index_mutex as
+there is no good reason to keep these two separate and it just
+complicates the locking.
+
+Signed-off-by: Jan Kara <jack@suse.cz>
+Signed-off-by: Jens Axboe <axboe@kernel.dk>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/block/loop.c |   39 ++++++++++++++++++++-------------------
+ 1 file changed, 20 insertions(+), 19 deletions(-)
+
+--- a/drivers/block/loop.c
++++ b/drivers/block/loop.c
+@@ -81,7 +81,6 @@
+ #include <asm/uaccess.h>
+ static DEFINE_IDR(loop_index_idr);
+-static DEFINE_MUTEX(loop_index_mutex);
+ static DEFINE_MUTEX(loop_ctl_mutex);
+ static int max_part;
+@@ -1571,9 +1570,11 @@ static int lo_compat_ioctl(struct block_
+ static int lo_open(struct block_device *bdev, fmode_t mode)
+ {
+       struct loop_device *lo;
+-      int err = 0;
++      int err;
+-      mutex_lock(&loop_index_mutex);
++      err = mutex_lock_killable(&loop_ctl_mutex);
++      if (err)
++              return err;
+       lo = bdev->bd_disk->private_data;
+       if (!lo) {
+               err = -ENXIO;
+@@ -1582,7 +1583,7 @@ static int lo_open(struct block_device *
+       atomic_inc(&lo->lo_refcnt);
+ out:
+-      mutex_unlock(&loop_index_mutex);
++      mutex_unlock(&loop_ctl_mutex);
+       return err;
+ }
+@@ -1591,12 +1592,11 @@ static void lo_release(struct gendisk *d
+       struct loop_device *lo;
+       int err;
+-      mutex_lock(&loop_index_mutex);
++      mutex_lock(&loop_ctl_mutex);
+       lo = disk->private_data;
+       if (atomic_dec_return(&lo->lo_refcnt))
+-              goto unlock_index;
++              goto out_unlock;
+-      mutex_lock(&loop_ctl_mutex);
+       if (lo->lo_flags & LO_FLAGS_AUTOCLEAR) {
+               /*
+                * In autoclear mode, stop the loop thread
+@@ -1604,7 +1604,7 @@ static void lo_release(struct gendisk *d
+                */
+               err = loop_clr_fd(lo);
+               if (!err)
+-                      goto unlock_index;
++                      return;
+       } else {
+               /*
+                * Otherwise keep thread (if running) and config,
+@@ -1613,9 +1613,8 @@ static void lo_release(struct gendisk *d
+               loop_flush(lo);
+       }
++out_unlock:
+       mutex_unlock(&loop_ctl_mutex);
+-unlock_index:
+-      mutex_unlock(&loop_index_mutex);
+ }
+ static const struct block_device_operations lo_fops = {
+@@ -1897,7 +1896,7 @@ static struct kobject *loop_probe(dev_t
+       struct kobject *kobj;
+       int err;
+-      mutex_lock(&loop_index_mutex);
++      mutex_lock(&loop_ctl_mutex);
+       err = loop_lookup(&lo, MINOR(dev) >> part_shift);
+       if (err < 0)
+               err = loop_add(&lo, MINOR(dev) >> part_shift);
+@@ -1905,7 +1904,7 @@ static struct kobject *loop_probe(dev_t
+               kobj = NULL;
+       else
+               kobj = get_disk(lo->lo_disk);
+-      mutex_unlock(&loop_index_mutex);
++      mutex_unlock(&loop_ctl_mutex);
+       *part = 0;
+       return kobj;
+@@ -1915,9 +1914,13 @@ static long loop_control_ioctl(struct fi
+                              unsigned long parm)
+ {
+       struct loop_device *lo;
+-      int ret = -ENOSYS;
++      int ret;
++
++      ret = mutex_lock_killable(&loop_ctl_mutex);
++      if (ret)
++              return ret;
+-      mutex_lock(&loop_index_mutex);
++      ret = -ENOSYS;
+       switch (cmd) {
+       case LOOP_CTL_ADD:
+               ret = loop_lookup(&lo, parm);
+@@ -1931,7 +1934,6 @@ static long loop_control_ioctl(struct fi
+               ret = loop_lookup(&lo, parm);
+               if (ret < 0)
+                       break;
+-              mutex_lock(&loop_ctl_mutex);
+               if (lo->lo_state != Lo_unbound) {
+                       ret = -EBUSY;
+                       mutex_unlock(&loop_ctl_mutex);
+@@ -1943,7 +1945,6 @@ static long loop_control_ioctl(struct fi
+                       break;
+               }
+               lo->lo_disk->private_data = NULL;
+-              mutex_unlock(&loop_ctl_mutex);
+               idr_remove(&loop_index_idr, lo->lo_number);
+               loop_remove(lo);
+               break;
+@@ -1953,7 +1954,7 @@ static long loop_control_ioctl(struct fi
+                       break;
+               ret = loop_add(&lo, -1);
+       }
+-      mutex_unlock(&loop_index_mutex);
++      mutex_unlock(&loop_ctl_mutex);
+       return ret;
+ }
+@@ -2036,10 +2037,10 @@ static int __init loop_init(void)
+                                 THIS_MODULE, loop_probe, NULL, NULL);
+       /* pre-create number of devices given by config or max_loop */
+-      mutex_lock(&loop_index_mutex);
++      mutex_lock(&loop_ctl_mutex);
+       for (i = 0; i < nr; i++)
+               loop_add(&lo, i);
+-      mutex_unlock(&loop_index_mutex);
++      mutex_unlock(&loop_ctl_mutex);
+       printk(KERN_INFO "loop: module loaded\n");
+       return 0;
diff --git a/queue-4.4/sctp-allocate-sctp_sockaddr_entry-with-kzalloc.patch b/queue-4.4/sctp-allocate-sctp_sockaddr_entry-with-kzalloc.patch
new file mode 100644 (file)
index 0000000..c35c21e
--- /dev/null
@@ -0,0 +1,74 @@
+From 400b8b9a2a17918f8ce00786f596f530e7f30d50 Mon Sep 17 00:00:00 2001
+From: Xin Long <lucien.xin@gmail.com>
+Date: Mon, 14 Jan 2019 18:34:02 +0800
+Subject: sctp: allocate sctp_sockaddr_entry with kzalloc
+
+From: Xin Long <lucien.xin@gmail.com>
+
+commit 400b8b9a2a17918f8ce00786f596f530e7f30d50 upstream.
+
+The similar issue as fixed in Commit 4a2eb0c37b47 ("sctp: initialize
+sin6_flowinfo for ipv6 addrs in sctp_inet6addr_event") also exists
+in sctp_inetaddr_event, as Alexander noticed.
+
+To fix it, allocate sctp_sockaddr_entry with kzalloc for both sctp
+ipv4 and ipv6 addresses, as does in sctp_v4/6_copy_addrlist().
+
+Reported-by: Alexander Potapenko <glider@google.com>
+Signed-off-by: Xin Long <lucien.xin@gmail.com>
+Reported-by: syzbot+ae0c70c0c2d40c51bb92@syzkaller.appspotmail.com
+Acked-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
+Acked-by: Neil Horman <nhorman@tuxdriver.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ net/sctp/ipv6.c     |    5 +----
+ net/sctp/protocol.c |    4 +---
+ 2 files changed, 2 insertions(+), 7 deletions(-)
+
+--- a/net/sctp/ipv6.c
++++ b/net/sctp/ipv6.c
+@@ -97,11 +97,9 @@ static int sctp_inet6addr_event(struct n
+       switch (ev) {
+       case NETDEV_UP:
+-              addr = kmalloc(sizeof(struct sctp_sockaddr_entry), GFP_ATOMIC);
++              addr = kzalloc(sizeof(*addr), GFP_ATOMIC);
+               if (addr) {
+                       addr->a.v6.sin6_family = AF_INET6;
+-                      addr->a.v6.sin6_port = 0;
+-                      addr->a.v6.sin6_flowinfo = 0;
+                       addr->a.v6.sin6_addr = ifa->addr;
+                       addr->a.v6.sin6_scope_id = ifa->idev->dev->ifindex;
+                       addr->valid = 1;
+@@ -412,7 +410,6 @@ static void sctp_v6_copy_addrlist(struct
+               addr = kzalloc(sizeof(*addr), GFP_ATOMIC);
+               if (addr) {
+                       addr->a.v6.sin6_family = AF_INET6;
+-                      addr->a.v6.sin6_port = 0;
+                       addr->a.v6.sin6_addr = ifp->addr;
+                       addr->a.v6.sin6_scope_id = dev->ifindex;
+                       addr->valid = 1;
+--- a/net/sctp/protocol.c
++++ b/net/sctp/protocol.c
+@@ -151,7 +151,6 @@ static void sctp_v4_copy_addrlist(struct
+               addr = kzalloc(sizeof(*addr), GFP_ATOMIC);
+               if (addr) {
+                       addr->a.v4.sin_family = AF_INET;
+-                      addr->a.v4.sin_port = 0;
+                       addr->a.v4.sin_addr.s_addr = ifa->ifa_local;
+                       addr->valid = 1;
+                       INIT_LIST_HEAD(&addr->list);
+@@ -775,10 +774,9 @@ static int sctp_inetaddr_event(struct no
+       switch (ev) {
+       case NETDEV_UP:
+-              addr = kmalloc(sizeof(struct sctp_sockaddr_entry), GFP_ATOMIC);
++              addr = kzalloc(sizeof(*addr), GFP_ATOMIC);
+               if (addr) {
+                       addr->a.v4.sin_family = AF_INET;
+-                      addr->a.v4.sin_port = 0;
+                       addr->a.v4.sin_addr.s_addr = ifa->ifa_local;
+                       addr->valid = 1;
+                       spin_lock_bh(&net->sctp.local_addr_lock);
diff --git a/queue-4.4/selinux-fix-gpf-on-invalid-policy.patch b/queue-4.4/selinux-fix-gpf-on-invalid-policy.patch
new file mode 100644 (file)
index 0000000..31cadae
--- /dev/null
@@ -0,0 +1,34 @@
+From 5b0e7310a2a33c06edc7eb81ffc521af9b2c5610 Mon Sep 17 00:00:00 2001
+From: Stephen Smalley <sds@tycho.nsa.gov>
+Date: Wed, 9 Jan 2019 10:55:10 -0500
+Subject: selinux: fix GPF on invalid policy
+
+From: Stephen Smalley <sds@tycho.nsa.gov>
+
+commit 5b0e7310a2a33c06edc7eb81ffc521af9b2c5610 upstream.
+
+levdatum->level can be NULL if we encounter an error while loading
+the policy during sens_read prior to initializing it.  Make sure
+sens_destroy handles that case correctly.
+
+Reported-by: syzbot+6664500f0f18f07a5c0e@syzkaller.appspotmail.com
+Signed-off-by: Stephen Smalley <sds@tycho.nsa.gov>
+Signed-off-by: Paul Moore <paul@paul-moore.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ security/selinux/ss/policydb.c |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+--- a/security/selinux/ss/policydb.c
++++ b/security/selinux/ss/policydb.c
+@@ -726,7 +726,8 @@ static int sens_destroy(void *key, void
+       kfree(key);
+       if (datum) {
+               levdatum = datum;
+-              ebitmap_destroy(&levdatum->level->cat);
++              if (levdatum->level)
++                      ebitmap_destroy(&levdatum->level->cat);
+               kfree(levdatum->level);
+       }
+       kfree(datum);
index 3f23920e4b316f6b432f2466ff89717fa1999350..d420fb63d337b80eb068139732f6c9414f1ff88f 100644 (file)
@@ -57,3 +57,14 @@ media-vivid-set-min-width-height-to-a-value-0.patch
 lsm-check-for-null-cred-security-on-free.patch
 media-vb2-vb2_mmap-move-lock-up.patch
 sunrpc-handle-enomem-in-rpcb_getport_async.patch
+selinux-fix-gpf-on-invalid-policy.patch
+sctp-allocate-sctp_sockaddr_entry-with-kzalloc.patch
+tipc-fix-uninit-value-in-tipc_nl_compat_link_reset_stats.patch
+tipc-fix-uninit-value-in-tipc_nl_compat_bearer_enable.patch
+tipc-fix-uninit-value-in-tipc_nl_compat_link_set.patch
+tipc-fix-uninit-value-in-tipc_nl_compat_name_table_dump.patch
+tipc-fix-uninit-value-in-tipc_nl_compat_doit.patch
+block-loop-use-global-lock-for-ioctl-operation.patch
+loop-fold-__loop_release-into-loop_release.patch
+loop-get-rid-of-loop_index_mutex.patch
+loop-fix-double-mutex_unlock-loop_ctl_mutex-in-loop_control_ioctl.patch
diff --git a/queue-4.4/tipc-fix-uninit-value-in-tipc_nl_compat_bearer_enable.patch b/queue-4.4/tipc-fix-uninit-value-in-tipc_nl_compat_bearer_enable.patch
new file mode 100644 (file)
index 0000000..4d23242
--- /dev/null
@@ -0,0 +1,189 @@
+From 0762216c0ad2a2fccd63890648eca491f2c83d9a Mon Sep 17 00:00:00 2001
+From: Ying Xue <ying.xue@windriver.com>
+Date: Mon, 14 Jan 2019 17:22:26 +0800
+Subject: tipc: fix uninit-value in tipc_nl_compat_bearer_enable
+
+From: Ying Xue <ying.xue@windriver.com>
+
+commit 0762216c0ad2a2fccd63890648eca491f2c83d9a upstream.
+
+syzbot reported:
+
+BUG: KMSAN: uninit-value in strlen+0x3b/0xa0 lib/string.c:484
+CPU: 1 PID: 6371 Comm: syz-executor652 Not tainted 4.19.0-rc8+ #70
+Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
+Call Trace:
+ __dump_stack lib/dump_stack.c:77 [inline]
+ dump_stack+0x306/0x460 lib/dump_stack.c:113
+ kmsan_report+0x1a2/0x2e0 mm/kmsan/kmsan.c:917
+ __msan_warning+0x7c/0xe0 mm/kmsan/kmsan_instr.c:500
+ strlen+0x3b/0xa0 lib/string.c:484
+ nla_put_string include/net/netlink.h:1011 [inline]
+ tipc_nl_compat_bearer_enable+0x238/0x7b0 net/tipc/netlink_compat.c:389
+ __tipc_nl_compat_doit net/tipc/netlink_compat.c:311 [inline]
+ tipc_nl_compat_doit+0x39f/0xae0 net/tipc/netlink_compat.c:344
+ tipc_nl_compat_recv+0x147c/0x2760 net/tipc/netlink_compat.c:1107
+ genl_family_rcv_msg net/netlink/genetlink.c:601 [inline]
+ genl_rcv_msg+0x185c/0x1a20 net/netlink/genetlink.c:626
+ netlink_rcv_skb+0x394/0x640 net/netlink/af_netlink.c:2454
+ genl_rcv+0x63/0x80 net/netlink/genetlink.c:637
+ netlink_unicast_kernel net/netlink/af_netlink.c:1317 [inline]
+ netlink_unicast+0x166d/0x1720 net/netlink/af_netlink.c:1343
+ netlink_sendmsg+0x1391/0x1420 net/netlink/af_netlink.c:1908
+ sock_sendmsg_nosec net/socket.c:621 [inline]
+ sock_sendmsg net/socket.c:631 [inline]
+ ___sys_sendmsg+0xe47/0x1200 net/socket.c:2116
+ __sys_sendmsg net/socket.c:2154 [inline]
+ __do_sys_sendmsg net/socket.c:2163 [inline]
+ __se_sys_sendmsg+0x307/0x460 net/socket.c:2161
+ __x64_sys_sendmsg+0x4a/0x70 net/socket.c:2161
+ do_syscall_64+0xbe/0x100 arch/x86/entry/common.c:291
+ entry_SYSCALL_64_after_hwframe+0x63/0xe7
+RIP: 0033:0x440179
+Code: 18 89 d0 c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 0f 83 fb 13 fc ff c3 66 2e 0f 1f 84 00 00 00 00
+RSP: 002b:00007fffef7beee8 EFLAGS: 00000213 ORIG_RAX: 000000000000002e
+RAX: ffffffffffffffda RBX: 00000000004002c8 RCX: 0000000000440179
+RDX: 0000000000000000 RSI: 0000000020000100 RDI: 0000000000000003
+RBP: 00000000006ca018 R08: 0000000000000000 R09: 00000000004002c8
+R10: 0000000000000000 R11: 0000000000000213 R12: 0000000000401a00
+R13: 0000000000401a90 R14: 0000000000000000 R15: 0000000000000000
+
+Uninit was created at:
+ kmsan_save_stack_with_flags mm/kmsan/kmsan.c:255 [inline]
+ kmsan_internal_poison_shadow+0xc8/0x1d0 mm/kmsan/kmsan.c:180
+ kmsan_kmalloc+0xa4/0x120 mm/kmsan/kmsan_hooks.c:104
+ kmsan_slab_alloc+0x10/0x20 mm/kmsan/kmsan_hooks.c:113
+ slab_post_alloc_hook mm/slab.h:446 [inline]
+ slab_alloc_node mm/slub.c:2727 [inline]
+ __kmalloc_node_track_caller+0xb43/0x1400 mm/slub.c:4360
+ __kmalloc_reserve net/core/skbuff.c:138 [inline]
+ __alloc_skb+0x422/0xe90 net/core/skbuff.c:206
+ alloc_skb include/linux/skbuff.h:996 [inline]
+ netlink_alloc_large_skb net/netlink/af_netlink.c:1189 [inline]
+ netlink_sendmsg+0xcaf/0x1420 net/netlink/af_netlink.c:1883
+ sock_sendmsg_nosec net/socket.c:621 [inline]
+ sock_sendmsg net/socket.c:631 [inline]
+ ___sys_sendmsg+0xe47/0x1200 net/socket.c:2116
+ __sys_sendmsg net/socket.c:2154 [inline]
+ __do_sys_sendmsg net/socket.c:2163 [inline]
+ __se_sys_sendmsg+0x307/0x460 net/socket.c:2161
+ __x64_sys_sendmsg+0x4a/0x70 net/socket.c:2161
+ do_syscall_64+0xbe/0x100 arch/x86/entry/common.c:291
+ entry_SYSCALL_64_after_hwframe+0x63/0xe7
+
+The root cause is that we don't validate whether bear name is a valid
+string in tipc_nl_compat_bearer_enable().
+
+Meanwhile, we also fix the same issue in the following functions:
+tipc_nl_compat_bearer_disable()
+tipc_nl_compat_link_stat_dump()
+tipc_nl_compat_media_set()
+tipc_nl_compat_bearer_set()
+
+Reported-by: syzbot+b33d5cae0efd35dbfe77@syzkaller.appspotmail.com
+Signed-off-by: Ying Xue <ying.xue@windriver.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ net/tipc/netlink_compat.c |   26 ++++++++++++++++++++++++++
+ 1 file changed, 26 insertions(+)
+
+--- a/net/tipc/netlink_compat.c
++++ b/net/tipc/netlink_compat.c
+@@ -374,6 +374,7 @@ static int tipc_nl_compat_bearer_enable(
+       struct nlattr *prop;
+       struct nlattr *bearer;
+       struct tipc_bearer_config *b;
++      int len;
+       b = (struct tipc_bearer_config *)TLV_DATA(msg->req);
+@@ -381,6 +382,10 @@ static int tipc_nl_compat_bearer_enable(
+       if (!bearer)
+               return -EMSGSIZE;
++      len = min_t(int, TLV_GET_DATA_LEN(msg->req), TIPC_MAX_BEARER_NAME);
++      if (!string_is_valid(b->name, len))
++              return -EINVAL;
++
+       if (nla_put_string(skb, TIPC_NLA_BEARER_NAME, b->name))
+               return -EMSGSIZE;
+@@ -406,6 +411,7 @@ static int tipc_nl_compat_bearer_disable
+ {
+       char *name;
+       struct nlattr *bearer;
++      int len;
+       name = (char *)TLV_DATA(msg->req);
+@@ -413,6 +419,10 @@ static int tipc_nl_compat_bearer_disable
+       if (!bearer)
+               return -EMSGSIZE;
++      len = min_t(int, TLV_GET_DATA_LEN(msg->req), TIPC_MAX_BEARER_NAME);
++      if (!string_is_valid(name, len))
++              return -EINVAL;
++
+       if (nla_put_string(skb, TIPC_NLA_BEARER_NAME, name))
+               return -EMSGSIZE;
+@@ -472,6 +482,7 @@ static int tipc_nl_compat_link_stat_dump
+       struct nlattr *link[TIPC_NLA_LINK_MAX + 1];
+       struct nlattr *prop[TIPC_NLA_PROP_MAX + 1];
+       struct nlattr *stats[TIPC_NLA_STATS_MAX + 1];
++      int len;
+       nla_parse_nested(link, TIPC_NLA_LINK_MAX, attrs[TIPC_NLA_LINK], NULL);
+@@ -482,6 +493,11 @@ static int tipc_nl_compat_link_stat_dump
+                        NULL);
+       name = (char *)TLV_DATA(msg->req);
++
++      len = min_t(int, TLV_GET_DATA_LEN(msg->req), TIPC_MAX_LINK_NAME);
++      if (!string_is_valid(name, len))
++              return -EINVAL;
++
+       if (strcmp(name, nla_data(link[TIPC_NLA_LINK_NAME])) != 0)
+               return 0;
+@@ -615,6 +631,7 @@ static int tipc_nl_compat_media_set(stru
+       struct nlattr *prop;
+       struct nlattr *media;
+       struct tipc_link_config *lc;
++      int len;
+       lc = (struct tipc_link_config *)TLV_DATA(msg->req);
+@@ -622,6 +639,10 @@ static int tipc_nl_compat_media_set(stru
+       if (!media)
+               return -EMSGSIZE;
++      len = min_t(int, TLV_GET_DATA_LEN(msg->req), TIPC_MAX_MEDIA_NAME);
++      if (!string_is_valid(lc->name, len))
++              return -EINVAL;
++
+       if (nla_put_string(skb, TIPC_NLA_MEDIA_NAME, lc->name))
+               return -EMSGSIZE;
+@@ -642,6 +663,7 @@ static int tipc_nl_compat_bearer_set(str
+       struct nlattr *prop;
+       struct nlattr *bearer;
+       struct tipc_link_config *lc;
++      int len;
+       lc = (struct tipc_link_config *)TLV_DATA(msg->req);
+@@ -649,6 +671,10 @@ static int tipc_nl_compat_bearer_set(str
+       if (!bearer)
+               return -EMSGSIZE;
++      len = min_t(int, TLV_GET_DATA_LEN(msg->req), TIPC_MAX_MEDIA_NAME);
++      if (!string_is_valid(lc->name, len))
++              return -EINVAL;
++
+       if (nla_put_string(skb, TIPC_NLA_BEARER_NAME, lc->name))
+               return -EMSGSIZE;
diff --git a/queue-4.4/tipc-fix-uninit-value-in-tipc_nl_compat_doit.patch b/queue-4.4/tipc-fix-uninit-value-in-tipc_nl_compat_doit.patch
new file mode 100644 (file)
index 0000000..9bcb547
--- /dev/null
@@ -0,0 +1,94 @@
+From 2753ca5d9009c180dbfd4c802c80983b4b6108d1 Mon Sep 17 00:00:00 2001
+From: Ying Xue <ying.xue@windriver.com>
+Date: Mon, 14 Jan 2019 17:22:29 +0800
+Subject: tipc: fix uninit-value in tipc_nl_compat_doit
+
+From: Ying Xue <ying.xue@windriver.com>
+
+commit 2753ca5d9009c180dbfd4c802c80983b4b6108d1 upstream.
+
+BUG: KMSAN: uninit-value in tipc_nl_compat_doit+0x404/0xa10 net/tipc/netlink_compat.c:335
+CPU: 0 PID: 4514 Comm: syz-executor485 Not tainted 4.16.0+ #87
+Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
+Call Trace:
+ __dump_stack lib/dump_stack.c:17 [inline]
+ dump_stack+0x185/0x1d0 lib/dump_stack.c:53
+ kmsan_report+0x142/0x240 mm/kmsan/kmsan.c:1067
+ __msan_warning_32+0x6c/0xb0 mm/kmsan/kmsan_instr.c:683
+ tipc_nl_compat_doit+0x404/0xa10 net/tipc/netlink_compat.c:335
+ tipc_nl_compat_recv+0x164b/0x2700 net/tipc/netlink_compat.c:1153
+ genl_family_rcv_msg net/netlink/genetlink.c:599 [inline]
+ genl_rcv_msg+0x1686/0x1810 net/netlink/genetlink.c:624
+ netlink_rcv_skb+0x378/0x600 net/netlink/af_netlink.c:2447
+ genl_rcv+0x63/0x80 net/netlink/genetlink.c:635
+ netlink_unicast_kernel net/netlink/af_netlink.c:1311 [inline]
+ netlink_unicast+0x166b/0x1740 net/netlink/af_netlink.c:1337
+ netlink_sendmsg+0x1048/0x1310 net/netlink/af_netlink.c:1900
+ sock_sendmsg_nosec net/socket.c:630 [inline]
+ sock_sendmsg net/socket.c:640 [inline]
+ ___sys_sendmsg+0xec0/0x1310 net/socket.c:2046
+ __sys_sendmsg net/socket.c:2080 [inline]
+ SYSC_sendmsg+0x2a3/0x3d0 net/socket.c:2091
+ SyS_sendmsg+0x54/0x80 net/socket.c:2087
+ do_syscall_64+0x309/0x430 arch/x86/entry/common.c:287
+ entry_SYSCALL_64_after_hwframe+0x3d/0xa2
+RIP: 0033:0x43fda9
+RSP: 002b:00007ffd0c184ba8 EFLAGS: 00000213 ORIG_RAX: 000000000000002e
+RAX: ffffffffffffffda RBX: 00000000004002c8 RCX: 000000000043fda9
+RDX: 0000000000000000 RSI: 0000000020023000 RDI: 0000000000000003
+RBP: 00000000006ca018 R08: 00000000004002c8 R09: 00000000004002c8
+R10: 00000000004002c8 R11: 0000000000000213 R12: 00000000004016d0
+R13: 0000000000401760 R14: 0000000000000000 R15: 0000000000000000
+
+Uninit was created at:
+ kmsan_save_stack_with_flags mm/kmsan/kmsan.c:278 [inline]
+ kmsan_internal_poison_shadow+0xb8/0x1b0 mm/kmsan/kmsan.c:188
+ kmsan_kmalloc+0x94/0x100 mm/kmsan/kmsan.c:314
+ kmsan_slab_alloc+0x11/0x20 mm/kmsan/kmsan.c:321
+ slab_post_alloc_hook mm/slab.h:445 [inline]
+ slab_alloc_node mm/slub.c:2737 [inline]
+ __kmalloc_node_track_caller+0xaed/0x11c0 mm/slub.c:4369
+ __kmalloc_reserve net/core/skbuff.c:138 [inline]
+ __alloc_skb+0x2cf/0x9f0 net/core/skbuff.c:206
+ alloc_skb include/linux/skbuff.h:984 [inline]
+ netlink_alloc_large_skb net/netlink/af_netlink.c:1183 [inline]
+ netlink_sendmsg+0x9a6/0x1310 net/netlink/af_netlink.c:1875
+ sock_sendmsg_nosec net/socket.c:630 [inline]
+ sock_sendmsg net/socket.c:640 [inline]
+ ___sys_sendmsg+0xec0/0x1310 net/socket.c:2046
+ __sys_sendmsg net/socket.c:2080 [inline]
+ SYSC_sendmsg+0x2a3/0x3d0 net/socket.c:2091
+ SyS_sendmsg+0x54/0x80 net/socket.c:2087
+ do_syscall_64+0x309/0x430 arch/x86/entry/common.c:287
+ entry_SYSCALL_64_after_hwframe+0x3d/0xa2
+
+In tipc_nl_compat_recv(), when the len variable returned by
+nlmsg_attrlen() is 0, the message is still treated as a valid one,
+which is obviously unresonable. When len is zero, it means the
+message not only doesn't contain any valid TLV payload, but also
+TLV header is not included. Under this stituation, tlv_type field
+in TLV header is still accessed in tipc_nl_compat_dumpit() or
+tipc_nl_compat_doit(), but the field space is obviously illegal.
+Of course, it is not initialized.
+
+Reported-by: syzbot+bca0dc46634781f08b38@syzkaller.appspotmail.com
+Reported-by: syzbot+6bdb590321a7ae40c1a6@syzkaller.appspotmail.com
+Signed-off-by: Ying Xue <ying.xue@windriver.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ net/tipc/netlink_compat.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/net/tipc/netlink_compat.c
++++ b/net/tipc/netlink_compat.c
+@@ -1165,7 +1165,7 @@ static int tipc_nl_compat_recv(struct sk
+       }
+       len = nlmsg_attrlen(req_nlh, GENL_HDRLEN + TIPC_GENL_HDRLEN);
+-      if (len && !TLV_OK(msg.req, len)) {
++      if (!len || !TLV_OK(msg.req, len)) {
+               msg.rep = tipc_get_err_tlv(TIPC_CFG_NOT_SUPPORTED);
+               err = -EOPNOTSUPP;
+               goto send;
diff --git a/queue-4.4/tipc-fix-uninit-value-in-tipc_nl_compat_link_reset_stats.patch b/queue-4.4/tipc-fix-uninit-value-in-tipc_nl_compat_link_reset_stats.patch
new file mode 100644 (file)
index 0000000..c11c344
--- /dev/null
@@ -0,0 +1,133 @@
+From 8b66fee7f8ee18f9c51260e7a43ab37db5177a05 Mon Sep 17 00:00:00 2001
+From: Ying Xue <ying.xue@windriver.com>
+Date: Mon, 14 Jan 2019 17:22:25 +0800
+Subject: tipc: fix uninit-value in tipc_nl_compat_link_reset_stats
+
+From: Ying Xue <ying.xue@windriver.com>
+
+commit 8b66fee7f8ee18f9c51260e7a43ab37db5177a05 upstream.
+
+syzbot reports following splat:
+
+BUG: KMSAN: uninit-value in strlen+0x3b/0xa0 lib/string.c:486
+CPU: 1 PID: 11057 Comm: syz-executor0 Not tainted 4.20.0-rc7+ #2
+Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
+Call Trace:
+ __dump_stack lib/dump_stack.c:77 [inline]
+ dump_stack+0x173/0x1d0 lib/dump_stack.c:113
+ kmsan_report+0x12e/0x2a0 mm/kmsan/kmsan.c:613
+ __msan_warning+0x82/0xf0 mm/kmsan/kmsan_instr.c:295
+ strlen+0x3b/0xa0 lib/string.c:486
+ nla_put_string include/net/netlink.h:1154 [inline]
+ tipc_nl_compat_link_reset_stats+0x1f0/0x360 net/tipc/netlink_compat.c:760
+ __tipc_nl_compat_doit net/tipc/netlink_compat.c:311 [inline]
+ tipc_nl_compat_doit+0x3aa/0xaf0 net/tipc/netlink_compat.c:344
+ tipc_nl_compat_handle net/tipc/netlink_compat.c:1107 [inline]
+ tipc_nl_compat_recv+0x14d7/0x2760 net/tipc/netlink_compat.c:1210
+ genl_family_rcv_msg net/netlink/genetlink.c:601 [inline]
+ genl_rcv_msg+0x185f/0x1a60 net/netlink/genetlink.c:626
+ netlink_rcv_skb+0x444/0x640 net/netlink/af_netlink.c:2477
+ genl_rcv+0x63/0x80 net/netlink/genetlink.c:637
+ netlink_unicast_kernel net/netlink/af_netlink.c:1310 [inline]
+ netlink_unicast+0xf40/0x1020 net/netlink/af_netlink.c:1336
+ netlink_sendmsg+0x127f/0x1300 net/netlink/af_netlink.c:1917
+ sock_sendmsg_nosec net/socket.c:621 [inline]
+ sock_sendmsg net/socket.c:631 [inline]
+ ___sys_sendmsg+0xdb9/0x11b0 net/socket.c:2116
+ __sys_sendmsg net/socket.c:2154 [inline]
+ __do_sys_sendmsg net/socket.c:2163 [inline]
+ __se_sys_sendmsg+0x305/0x460 net/socket.c:2161
+ __x64_sys_sendmsg+0x4a/0x70 net/socket.c:2161
+ do_syscall_64+0xbc/0xf0 arch/x86/entry/common.c:291
+ entry_SYSCALL_64_after_hwframe+0x63/0xe7
+RIP: 0033:0x457ec9
+Code: 6d b7 fb ff c3 66 2e 0f 1f 84 00 00 00 00 00 66 90 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 0f 83 3b b7 fb ff c3 66 2e 0f 1f 84 00 00 00 00
+RSP: 002b:00007f2557338c78 EFLAGS: 00000246 ORIG_RAX: 000000000000002e
+RAX: ffffffffffffffda RBX: 0000000000000003 RCX: 0000000000457ec9
+RDX: 0000000000000000 RSI: 00000000200001c0 RDI: 0000000000000003
+RBP: 000000000073bf00 R08: 0000000000000000 R09: 0000000000000000
+R10: 0000000000000000 R11: 0000000000000246 R12: 00007f25573396d4
+R13: 00000000004cb478 R14: 00000000004d86c8 R15: 00000000ffffffff
+
+Uninit was created at:
+ kmsan_save_stack_with_flags mm/kmsan/kmsan.c:204 [inline]
+ kmsan_internal_poison_shadow+0x92/0x150 mm/kmsan/kmsan.c:158
+ kmsan_kmalloc+0xa6/0x130 mm/kmsan/kmsan_hooks.c:176
+ kmsan_slab_alloc+0xe/0x10 mm/kmsan/kmsan_hooks.c:185
+ slab_post_alloc_hook mm/slab.h:446 [inline]
+ slab_alloc_node mm/slub.c:2759 [inline]
+ __kmalloc_node_track_caller+0xe18/0x1030 mm/slub.c:4383
+ __kmalloc_reserve net/core/skbuff.c:137 [inline]
+ __alloc_skb+0x309/0xa20 net/core/skbuff.c:205
+ alloc_skb include/linux/skbuff.h:998 [inline]
+ netlink_alloc_large_skb net/netlink/af_netlink.c:1182 [inline]
+ netlink_sendmsg+0xb82/0x1300 net/netlink/af_netlink.c:1892
+ sock_sendmsg_nosec net/socket.c:621 [inline]
+ sock_sendmsg net/socket.c:631 [inline]
+ ___sys_sendmsg+0xdb9/0x11b0 net/socket.c:2116
+ __sys_sendmsg net/socket.c:2154 [inline]
+ __do_sys_sendmsg net/socket.c:2163 [inline]
+ __se_sys_sendmsg+0x305/0x460 net/socket.c:2161
+ __x64_sys_sendmsg+0x4a/0x70 net/socket.c:2161
+ do_syscall_64+0xbc/0xf0 arch/x86/entry/common.c:291
+ entry_SYSCALL_64_after_hwframe+0x63/0xe7
+
+The uninitialised access happened in tipc_nl_compat_link_reset_stats:
+    nla_put_string(skb, TIPC_NLA_LINK_NAME, name)
+
+This is because name string is not validated before it's used.
+
+Reported-by: syzbot+e01d94b5a4c266be6e4c@syzkaller.appspotmail.com
+Signed-off-by: Ying Xue <ying.xue@windriver.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ net/tipc/netlink_compat.c |   15 +++++++++++++++
+ 1 file changed, 15 insertions(+)
+
+--- a/net/tipc/netlink_compat.c
++++ b/net/tipc/netlink_compat.c
+@@ -87,6 +87,11 @@ static int tipc_skb_tailroom(struct sk_b
+       return limit;
+ }
++static inline int TLV_GET_DATA_LEN(struct tlv_desc *tlv)
++{
++      return TLV_GET_LEN(tlv) - TLV_SPACE(0);
++}
++
+ static int tipc_add_tlv(struct sk_buff *skb, u16 type, void *data, u16 len)
+ {
+       struct tlv_desc *tlv = (struct tlv_desc *)skb_tail_pointer(skb);
+@@ -166,6 +171,11 @@ static struct sk_buff *tipc_get_err_tlv(
+       return buf;
+ }
++static inline bool string_is_valid(char *s, int len)
++{
++      return memchr(s, '\0', len) ? true : false;
++}
++
+ static int __tipc_nl_compat_dumpit(struct tipc_nl_compat_cmd_dump *cmd,
+                                  struct tipc_nl_compat_msg *msg,
+                                  struct sk_buff *arg)
+@@ -711,6 +721,7 @@ static int tipc_nl_compat_link_reset_sta
+ {
+       char *name;
+       struct nlattr *link;
++      int len;
+       name = (char *)TLV_DATA(msg->req);
+@@ -718,6 +729,10 @@ static int tipc_nl_compat_link_reset_sta
+       if (!link)
+               return -EMSGSIZE;
++      len = min_t(int, TLV_GET_DATA_LEN(msg->req), TIPC_MAX_LINK_NAME);
++      if (!string_is_valid(name, len))
++              return -EINVAL;
++
+       if (nla_put_string(skb, TIPC_NLA_LINK_NAME, name))
+               return -EMSGSIZE;
diff --git a/queue-4.4/tipc-fix-uninit-value-in-tipc_nl_compat_link_set.patch b/queue-4.4/tipc-fix-uninit-value-in-tipc_nl_compat_link_set.patch
new file mode 100644 (file)
index 0000000..440bd3e
--- /dev/null
@@ -0,0 +1,76 @@
+From edf5ff04a45750ac8ce2435974f001dc9cfbf055 Mon Sep 17 00:00:00 2001
+From: Ying Xue <ying.xue@windriver.com>
+Date: Mon, 14 Jan 2019 17:22:27 +0800
+Subject: tipc: fix uninit-value in tipc_nl_compat_link_set
+
+From: Ying Xue <ying.xue@windriver.com>
+
+commit edf5ff04a45750ac8ce2435974f001dc9cfbf055 upstream.
+
+syzbot reports following splat:
+
+BUG: KMSAN: uninit-value in strlen+0x3b/0xa0 lib/string.c:486
+CPU: 1 PID: 9306 Comm: syz-executor172 Not tainted 4.20.0-rc7+ #2
+Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS
+Google 01/01/2011
+Call Trace:
+  __dump_stack lib/dump_stack.c:77 [inline]
+  dump_stack+0x173/0x1d0 lib/dump_stack.c:113
+  kmsan_report+0x12e/0x2a0 mm/kmsan/kmsan.c:613
+  __msan_warning+0x82/0xf0 mm/kmsan/kmsan_instr.c:313
+  strlen+0x3b/0xa0 lib/string.c:486
+  nla_put_string include/net/netlink.h:1154 [inline]
+  __tipc_nl_compat_link_set net/tipc/netlink_compat.c:708 [inline]
+  tipc_nl_compat_link_set+0x929/0x1220 net/tipc/netlink_compat.c:744
+  __tipc_nl_compat_doit net/tipc/netlink_compat.c:311 [inline]
+  tipc_nl_compat_doit+0x3aa/0xaf0 net/tipc/netlink_compat.c:344
+  tipc_nl_compat_handle net/tipc/netlink_compat.c:1107 [inline]
+  tipc_nl_compat_recv+0x14d7/0x2760 net/tipc/netlink_compat.c:1210
+  genl_family_rcv_msg net/netlink/genetlink.c:601 [inline]
+  genl_rcv_msg+0x185f/0x1a60 net/netlink/genetlink.c:626
+  netlink_rcv_skb+0x444/0x640 net/netlink/af_netlink.c:2477
+  genl_rcv+0x63/0x80 net/netlink/genetlink.c:637
+  netlink_unicast_kernel net/netlink/af_netlink.c:1310 [inline]
+  netlink_unicast+0xf40/0x1020 net/netlink/af_netlink.c:1336
+  netlink_sendmsg+0x127f/0x1300 net/netlink/af_netlink.c:1917
+  sock_sendmsg_nosec net/socket.c:621 [inline]
+  sock_sendmsg net/socket.c:631 [inline]
+  ___sys_sendmsg+0xdb9/0x11b0 net/socket.c:2116
+  __sys_sendmsg net/socket.c:2154 [inline]
+  __do_sys_sendmsg net/socket.c:2163 [inline]
+  __se_sys_sendmsg+0x305/0x460 net/socket.c:2161
+  __x64_sys_sendmsg+0x4a/0x70 net/socket.c:2161
+  do_syscall_64+0xbc/0xf0 arch/x86/entry/common.c:291
+  entry_SYSCALL_64_after_hwframe+0x63/0xe7
+
+The uninitialised access happened in
+    nla_put_string(skb, TIPC_NLA_LINK_NAME, lc->name)
+
+This is because lc->name string is not validated before it's used.
+
+Reported-by: syzbot+d78b8a29241a195aefb8@syzkaller.appspotmail.com
+Signed-off-by: Ying Xue <ying.xue@windriver.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ net/tipc/netlink_compat.c |    5 +++++
+ 1 file changed, 5 insertions(+)
+
+--- a/net/tipc/netlink_compat.c
++++ b/net/tipc/netlink_compat.c
+@@ -723,9 +723,14 @@ static int tipc_nl_compat_link_set(struc
+       struct tipc_link_config *lc;
+       struct tipc_bearer *bearer;
+       struct tipc_media *media;
++      int len;
+       lc = (struct tipc_link_config *)TLV_DATA(msg->req);
++      len = min_t(int, TLV_GET_DATA_LEN(msg->req), TIPC_MAX_LINK_NAME);
++      if (!string_is_valid(lc->name, len))
++              return -EINVAL;
++
+       media = tipc_media_find(lc->name);
+       if (media) {
+               cmd->doit = &tipc_nl_media_set;
diff --git a/queue-4.4/tipc-fix-uninit-value-in-tipc_nl_compat_name_table_dump.patch b/queue-4.4/tipc-fix-uninit-value-in-tipc_nl_compat_name_table_dump.patch
new file mode 100644 (file)
index 0000000..5dd8509
--- /dev/null
@@ -0,0 +1,100 @@
+From 974cb0e3e7c963ced06c4e32c5b2884173fa5e01 Mon Sep 17 00:00:00 2001
+From: Ying Xue <ying.xue@windriver.com>
+Date: Mon, 14 Jan 2019 17:22:28 +0800
+Subject: tipc: fix uninit-value in tipc_nl_compat_name_table_dump
+
+From: Ying Xue <ying.xue@windriver.com>
+
+commit 974cb0e3e7c963ced06c4e32c5b2884173fa5e01 upstream.
+
+syzbot reported:
+
+BUG: KMSAN: uninit-value in __arch_swab32 arch/x86/include/uapi/asm/swab.h:10 [inline]
+BUG: KMSAN: uninit-value in __fswab32 include/uapi/linux/swab.h:59 [inline]
+BUG: KMSAN: uninit-value in tipc_nl_compat_name_table_dump+0x4a8/0xba0 net/tipc/netlink_compat.c:826
+CPU: 0 PID: 6290 Comm: syz-executor848 Not tainted 4.19.0-rc8+ #70
+Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
+Call Trace:
+ __dump_stack lib/dump_stack.c:77 [inline]
+ dump_stack+0x306/0x460 lib/dump_stack.c:113
+ kmsan_report+0x1a2/0x2e0 mm/kmsan/kmsan.c:917
+ __msan_warning+0x7c/0xe0 mm/kmsan/kmsan_instr.c:500
+ __arch_swab32 arch/x86/include/uapi/asm/swab.h:10 [inline]
+ __fswab32 include/uapi/linux/swab.h:59 [inline]
+ tipc_nl_compat_name_table_dump+0x4a8/0xba0 net/tipc/netlink_compat.c:826
+ __tipc_nl_compat_dumpit+0x59e/0xdb0 net/tipc/netlink_compat.c:205
+ tipc_nl_compat_dumpit+0x63a/0x820 net/tipc/netlink_compat.c:270
+ tipc_nl_compat_handle net/tipc/netlink_compat.c:1151 [inline]
+ tipc_nl_compat_recv+0x1402/0x2760 net/tipc/netlink_compat.c:1210
+ genl_family_rcv_msg net/netlink/genetlink.c:601 [inline]
+ genl_rcv_msg+0x185c/0x1a20 net/netlink/genetlink.c:626
+ netlink_rcv_skb+0x394/0x640 net/netlink/af_netlink.c:2454
+ genl_rcv+0x63/0x80 net/netlink/genetlink.c:637
+ netlink_unicast_kernel net/netlink/af_netlink.c:1317 [inline]
+ netlink_unicast+0x166d/0x1720 net/netlink/af_netlink.c:1343
+ netlink_sendmsg+0x1391/0x1420 net/netlink/af_netlink.c:1908
+ sock_sendmsg_nosec net/socket.c:621 [inline]
+ sock_sendmsg net/socket.c:631 [inline]
+ ___sys_sendmsg+0xe47/0x1200 net/socket.c:2116
+ __sys_sendmsg net/socket.c:2154 [inline]
+ __do_sys_sendmsg net/socket.c:2163 [inline]
+ __se_sys_sendmsg+0x307/0x460 net/socket.c:2161
+ __x64_sys_sendmsg+0x4a/0x70 net/socket.c:2161
+ do_syscall_64+0xbe/0x100 arch/x86/entry/common.c:291
+ entry_SYSCALL_64_after_hwframe+0x63/0xe7
+RIP: 0033:0x440179
+Code: 18 89 d0 c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 0f 83 fb 13 fc ff c3 66 2e 0f 1f 84 00 00 00 00
+RSP: 002b:00007ffecec49318 EFLAGS: 00000213 ORIG_RAX: 000000000000002e
+RAX: ffffffffffffffda RBX: 00000000004002c8 RCX: 0000000000440179
+RDX: 0000000000000000 RSI: 0000000020000100 RDI: 0000000000000003
+RBP: 00000000006ca018 R08: 0000000000000000 R09: 00000000004002c8
+R10: 0000000000000000 R11: 0000000000000213 R12: 0000000000401a00
+R13: 0000000000401a90 R14: 0000000000000000 R15: 0000000000000000
+
+Uninit was created at:
+ kmsan_save_stack_with_flags mm/kmsan/kmsan.c:255 [inline]
+ kmsan_internal_poison_shadow+0xc8/0x1d0 mm/kmsan/kmsan.c:180
+ kmsan_kmalloc+0xa4/0x120 mm/kmsan/kmsan_hooks.c:104
+ kmsan_slab_alloc+0x10/0x20 mm/kmsan/kmsan_hooks.c:113
+ slab_post_alloc_hook mm/slab.h:446 [inline]
+ slab_alloc_node mm/slub.c:2727 [inline]
+ __kmalloc_node_track_caller+0xb43/0x1400 mm/slub.c:4360
+ __kmalloc_reserve net/core/skbuff.c:138 [inline]
+ __alloc_skb+0x422/0xe90 net/core/skbuff.c:206
+ alloc_skb include/linux/skbuff.h:996 [inline]
+ netlink_alloc_large_skb net/netlink/af_netlink.c:1189 [inline]
+ netlink_sendmsg+0xcaf/0x1420 net/netlink/af_netlink.c:1883
+ sock_sendmsg_nosec net/socket.c:621 [inline]
+ sock_sendmsg net/socket.c:631 [inline]
+ ___sys_sendmsg+0xe47/0x1200 net/socket.c:2116
+ __sys_sendmsg net/socket.c:2154 [inline]
+ __do_sys_sendmsg net/socket.c:2163 [inline]
+ __se_sys_sendmsg+0x307/0x460 net/socket.c:2161
+ __x64_sys_sendmsg+0x4a/0x70 net/socket.c:2161
+ do_syscall_64+0xbe/0x100 arch/x86/entry/common.c:291
+ entry_SYSCALL_64_after_hwframe+0x63/0xe7
+
+We cannot take for granted the thing that the length of data contained
+in TLV is longer than the size of struct tipc_name_table_query in
+tipc_nl_compat_name_table_dump().
+
+Reported-by: syzbot+06e771a754829716a327@syzkaller.appspotmail.com
+Signed-off-by: Ying Xue <ying.xue@windriver.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ net/tipc/netlink_compat.c |    2 ++
+ 1 file changed, 2 insertions(+)
+
+--- a/net/tipc/netlink_compat.c
++++ b/net/tipc/netlink_compat.c
+@@ -785,6 +785,8 @@ static int tipc_nl_compat_name_table_dum
+       };
+       ntq = (struct tipc_name_table_query *)TLV_DATA(msg->req);
++      if (TLV_GET_DATA_LEN(msg->req) < sizeof(struct tipc_name_table_query))
++              return -EINVAL;
+       depth = ntohl(ntq->depth);