Skip to content
  1. Jun 16, 2021
    • Greg Kroah-Hartman's avatar
      Linux 4.19.195 · eb575cd5
      Greg Kroah-Hartman authored
      
      
      Link: https://lore.kernel.org/r/20210614102643.797691914@linuxfoundation.org
      Tested-by: default avatarPavel Machek (CIP) <pavel@denx.de>
      Tested-by: default avatarJon Hunter <jonathanh@nvidia.com>
      Tested-by: default avatarShuah Khan <skhan@linuxfoundation.org>
      Tested-by: default avatarJason Self <jason@bluehome.net>
      Tested-by: default avatarHulk Robot <hulkrobot@huawei.com>
      Tested-by: default avatarLinux Kernel Functional Testing <lkft@linaro.org>
      Tested-by: default avatarSudip Mukherjee <sudip.mukherjee@codethink.co.uk>
      Tested-by: default avatarGuenter Roeck <linux@roeck-us.net>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      v4.19.195
      eb575cd5
    • Linus Torvalds's avatar
      proc: only require mm_struct for writing · 2bc534ca
      Linus Torvalds authored
      commit 94f0b2d4 upstream.
      
      Commit 591a22c1 ("proc: Track /proc/$pid/attr/ opener mm_struct") we
      started using __mem_open() to track the mm_struct at open-time, so that
      we could then check it for writes.
      
      But that also ended up making the permission checks at open time much
      stricter - and not just for writes, but for reads too.  And that in turn
      caused a regression for at least Fedora 29, where NIC interfaces fail to
      start when using NetworkManager.
      
      Since only the write side wanted the mm_struct test, ignore any failures
      by __mem_open() at open time, leaving reads unaffected.  The write()
      time verification of the mm_struct pointer will then catch the failure
      case because a NULL pointer will not match a valid 'current->mm'.
      
      Link: https://lore.kernel.org/netdev/YMjTlp2FSJYvoyFa@unreal/
      Fixes: 591a22c1
      
       ("proc: Track /proc/$pid/attr/ opener mm_struct")
      Reported-and-tested-by: default avatarLeon Romanovsky <leon@kernel.org>
      Cc: Kees Cook <keescook@chromium.org>
      Cc: Christian Brauner <christian.brauner@ubuntu.com>
      Cc: Andrea Righi <andrea.righi@canonical.com>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      2bc534ca
    • Liangyan's avatar
      tracing: Correct the length check which causes memory corruption · 31ceae38
      Liangyan authored
      commit 3e08a9f9 upstream.
      
      We've suffered from severe kernel crashes due to memory corruption on
      our production environment, like,
      
      Call Trace:
      [1640542.554277] general protection fault: 0000 [#1] SMP PTI
      [1640542.554856] CPU: 17 PID: 26996 Comm: python Kdump: loaded Tainted:G
      [1640542.556629] RIP: 0010:kmem_cache_alloc+0x90/0x190
      [1640542.559074] RSP: 0018:ffffb16faa597df8 EFLAGS: 00010286
      [1640542.559587] RAX: 0000000000000000 RBX: 0000000000400200 RCX:
      0000000006e931bf
      [1640542.560323] RDX: 0000000006e931be RSI: 0000000000400200 RDI:
      ffff9a45ff004300
      [1640542.560996] RBP: 0000000000400200 R08: 0000000000023420 R09:
      0000000000000000
      [1640542.561670] R10: 0000000000000000 R11: 0000000000000000 R12:
      ffffffff9a20608d
      [1640542.562366] R13: ffff9a45ff004300 R14: ffff9a45ff004300 R15:
      696c662f65636976
      [1640542.563128] FS:  00007f45d7c6f740(0000) GS:ffff9a45ff840000(0000)
      knlGS:0000000000000000
      [1640542.563937] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      [1640542.564557] CR2: 00007f45d71311a0 CR3: 000000189d63e004 CR4:
      00000000003606e0
      [1640542.565279] DR0: 0000000000000000 DR1: 0000000000000000 DR2:
      0000000000000000
      [1640542.566069] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7:
      0000000000000400
      [1640542.566742] Call Trace:
      [1640542.567009]  anon_vma_clone+0x5d/0x170
      [1640542.567417]  __split_vma+0x91/0x1a0
      [1640542.567777]  do_munmap+0x2c6/0x320
      [1640542.568128]  vm_munmap+0x54/0x70
      [1640542.569990]  __x64_sys_munmap+0x22/0x30
      [1640542.572005]  do_syscall_64+0x5b/0x1b0
      [1640542.573724]  entry_SYSCALL_64_after_hwframe+0x44/0xa9
      [1640542.575642] RIP: 0033:0x7f45d6e61e27
      
      James Wang has reproduced it stably on the latest 4.19 LTS.
      After some debugging, we finally proved that it's due to ftrace
      buffer out-of-bound access using a debug tool as follows:
      [   86.775200] BUG: Out-of-bounds write at addr 0xffff88aefe8b7000
      [   86.780806]  no_context+0xdf/0x3c0
      [   86.784327]  __do_page_fault+0x252/0x470
      [   86.788367]  do_page_fault+0x32/0x140
      [   86.792145]  page_fault+0x1e/0x30
      [   86.795576]  strncpy_from_unsafe+0x66/0xb0
      [   86.799789]  fetch_memory_string+0x25/0x40
      [   86.804002]  fetch_deref_string+0x51/0x60
      [   86.808134]  kprobe_trace_func+0x32d/0x3a0
      [   86.812347]  kprobe_dispatcher+0x45/0x50
      [   86.816385]  kprobe_ftrace_handler+0x90/0xf0
      [   86.820779]  ftrace_ops_assist_func+0xa1/0x140
      [   86.825340]  0xffffffffc00750bf
      [   86.828603]  do_sys_open+0x5/0x1f0
      [   86.832124]  do_syscall_64+0x5b/0x1b0
      [   86.835900]  entry_SYSCALL_64_after_hwframe+0x44/0xa9
      
      commit b220c049 ("tracing: Check length before giving out
      the filter buffer") adds length check to protect trace data
      overflow introduced in 0fc1b09f, seems that this fix can't prevent
      overflow entirely, the length check should also take the sizeof
      entry->array[0] into account, since this array[0] is filled the
      length of trace data and occupy addtional space and risk overflow.
      
      Link: https://lkml.kernel.org/r/20210607125734.1770447-1-liangyan.peng@linux.alibaba.com
      
      Cc: stable@vger.kernel.org
      Cc: Ingo Molnar <mingo@redhat.com>
      Cc: Xunlei Pang <xlpang@linux.alibaba.com>
      Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
      Fixes: b220c049
      
       ("tracing: Check length before giving out the filter buffer")
      Reviewed-by: default avatarXunlei Pang <xlpang@linux.alibaba.com>
      Reviewed-by: default avataryinbinbin <yinbinbin@alibabacloud.com>
      Reviewed-by: default avatarWetp Zhang <wetp.zy@linux.alibaba.com>
      Tested-by: default avatarJames Wang <jnwang@linux.alibaba.com>
      Signed-off-by: default avatarLiangyan <liangyan.peng@linux.alibaba.com>
      Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      31ceae38
    • Steven Rostedt (VMware)'s avatar
      ftrace: Do not blindly read the ip address in ftrace_bug() · 862dcc14
      Steven Rostedt (VMware) authored
      commit 6c14133d upstream.
      
      It was reported that a bug on arm64 caused a bad ip address to be used for
      updating into a nop in ftrace_init(), but the error path (rightfully)
      returned -EINVAL and not -EFAULT, as the bug caused more than one error to
      occur. But because -EINVAL was returned, the ftrace_bug() tried to report
      what was at the location of the ip address, and read it directly. This
      caused the machine to panic, as the ip was not pointing to a valid memory
      address.
      
      Instead, read the ip address with copy_from_kernel_nofault() to safely
      access the memory, and if it faults, report that the address faulted,
      otherwise report what was in that location.
      
      Link: https://lore.kernel.org/lkml/20210607032329.28671-1-mark-pk.tsai@mediatek.com/
      
      Cc: stable@vger.kernel.org
      Fixes: 05736a42
      
       ("ftrace: warn on failure to disable mcount callers")
      Reported-by: default avatarMark-PK Tsai <mark-pk.tsai@mediatek.com>
      Tested-by: default avatarMark-PK Tsai <mark-pk.tsai@mediatek.com>
      Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      862dcc14
    • Ming Lei's avatar
      scsi: core: Only put parent device if host state differs from SHOST_CREATED · 681e5c84
      Ming Lei authored
      commit 1e0d4e62
      
       upstream.
      
      get_device(shost->shost_gendev.parent) is called after host state has
      switched to SHOST_RUNNING. scsi_host_dev_release() shouldn't release the
      parent device if host state is still SHOST_CREATED.
      
      Link: https://lore.kernel.org/r/20210602133029.2864069-5-ming.lei@redhat.com
      Cc: Bart Van Assche <bvanassche@acm.org>
      Cc: John Garry <john.garry@huawei.com>
      Cc: Hannes Reinecke <hare@suse.de>
      Tested-by: default avatarJohn Garry <john.garry@huawei.com>
      Reviewed-by: default avatarJohn Garry <john.garry@huawei.com>
      Signed-off-by: default avatarMing Lei <ming.lei@redhat.com>
      Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      681e5c84
    • Ming Lei's avatar
      scsi: core: Put .shost_dev in failure path if host state changes to RUNNING · 7dc05952
      Ming Lei authored
      commit 11714026
      
       upstream.
      
      scsi_host_dev_release() only frees dev_name when host state is
      SHOST_CREATED. After host state has changed to SHOST_RUNNING,
      scsi_host_dev_release() no longer cleans up.
      
      Fix this by doing a put_device(&shost->shost_dev) in the failure path when
      host state is SHOST_RUNNING. Move get_device(&shost->shost_gendev) before
      device_add(&shost->shost_dev) so that scsi_host_cls_release() can do a put
      on this reference.
      
      Link: https://lore.kernel.org/r/20210602133029.2864069-4-ming.lei@redhat.com
      Cc: Bart Van Assche <bvanassche@acm.org>
      Cc: Hannes Reinecke <hare@suse.de>
      Reported-by: default avatarJohn Garry <john.garry@huawei.com>
      Tested-by: default avatarJohn Garry <john.garry@huawei.com>
      Reviewed-by: default avatarJohn Garry <john.garry@huawei.com>
      Reviewed-by: default avatarHannes Reinecke <hare@suse.de>
      Signed-off-by: default avatarMing Lei <ming.lei@redhat.com>
      Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      7dc05952
    • Ming Lei's avatar
      scsi: core: Fix error handling of scsi_host_alloc() · 2dc85045
      Ming Lei authored
      commit 66a834d0
      
       upstream.
      
      After device is initialized via device_initialize(), or its name is set via
      dev_set_name(), the device has to be freed via put_device().  Otherwise
      device name will be leaked because it is allocated dynamically in
      dev_set_name().
      
      Fix the leak by replacing kfree() with put_device(). Since
      scsi_host_dev_release() properly handles IDA and kthread removal, remove
      special-casing these from the error handling as well.
      
      Link: https://lore.kernel.org/r/20210602133029.2864069-2-ming.lei@redhat.com
      Cc: Bart Van Assche <bvanassche@acm.org>
      Cc: John Garry <john.garry@huawei.com>
      Cc: Hannes Reinecke <hare@suse.de>
      Tested-by: default avatarJohn Garry <john.garry@huawei.com>
      Reviewed-by: default avatarBart Van Assche <bvanassche@acm.org>
      Reviewed-by: default avatarJohn Garry <john.garry@huawei.com>
      Reviewed-by: default avatarHannes Reinecke <hare@suse.de>
      Signed-off-by: default avatarMing Lei <ming.lei@redhat.com>
      Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      2dc85045
    • Dai Ngo's avatar
      NFSv4: nfs4_proc_set_acl needs to restore NFS_CAP_UIDGID_NOMAP on error. · 626928c3
      Dai Ngo authored
      commit f8849e20
      
       upstream.
      
      Currently if __nfs4_proc_set_acl fails with NFS4ERR_BADOWNER it
      re-enables the idmapper by clearing NFS_CAP_UIDGID_NOMAP before
      retrying again. The NFS_CAP_UIDGID_NOMAP remains cleared even if
      the retry fails. This causes problem for subsequent setattr
      requests for v4 server that does not have idmapping configured.
      
      This patch modifies nfs4_proc_set_acl to detect NFS4ERR_BADOWNER
      and NFS4ERR_BADNAME and skips the retry, since the kernel isn't
      involved in encoding the ACEs, and return -EINVAL.
      
      Steps to reproduce the problem:
      
       # mount -o vers=4.1,sec=sys server:/export/test /tmp/mnt
       # touch /tmp/mnt/file1
       # chown 99 /tmp/mnt/file1
       # nfs4_setfacl -a A::unknown.user@xyz.com:wrtncy /tmp/mnt/file1
       Failed setxattr operation: Invalid argument
       # chown 99 /tmp/mnt/file1
       chown: changing ownership of ‘/tmp/mnt/file1’: Invalid argument
       # umount /tmp/mnt
       # mount -o vers=4.1,sec=sys server:/export/test /tmp/mnt
       # chown 99 /tmp/mnt/file1
       #
      
      v2: detect NFS4ERR_BADOWNER and NFS4ERR_BADNAME and skip retry
             in nfs4_proc_set_acl.
      Signed-off-by: default avatarDai Ngo <dai.ngo@oracle.com>
      Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      626928c3
    • Trond Myklebust's avatar
      NFSv4: Fix second deadlock in nfs4_evict_inode() · 9cd420e5
      Trond Myklebust authored
      commit c3aba897
      
       upstream.
      
      If the inode is being evicted but has to return a layout first, then
      that too can cause a deadlock in the corner case where the server
      reboots.
      
      Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      9cd420e5
    • Anna Schumaker's avatar
      NFS: Fix use-after-free in nfs4_init_client() · 42c10b0d
      Anna Schumaker authored
      commit 476bdb04 upstream.
      
      KASAN reports a use-after-free when attempting to mount two different
      exports through two different NICs that belong to the same server.
      
      Olga was able to hit this with kernels starting somewhere between 5.7
      and 5.10, but I traced the patch that introduced the clear_bit() call to
      4.13. So something must have changed in the refcounting of the clp
      pointer to make this call to nfs_put_client() the very last one.
      
      Fixes: 8dcbec6d
      
       ("NFSv41: Handle EXCHID4_FLAG_CONFIRMED_R during NFSv4.1 migration")
      Cc: stable@vger.kernel.org # 4.13+
      Signed-off-by: default avatarAnna Schumaker <Anna.Schumaker@Netapp.com>
      Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      42c10b0d
    • Paolo Bonzini's avatar
      kvm: fix previous commit for 32-bit builds · 270dadd7
      Paolo Bonzini authored
      commit 4422829e
      
       upstream.
      
      array_index_nospec does not work for uint64_t on 32-bit builds.
      However, the size of a memory slot must be less than 20 bits wide
      on those system, since the memory slot must fit in the user
      address space.  So just store it in an unsigned long.
      
      Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      270dadd7
    • Leo Yan's avatar
      perf session: Correct buffer copying when peeking events · 8526240f
      Leo Yan authored
      [ Upstream commit 197eecb6 ]
      
      When peeking an event, it has a short path and a long path.  The short
      path uses the session pointer "one_mmap_addr" to directly fetch the
      event; and the long path needs to read out the event header and the
      following event data from file and fill into the buffer pointer passed
      through the argument "buf".
      
      The issue is in the long path that it copies the event header and event
      data into the same destination address which pointer "buf", this means
      the event header is overwritten.  We are just lucky to run into the
      short path in most cases, so we don't hit the issue in the long path.
      
      This patch adds the offset "hdr_sz" to the pointer "buf" when copying
      the event data, so that it can reserve the event header which can be
      used properly by its caller.
      
      Fixes: 5a52f33a
      
       ("perf session: Add perf_session__peek_event()")
      Signed-off-by: default avatarLeo Yan <leo.yan@linaro.org>
      Acked-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
      Acked-by: default avatarJiri Olsa <jolsa@redhat.com>
      Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
      Cc: Kan Liang <kan.liang@linux.intel.com>
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Namhyung Kim <namhyung@kernel.org>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Link: http://lore.kernel.org/lkml/20210605052957.1070720-1-leo.yan@linaro.org
      Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      8526240f
    • Trond Myklebust's avatar
      NFSv4: Fix deadlock between nfs4_evict_inode() and nfs4_opendata_get_inode() · f7d2172d
      Trond Myklebust authored
      [ Upstream commit dfe1fe75
      
       ]
      
      If the inode is being evicted, but has to return a delegation first,
      then it can cause a deadlock in the corner case where the server reboots
      before the delegreturn completes, but while the call to iget5_locked() in
      nfs4_opendata_get_inode() is waiting for the inode free to complete.
      Since the open call still holds a session slot, the reboot recovery
      cannot proceed.
      
      In order to break the logjam, we can turn the delegation return into a
      privileged operation for the case where we're evicting the inode. We
      know that in that case, there can be no other state recovery operation
      that conflicts.
      
      Reported-by: default avatarzhangxiaoxu (A) <zhangxiaoxu5@huawei.com>
      Fixes: 5fcdfacc
      
       ("NFSv4: Return delegations synchronously in evict_inode")
      Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      f7d2172d
    • Dan Carpenter's avatar
      NFS: Fix a potential NULL dereference in nfs_get_client() · 4b380a7d
      Dan Carpenter authored
      [ Upstream commit 09226e83 ]
      
      None of the callers are expecting NULL returns from nfs_get_client() so
      this code will lead to an Oops.  It's better to return an error
      pointer.  I expect that this is dead code so hopefully no one is
      affected.
      
      Fixes: 31434f49
      
       ("nfs: check hostname in nfs_get_client")
      Signed-off-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
      Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      4b380a7d
    • Alaa Hleihel's avatar
      IB/mlx5: Fix initializing CQ fragments buffer · 1ec2dcd6
      Alaa Hleihel authored
      commit 2ba0aa2f upstream.
      
      The function init_cq_frag_buf() can be called to initialize the current CQ
      fragments buffer cq->buf, or the temporary cq->resize_buf that is filled
      during CQ resize operation.
      
      However, the offending commit started to use function get_cqe() for
      getting the CQEs, the issue with this change is that get_cqe() always
      returns CQEs from cq->buf, which leads us to initialize the wrong buffer,
      and in case of enlarging the CQ we try to access elements beyond the size
      of the current cq->buf and eventually hit a kernel panic.
      
       [exception RIP: init_cq_frag_buf+103]
        [ffff9f799ddcbcd8] mlx5_ib_resize_cq at ffffffffc0835d60 [mlx5_ib]
        [ffff9f799ddcbdb0] ib_resize_cq at ffffffffc05270df [ib_core]
        [ffff9f799ddcbdc0] llt_rdma_setup_qp at ffffffffc0a6a712 [llt]
        [ffff9f799ddcbe10] llt_rdma_cc_event_action at ffffffffc0a6b411 [llt]
        [ffff9f799ddcbe98] llt_rdma_client_conn_thread at ffffffffc0a6bb75 [llt]
        [ffff9f799ddcbec8] kthread at ffffffffa66c5da1
        [ffff9f799ddcbf50] ret_from_fork_nospec_begin at ffffffffa6d95ddd
      
      Fix it by getting the needed CQE by calling mlx5_frag_buf_get_wqe() that
      takes the correct source buffer as a parameter.
      
      Fixes: 388ca8be
      
       ("IB/mlx5: Implement fragmented completion queue (CQ)")
      Link: https://lore.kernel.org/r/90a0e8c924093cfa50a482880ad7e7edb73dc19a.1623309971.git.leonro@nvidia.com
      Signed-off-by: default avatarAlaa Hleihel <alaa@nvidia.com>
      Signed-off-by: default avatarLeon Romanovsky <leonro@nvidia.com>
      Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      1ec2dcd6
    • Vincent Guittot's avatar
      sched/fair: Make sure to update tg contrib for blocked load · 4af84445
      Vincent Guittot authored
      commit 02da26ad upstream.
      
      During the update of fair blocked load (__update_blocked_fair()), we
      update the contribution of the cfs in tg->load_avg if cfs_rq's pelt
      has decayed.  Nevertheless, the pelt values of a cfs_rq could have
      been recently updated while propagating the change of a child. In this
      case, cfs_rq's pelt will not decayed because it has already been
      updated and we don't update tg->load_avg.
      
      __update_blocked_fair
        ...
        for_each_leaf_cfs_rq_safe: child cfs_rq
          update cfs_rq_load_avg() for child cfs_rq
          ...
          update_load_avg(cfs_rq_of(se), se, 0)
            ...
            update cfs_rq_load_avg() for parent cfs_rq
      		-propagation of child's load makes parent cfs_rq->load_sum
      		 becoming null
              -UPDATE_TG is not set so it doesn't update parent
      		 cfs_rq->tg_load_avg_contrib
        ..
        for_each_leaf_cfs_rq_safe: parent cfs_rq
          update cfs_rq_load_avg() for parent cfs_rq
            - nothing to do because parent cfs_rq has already been updated
      		recently so cfs_rq->tg_load_avg_contrib is not updated
          ...
          parent cfs_rq is decayed
            list_del_leaf_cfs_rq parent cfs_rq
      	  - but it still contibutes to tg->load_avg
      
      we must set UPDATE_TG flags when propagting pending load to the parent
      
      Fixes: 039ae8bc
      
       ("sched/fair: Fix O(nr_cgroups) in the load balancing path")
      Reported-by: default avatarOdin Ugedal <odin@uged.al>
      Signed-off-by: default avatarVincent Guittot <vincent.guittot@linaro.org>
      Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
      Reviewed-by: default avatarOdin Ugedal <odin@uged.al>
      Link: https://lkml.kernel.org/r/20210527122916.27683-3-vincent.guittot@linaro.org
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      4af84445
    • Marco Elver's avatar
      perf: Fix data race between pin_count increment/decrement · db72bdb5
      Marco Elver authored
      commit 6c605f83 upstream.
      
      KCSAN reports a data race between increment and decrement of pin_count:
      
        write to 0xffff888237c2d4e0 of 4 bytes by task 15740 on cpu 1:
         find_get_context		kernel/events/core.c:4617
         __do_sys_perf_event_open	kernel/events/core.c:12097 [inline]
         __se_sys_perf_event_open	kernel/events/core.c:11933
         ...
        read to 0xffff888237c2d4e0 of 4 bytes by task 15743 on cpu 0:
         perf_unpin_context		kernel/events/core.c:1525 [inline]
         __do_sys_perf_event_open	kernel/events/core.c:12328 [inline]
         __se_sys_perf_event_open	kernel/events/core.c:11933
         ...
      
      Because neither read-modify-write here is atomic, this can lead to one
      of the operations being lost, resulting in an inconsistent pin_count.
      Fix it by adding the missing locking in the CPU-event case.
      
      Fixes: fe4b04fa
      
       ("perf: Cure task_oncpu_function_call() races")
      Reported-by: default avatar <syzbot+142c9018f5962db69c7e@syzkaller.appspotmail.com>
      Signed-off-by: default avatarMarco Elver <elver@google.com>
      Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
      Link: https://lkml.kernel.org/r/20210527104711.2671610-1-elver@google.com
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      db72bdb5
    • Nathan Chancellor's avatar
      vmlinux.lds.h: Avoid orphan section with !SMP · a88aad73
      Nathan Chancellor authored
      commit d4c63999 upstream.
      
      With x86_64_defconfig and the following configs, there is an orphan
      section warning:
      
      CONFIG_SMP=n
      CONFIG_AMD_MEM_ENCRYPT=y
      CONFIG_HYPERVISOR_GUEST=y
      CONFIG_KVM=y
      CONFIG_PARAVIRT=y
      
      ld: warning: orphan section `.data..decrypted' from `arch/x86/kernel/cpu/vmware.o' being placed in section `.data..decrypted'
      ld: warning: orphan section `.data..decrypted' from `arch/x86/kernel/kvm.o' being placed in section `.data..decrypted'
      
      These sections are created with DEFINE_PER_CPU_DECRYPTED, which
      ultimately turns into __PCPU_ATTRS, which in turn has a section
      attribute with a value of PER_CPU_BASE_SECTION + the section name. When
      CONFIG_SMP is not set, the base section is .data and that is not
      currently handled in any linker script.
      
      Add .data..decrypted to PERCPU_DECRYPTED_SECTION, which is included in
      PERCPU_INPUT -> PERCPU_SECTION, which is include in the x86 linker
      script when either CONFIG_X86_64 or CONFIG_SMP is unset, taking care of
      the warning.
      
      Fixes: ac26963a
      
       ("percpu: Introduce DEFINE_PER_CPU_DECRYPTED")
      Link: https://github.com/ClangBuiltLinux/linux/issues/1360
      Reported-by: default avatarkernel test robot <lkp@intel.com>
      Signed-off-by: default avatarNathan Chancellor <nathan@kernel.org>
      Tested-by: Nick Desaulniers <ndesaulniers@google.com> # build
      Signed-off-by: default avatarKees Cook <keescook@chromium.org>
      Link: https://lore.kernel.org/r/20210506001410.1026691-1-nathan@kernel.org
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      a88aad73
    • Shay Drory's avatar
      RDMA/mlx4: Do not map the core_clock page to user space unless enabled · 6fe8d68e
      Shay Drory authored
      commit 404e5a12 upstream.
      
      Currently when mlx4 maps the hca_core_clock page to the user space there
      are read-modifiable registers, one of which is semaphore, on this page as
      well as the clock counter. If user reads the wrong offset, it can modify
      the semaphore and hang the device.
      
      Do not map the hca_core_clock page to the user space unless the device has
      been put in a backwards compatibility mode to support this feature.
      
      After this patch, mlx4 core_clock won't be mapped to user space on the
      majority of existing devices and the uverbs device time feature in
      ibv_query_rt_values_ex() will be disabled.
      
      Fixes: 52033cfb
      
       ("IB/mlx4: Add mmap call to map the hardware clock")
      Link: https://lore.kernel.org/r/9632304e0d6790af84b3b706d8c18732bc0d5e27.1622726305.git.leonro@nvidia.com
      Signed-off-by: default avatarShay Drory <shayd@nvidia.com>
      Signed-off-by: default avatarLeon Romanovsky <leonro@nvidia.com>
      Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      6fe8d68e
    • Dmitry Osipenko's avatar
      regulator: max77620: Use device_set_of_node_from_dev() · 0856f230
      Dmitry Osipenko authored
      commit 6f55c5dd upstream.
      
      The MAX77620 driver fails to re-probe on deferred probe because driver
      core tries to claim resources that are already claimed by the PINCTRL
      device. Use device_set_of_node_from_dev() helper which marks OF node as
      reused, skipping erroneous execution of pinctrl_bind_pins() for the PMIC
      device on the re-probe.
      
      Fixes: aea6cb99
      
       ("regulator: resolve supply after creating regulator")
      Signed-off-by: default avatarDmitry Osipenko <digetx@gmail.com>
      Link: https://lore.kernel.org/r/20210523224243.13219-2-digetx@gmail.com
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      0856f230
    • Dmitry Baryshkov's avatar
      regulator: core: resolve supply for boot-on/always-on regulators · 7f531ff0
      Dmitry Baryshkov authored
      commit 98e48cd9 upstream.
      
      For the boot-on/always-on regulators the set_machine_constrainst() is
      called before resolving rdev->supply. Thus the code would try to enable
      rdev before enabling supplying regulator. Enforce resolving supply
      regulator before enabling rdev.
      
      Fixes: aea6cb99
      
       ("regulator: resolve supply after creating regulator")
      Signed-off-by: default avatarDmitry Baryshkov <dmitry.baryshkov@linaro.org>
      Link: https://lore.kernel.org/r/20210519221224.2868496-1-dmitry.baryshkov@linaro.org
      Signed-off-by: default avatarMark Brown <broonie@kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      7f531ff0
    • Maciej Żenczykowski's avatar
      usb: fix various gadget panics on 10gbps cabling · 45f9a2fe
      Maciej Żenczykowski authored
      commit 032e2880
      
       upstream.
      
      usb_assign_descriptors() is called with 5 parameters,
      the last 4 of which are the usb_descriptor_header for:
        full-speed (USB1.1 - 12Mbps [including USB1.0 low-speed @ 1.5Mbps),
        high-speed (USB2.0 - 480Mbps),
        super-speed (USB3.0 - 5Gbps),
        super-speed-plus (USB3.1 - 10Gbps).
      
      The differences between full/high/super-speed descriptors are usually
      substantial (due to changes in the maximum usb block size from 64 to 512
      to 1024 bytes and other differences in the specs), while the difference
      between 5 and 10Gbps descriptors may be as little as nothing
      (in many cases the same tuning is simply good enough).
      
      However if a gadget driver calls usb_assign_descriptors() with
      a NULL descriptor for super-speed-plus and is then used on a max 10gbps
      configuration, the kernel will crash with a null pointer dereference,
      when a 10gbps capable device port + cable + host port combination shows up.
      (This wouldn't happen if the gadget max-speed was set to 5gbps, but
      it of course defaults to the maximum, and there's no real reason to
      artificially limit it)
      
      The fix is to simply use the 5gbps descriptor as the 10gbps descriptor,
      if a 10gbps descriptor wasn't provided.
      
      Obviously this won't fix the problem if the 5gbps descriptor is also
      NULL, but such cases can't be so trivially solved (and any such gadgets
      are unlikely to be used with USB3 ports any way).
      
      Cc: Felipe Balbi <balbi@kernel.org>
      Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
      Signed-off-by: default avatarMaciej Żenczykowski <maze@google.com>
      Cc: stable <stable@vger.kernel.org>
      Link: https://lore.kernel.org/r/20210609024459.1126080-1-zenczykowski@gmail.com
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      45f9a2fe
    • Maciej Żenczykowski's avatar
      usb: fix various gadgets null ptr deref on 10gbps cabling. · 10770d2a
      Maciej Żenczykowski authored
      commit 90c4d057 upstream.
      
      This avoids a null pointer dereference in
      f_{ecm,eem,hid,loopback,printer,rndis,serial,sourcesink,subset,tcm}
      by simply reusing the 5gbps config for 10gbps.
      
      Fixes: eaef50c7
      
       ("usb: gadget: Update usb_assign_descriptors for SuperSpeedPlus")
      Cc: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
      Cc: Felipe Balbi <balbi@kernel.org>
      Cc: Gustavo A. R. Silva <gustavoars@kernel.org>
      Cc: Lorenzo Colitti <lorenzo@google.com>
      Cc: Martin K. Petersen <martin.petersen@oracle.com>
      Cc: Michael R Sweet <msweet@msweet.org>
      Cc: Mike Christie <michael.christie@oracle.com>
      Cc: Pawel Laszczak <pawell@cadence.com>
      Cc: Peter Chen <peter.chen@nxp.com>
      Cc: Sudhakar Panneerselvam <sudhakar.panneerselvam@oracle.com>
      Cc: Wei Ming Chen <jj251510319013@gmail.com>
      Cc: Will McVicker <willmcvicker@google.com>
      Cc: Zqiang <qiang.zhang@windriver.com>
      Reviewed-By: default avatarLorenzo Colitti <lorenzo@google.com>
      Cc: stable <stable@vger.kernel.org>
      Signed-off-by: default avatarMaciej Żenczykowski <maze@google.com>
      Link: https://lore.kernel.org/r/20210608044141.3898496-1-zenczykowski@gmail.com
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      10770d2a
    • Linyu Yuan's avatar
      usb: gadget: eem: fix wrong eem header operation · e76cb5c8
      Linyu Yuan authored
      commit 305f6708
      
       upstream.
      
      when skb_clone() or skb_copy_expand() fail,
      it should pull skb with lengh indicated by header,
      or not it will read network data and check it as header.
      
      Cc: <stable@vger.kernel.org>
      Signed-off-by: default avatarLinyu Yuan <linyyuan@codeaurora.com>
      Link: https://lore.kernel.org/r/20210608233547.3767-1-linyyuan@codeaurora.org
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      e76cb5c8
    • Stefan Agner's avatar
      USB: serial: cp210x: fix alternate function for CP2102N QFN20 · af9950fa
      Stefan Agner authored
      commit 6f7ec77c
      
       upstream.
      
      The QFN20 part has a different GPIO/port function assignment. The
      configuration struct bit field ordered as TX/RX/RS485/WAKEUP/CLK
      which exactly matches GPIO0-3 for QFN24/28. However, QFN20 has a
      different GPIO to primary function assignment.
      
      Special case QFN20 to follow to properly detect which GPIOs are
      available.
      
      Signed-off-by: default avatarStefan Agner <stefan@agner.ch>
      Link: https://lore.kernel.org/r/51830b2b24118eb0f77c5c9ac64ffb2f519dbb1d.1622218300.git.stefan@agner.ch
      Fixes: c8acfe0a
      
       ("USB: serial: cp210x: implement GPIO support for CP2102N")
      Cc: stable@vger.kernel.org	# 4.19
      Signed-off-by: default avatarJohan Hovold <johan@kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      af9950fa
    • Johan Hovold's avatar
      USB: serial: quatech2: fix control-request directions · 51aa7943
      Johan Hovold authored
      commit eb8dbe80 upstream.
      
      The direction of the pipe argument must match the request-type direction
      bit or control requests may fail depending on the host-controller-driver
      implementation.
      
      Fix the three requests which erroneously used usb_rcvctrlpipe().
      
      Fixes: f7a33e60
      
       ("USB: serial: add quatech2 usb to serial driver")
      Cc: stable@vger.kernel.org      # 3.5
      Signed-off-by: default avatarJohan Hovold <johan@kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      51aa7943
    • Alexandre GRIVEAUX's avatar
      USB: serial: omninet: add device id for Zyxel Omni 56K Plus · 4c8e13ed
      Alexandre GRIVEAUX authored
      commit fc0b3dc9
      
       upstream.
      
      Add device id for Zyxel Omni 56K Plus modem, this modem include:
      
      USB chip:
      NetChip
      NET2888
      
      Main chip:
      901041A
      F721501APGF
      
      Another modem using the same chips is the Zyxel Omni 56K DUO/NEO,
      could be added with the right USB ID.
      
      Signed-off-by: default avatarAlexandre GRIVEAUX <agriveaux@deutnet.info>
      Cc: stable@vger.kernel.org
      Signed-off-by: default avatarJohan Hovold <johan@kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      4c8e13ed
    • George McCollister's avatar
      USB: serial: ftdi_sio: add NovaTech OrionMX product ID · 165f3f9c
      George McCollister authored
      commit bc96c72d
      
       upstream.
      
      Add PID for the NovaTech OrionMX so it can be automatically detected.
      
      Signed-off-by: default avatarGeorge McCollister <george.mccollister@gmail.com>
      Cc: stable@vger.kernel.org
      Signed-off-by: default avatarJohan Hovold <johan@kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      165f3f9c
    • Wesley Cheng's avatar
      usb: gadget: f_fs: Ensure io_completion_wq is idle during unbind · 332b827d
      Wesley Cheng authored
      commit 6fc1db5e
      
       upstream.
      
      During unbind, ffs_func_eps_disable() will be executed, resulting in
      completion callbacks for any pending USB requests.  When using AIO,
      irrespective of the completion status, io_data work is queued to
      io_completion_wq to evaluate and handle the completed requests.  Since
      work runs asynchronously to the unbind() routine, there can be a
      scenario where the work runs after the USB gadget has been fully
      removed, resulting in accessing of a resource which has been already
      freed. (i.e. usb_ep_free_request() accessing the USB ep structure)
      
      Explicitly drain the io_completion_wq, instead of relying on the
      destroy_workqueue() (in ffs_data_put()) to make sure no pending
      completion work items are running.
      
      Signed-off-by: default avatarWesley Cheng <wcheng@codeaurora.org>
      Cc: stable <stable@vger.kernel.org>
      Link: https://lore.kernel.org/r/1621644261-1236-1-git-send-email-wcheng@codeaurora.org
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      332b827d
    • Mayank Rana's avatar
      usb: typec: ucsi: Clear PPM capability data in ucsi_init() error path · 83ca9ae4
      Mayank Rana authored
      commit f247f0a8 upstream.
      
      If ucsi_init() fails for some reason (e.g. ucsi_register_port()
      fails or general communication failure to the PPM), particularly at
      any point after the GET_CAPABILITY command had been issued, this
      results in unwinding the initialization and returning an error.
      However the ucsi structure's ucsi_capability member retains its
      current value, including likely a non-zero num_connectors.
      And because ucsi_init() itself is done in a workqueue a UCSI
      interface driver will be unaware that it failed and may think the
      ucsi_register() call was completely successful.  Later, if
      ucsi_unregister() is called, due to this stale ucsi->cap value it
      would try to access the items in the ucsi->connector array which
      might not be in a proper state or not even allocated at all and
      results in NULL or invalid pointer dereference.
      
      Fix this by clearing the ucsi->cap value to 0 during the error
      path of ucsi_init() in order to prevent a later ucsi_unregister()
      from entering the connector cleanup loop.
      
      Fixes: c1b0bc2d
      
       ("usb: typec: Add support for UCSI interface")
      Cc: stable@vger.kernel.org
      Acked-by: default avatarHeikki Krogerus <heikki.krogerus@linux.intel.com>
      Signed-off-by: default avatarMayank Rana <mrana@codeaurora.org>
      Signed-off-by: default avatarJack Pham <jackp@codeaurora.org>
      Link: https://lore.kernel.org/r/20210609073535.5094-1-jackp@codeaurora.org
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      83ca9ae4
    • Marian-Cristian Rotariu's avatar
      usb: dwc3: ep0: fix NULL pointer exception · bd551e7c
      Marian-Cristian Rotariu authored
      commit d0088908
      
       upstream.
      
      There is no validation of the index from dwc3_wIndex_to_dep() and we might
      be referring a non-existing ep and trigger a NULL pointer exception. In
      certain configurations we might use fewer eps and the index might wrongly
      indicate a larger ep index than existing.
      
      By adding this validation from the patch we can actually report a wrong
      index back to the caller.
      
      In our usecase we are using a composite device on an older kernel, but
      upstream might use this fix also. Unfortunately, I cannot describe the
      hardware for others to reproduce the issue as it is a proprietary
      implementation.
      
      [   82.958261] Unable to handle kernel NULL pointer dereference at virtual address 00000000000000a4
      [   82.966891] Mem abort info:
      [   82.969663]   ESR = 0x96000006
      [   82.972703]   Exception class = DABT (current EL), IL = 32 bits
      [   82.978603]   SET = 0, FnV = 0
      [   82.981642]   EA = 0, S1PTW = 0
      [   82.984765] Data abort info:
      [   82.987631]   ISV = 0, ISS = 0x00000006
      [   82.991449]   CM = 0, WnR = 0
      [   82.994409] user pgtable: 4k pages, 39-bit VAs, pgdp = 00000000c6210ccc
      [   83.000999] [00000000000000a4] pgd=0000000053aa5003, pud=0000000053aa5003, pmd=0000000000000000
      [   83.009685] Internal error: Oops: 96000006 [#1] PREEMPT SMP
      [   83.026433] Process irq/62-dwc3 (pid: 303, stack limit = 0x000000003985154c)
      [   83.033470] CPU: 0 PID: 303 Comm: irq/62-dwc3 Not tainted 4.19.124 #1
      [   83.044836] pstate: 60000085 (nZCv daIf -PAN -UAO)
      [   83.049628] pc : dwc3_ep0_handle_feature+0x414/0x43c
      [   83.054558] lr : dwc3_ep0_interrupt+0x3b4/0xc94
      
      ...
      
      [   83.141788] Call trace:
      [   83.144227]  dwc3_ep0_handle_feature+0x414/0x43c
      [   83.148823]  dwc3_ep0_interrupt+0x3b4/0xc94
      [   83.181546] ---[ end trace aac6b5267d84c32f ]---
      
      Signed-off-by: default avatarMarian-Cristian Rotariu <marian.c.rotariu@gmail.com>
      Cc: stable <stable@vger.kernel.org>
      Link: https://lore.kernel.org/r/20210608162650.58426-1-marian.c.rotariu@gmail.com
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      bd551e7c
    • Kyle Tso's avatar
      usb: pd: Set PD_T_SINK_WAIT_CAP to 310ms · 17cd5109
      Kyle Tso authored
      commit 6490fa56 upstream.
      
      Current timer PD_T_SINK_WAIT_CAP is set to 240ms which will violate the
      SinkWaitCapTimer (tTypeCSinkWaitCap 310 - 620 ms) defined in the PD
      Spec if the port is faster enough when running the state machine. Set it
      to the lower bound 310ms to ensure the timeout is in Spec.
      
      Fixes: f0690a25
      
       ("staging: typec: USB Type-C Port Manager (tcpm)")
      Cc: stable <stable@vger.kernel.org>
      Reviewed-by: default avatarGuenter Roeck <linux@roeck-us.net>
      Signed-off-by: default avatarKyle Tso <kyletso@google.com>
      Link: https://lore.kernel.org/r/20210528081613.730661-1-kyletso@google.com
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      17cd5109
    • Maciej Żenczykowski's avatar
      usb: f_ncm: only first packet of aggregate needs to start timer · 4da95bce
      Maciej Żenczykowski authored
      commit 1958ff5a
      
       upstream.
      
      The reasoning for this change is that if we already had
      a packet pending, then we also already had a pending timer,
      and as such there is no need to reschedule it.
      
      This also prevents packets getting delayed 60 ms worst case
      under a tiny packet every 290us transmit load, by keeping the
      timeout always relative to the first queued up packet.
      (300us delay * 16KB max aggregation / 80 byte packet =~ 60 ms)
      
      As such the first packet is now at most delayed by 300us.
      
      Under low transmit load, this will simply result in us sending
      a shorter aggregate, as originally intended.
      
      This patch has the benefit of greatly reducing (by ~10 factor
      with 1500 byte frames aggregated into 16 kiB) the number of
      (potentially pretty costly) updates to the hrtimer.
      
      Cc: Brooke Basile <brookebasile@gmail.com>
      Cc: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
      Cc: Felipe Balbi <balbi@kernel.org>
      Cc: Lorenzo Colitti <lorenzo@google.com>
      Signed-off-by: default avatarMaciej Żenczykowski <maze@google.com>
      Link: https://lore.kernel.org/r/20210608085438.813960-1-zenczykowski@gmail.com
      Cc: stable <stable@vger.kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      4da95bce
    • Maciej Żenczykowski's avatar
      USB: f_ncm: ncm_bitrate (speed) is unsigned · 24b2a632
      Maciej Żenczykowski authored
      commit 33701397 upstream.
      
      [  190.544755] configfs-gadget gadget: notify speed -44967296
      
      This is because 4250000000 - 2**32 is -44967296.
      
      Fixes: 9f6ce424
      
       ("usb: gadget: f_ncm.c added")
      Cc: Brooke Basile <brookebasile@gmail.com>
      Cc: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
      Cc: Felipe Balbi <balbi@kernel.org>
      Cc: Lorenzo Colitti <lorenzo@google.com>
      Cc: Yauheni Kaliuta <yauheni.kaliuta@nokia.com>
      Cc: Linux USB Mailing List <linux-usb@vger.kernel.org>
      Acked-By: default avatarLorenzo Colitti <lorenzo@google.com>
      Signed-off-by: default avatarMaciej Żenczykowski <maze@google.com>
      Cc: stable <stable@vger.kernel.org>
      Link: https://lore.kernel.org/r/20210608005344.3762668-1-zenczykowski@gmail.com
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      24b2a632
    • Alexander Kuznetsov's avatar
      cgroup1: don't allow '\n' in renaming · 7e7ff4d0
      Alexander Kuznetsov authored
      commit b7e24eb1
      
       upstream.
      
      cgroup_mkdir() have restriction on newline usage in names:
      $ mkdir $'/sys/fs/cgroup/cpu/test\ntest2'
      mkdir: cannot create directory
      '/sys/fs/cgroup/cpu/test\ntest2': Invalid argument
      
      But in cgroup1_rename() such check is missed.
      This allows us to make /proc/<pid>/cgroup unparsable:
      $ mkdir /sys/fs/cgroup/cpu/test
      $ mv /sys/fs/cgroup/cpu/test $'/sys/fs/cgroup/cpu/test\ntest2'
      $ echo $$ > $'/sys/fs/cgroup/cpu/test\ntest2'
      $ cat /proc/self/cgroup
      11:pids:/
      10:freezer:/
      9:hugetlb:/
      8:cpuset:/
      7:blkio:/user.slice
      6:memory:/user.slice
      5:net_cls,net_prio:/
      4:perf_event:/
      3:devices:/user.slice
      2:cpu,cpuacct:/test
      test2
      1:name=systemd:/
      0::/
      
      Signed-off-by: default avatarAlexander Kuznetsov <wwfq@yandex-team.ru>
      Reported-by: default avatarAndrey Krasichkov <buglloc@yandex-team.ru>
      Acked-by: default avatarDmitry Yakunin <zeil@yandex-team.ru>
      Cc: stable@vger.kernel.org
      Signed-off-by: default avatarTejun Heo <tj@kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      7e7ff4d0
    • Ritesh Harjani's avatar
      btrfs: return value from btrfs_mark_extent_written() in case of error · 9995f42e
      Ritesh Harjani authored
      commit e7b2ec3d
      
       upstream.
      
      We always return 0 even in case of an error in btrfs_mark_extent_written().
      Fix it to return proper error value in case of a failure. All callers
      handle it.
      
      CC: stable@vger.kernel.org # 4.4+
      Signed-off-by: default avatarRitesh Harjani <riteshh@linux.ibm.com>
      Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
      Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      9995f42e
    • Wenli Looi's avatar
      staging: rtl8723bs: Fix uninitialized variables · 379a3e30
      Wenli Looi authored
      commit 43c85d77 upstream.
      
      The sinfo.pertid and sinfo.generation variables are not initialized and
      it causes a crash when we use this as a wireless access point.
      
      [  456.873025] ------------[ cut here ]------------
      [  456.878198] kernel BUG at mm/slub.c:3968!
      [  456.882680] Internal error: Oops - BUG: 0 [#1] PREEMPT SMP ARM
      
        [ snip ]
      
      [  457.271004] Backtrace:
      [  457.273733] [<c02b7ee4>] (kfree) from [<c0e2a470>] (nl80211_send_station+0x954/0xfc4)
      [  457.282481]  r9:eccca0c0 r8:e8edfec0 r7:00000000 r6:00000011 r5:e80a9480 r4:e8edfe00
      [  457.291132] [<c0e29b1c>] (nl80211_send_station) from [<c0e2b18c>] (cfg80211_new_sta+0x90/0x1cc)
      [  457.300850]  r10:e80a9480 r9:e8edfe00 r8:ea678cca r7:00000a20 r6:00000000 r5:ec46d000
      [  457.309586]  r4:ec46d9e0
      [  457.312433] [<c0e2b0fc>] (cfg80211_new_sta) from [<bf086684>] (rtw_cfg80211_indicate_sta_assoc+0x80/0x9c [r8723bs])
      [  457.324095]  r10:00009930 r9:e85b9d80 r8:bf091050 r7:00000000 r6:00000000 r5:0000001c
      [  457.332831]  r4:c1606788
      [  457.335692] [<bf086604>] (rtw_cfg80211_indicate_sta_assoc [r8723bs]) from [<bf03df38>] (rtw_stassoc_event_callback+0x1c8/0x1d4 [r8723bs])
      [  457.349489]  r7:ea678cc0 r6:000000a1 r5:f1225f84 r4:f086b000
      [  457.355845] [<bf03dd70>] (rtw_stassoc_event_callback [r8723bs]) from [<bf048e4c>] (mlme_evt_hdl+0x8c/0xb4 [r8723bs])
      [  457.367601]  r7:c1604900 r6:f086c4b8 r5:00000000 r4:f086c000
      [  457.373959] [<bf048dc0>] (mlme_evt_hdl [r8723bs]) from [<bf03693c>] (rtw_cmd_thread+0x198/0x3d8 [r8723bs])
      [  457.384744]  r5:f086e000 r4:f086c000
      [  457.388754] [<bf0367a4>] (rtw_cmd_thread [r8723bs]) from [<c014a214>] (kthread+0x170/0x174)
      [  457.398083]  r10:ed7a57e8 r9:bf0367a4 r8:f086b000 r7:e8ede000 r6:00000000 r5:e9975200
      [  457.406828]  r4:e8369900
      [  457.409653] [<c014a0a4>] (kthread) from [<c01010e8>] (ret_from_fork+0x14/0x2c)
      [  457.417718] Exception stack(0xe8edffb0 to 0xe8edfff8)
      [  457.423356] ffa0:                                     00000000 00000000 00000000 00000000
      [  457.432492] ffc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
      [  457.441618] ffe0: 00000000 00000000 00000000 00000000 00000013 00000000
      [  457.449006]  r10:00000000 r9:00000000 r8:00000000 r7:00000000 r6:00000000 r5:c014a0a4
      [  457.457750]  r4:e9975200
      [  457.460574] Code: 1a000003 e5953004 e3130001 1a000000 (e7f001f2)
      [  457.467381] ---[ end trace 4acbc8c15e9e6aa7 ]---
      
      Link: https://forum.armbian.com/topic/14727-wifi-ap-kernel-bug-in-kernel-5444/
      Fixes: 8689c051 ("cfg80211: dynamically allocate per-tid stats for station info")
      Fixes: f5ea9120
      
       ("nl80211: add generation number to all dumps")
      Signed-off-by: default avatarWenli Looi <wlooi@ucalgary.ca>
      Reviewed-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
      Cc: stable <stable@vger.kernel.org>
      Link: https://lore.kernel.org/r/20210608064620.74059-1-wlooi@ucalgary.ca
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      379a3e30
    • Paolo Bonzini's avatar
      kvm: avoid speculation-based attacks from out-of-range memslot accesses · 22b87fb1
      Paolo Bonzini authored
      commit da27a83f
      
       upstream.
      
      KVM's mechanism for accessing guest memory translates a guest physical
      address (gpa) to a host virtual address using the right-shifted gpa
      (also known as gfn) and a struct kvm_memory_slot.  The translation is
      performed in __gfn_to_hva_memslot using the following formula:
      
            hva = slot->userspace_addr + (gfn - slot->base_gfn) * PAGE_SIZE
      
      It is expected that gfn falls within the boundaries of the guest's
      physical memory.  However, a guest can access invalid physical addresses
      in such a way that the gfn is invalid.
      
      __gfn_to_hva_memslot is called from kvm_vcpu_gfn_to_hva_prot, which first
      retrieves a memslot through __gfn_to_memslot.  While __gfn_to_memslot
      does check that the gfn falls within the boundaries of the guest's
      physical memory or not, a CPU can speculate the result of the check and
      continue execution speculatively using an illegal gfn. The speculation
      can result in calculating an out-of-bounds hva.  If the resulting host
      virtual address is used to load another guest physical address, this
      is effectively a Spectre gadget consisting of two consecutive reads,
      the second of which is data dependent on the first.
      
      Right now it's not clear if there are any cases in which this is
      exploitable.  One interesting case was reported by the original author
      of this patch, and involves visiting guest page tables on x86.  Right
      now these are not vulnerable because the hva read goes through get_user(),
      which contains an LFENCE speculation barrier.  However, there are
      patches in progress for x86 uaccess.h to mask kernel addresses instead of
      using LFENCE; once these land, a guest could use speculation to read
      from the VMM's ring 3 address space.  Other architectures such as ARM
      already use the address masking method, and would be susceptible to
      this same kind of data-dependent access gadgets.  Therefore, this patch
      proactively protects from these attacks by masking out-of-bounds gfns
      in __gfn_to_hva_memslot, which blocks speculation of invalid hvas.
      
      Sean Christopherson noted that this patch does not cover
      kvm_read_guest_offset_cached.  This however is limited to a few bytes
      past the end of the cache, and therefore it is unlikely to be useful in
      the context of building a chain of data dependent accesses.
      
      Reported-by: default avatarArtemiy Margaritov <artemiy.margaritov@gmail.com>
      Co-developed-by: default avatarArtemiy Margaritov <artemiy.margaritov@gmail.com>
      Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      22b87fb1
    • Desmond Cheong Zhi Xi's avatar
      drm: Lock pointer access in drm_master_release() · a376f7e6
      Desmond Cheong Zhi Xi authored
      commit c336a5ee
      
       upstream.
      
      This patch eliminates the following smatch warning:
      drivers/gpu/drm/drm_auth.c:320 drm_master_release() warn: unlocked access 'master' (line 318) expected lock '&dev->master_mutex'
      
      The 'file_priv->master' field should be protected by the mutex lock to
      '&dev->master_mutex'. This is because other processes can concurrently
      modify this field and free the current 'file_priv->master'
      pointer. This could result in a use-after-free error when 'master' is
      dereferenced in subsequent function calls to
      'drm_legacy_lock_master_cleanup()' or to 'drm_lease_revoke()'.
      
      An example of a scenario that would produce this error can be seen
      from a similar bug in 'drm_getunique()' that was reported by Syzbot:
      https://syzkaller.appspot.com/bug?id=148d2f1dfac64af52ffd27b661981a540724f803
      
      In the Syzbot report, another process concurrently acquired the
      device's master mutex in 'drm_setmaster_ioctl()', then overwrote
      'fpriv->master' in 'drm_new_set_master()'. The old value of
      'fpriv->master' was subsequently freed before the mutex was unlocked.
      
      Reported-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
      Signed-off-by: default avatarDesmond Cheong Zhi Xi <desmondcheongzx@gmail.com>
      Cc: stable@vger.kernel.org
      Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
      Link: https://patchwork.freedesktop.org/patch/msgid/20210609092119.173590-1-desmondcheongzx@gmail.com
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      a376f7e6
    • Desmond Cheong Zhi Xi's avatar
      drm: Fix use-after-free read in drm_getunique() · 7d233ba7
      Desmond Cheong Zhi Xi authored
      commit b436acd1
      
       upstream.
      
      There is a time-of-check-to-time-of-use error in drm_getunique() due
      to retrieving file_priv->master prior to locking the device's master
      mutex.
      
      An example can be seen in the crash report of the use-after-free error
      found by Syzbot:
      https://syzkaller.appspot.com/bug?id=148d2f1dfac64af52ffd27b661981a540724f803
      
      In the report, the master pointer was used after being freed. This is
      because another process had acquired the device's master mutex in
      drm_setmaster_ioctl(), then overwrote fpriv->master in
      drm_new_set_master(). The old value of fpriv->master was subsequently
      freed before the mutex was unlocked.
      
      To fix this, we lock the device's master mutex before retrieving the
      pointer from from fpriv->master. This patch passes the Syzbot
      reproducer test.
      
      Reported-by: default avatar <syzbot+c3a706cec1ea99e1c693@syzkaller.appspotmail.com>
      Signed-off-by: default avatarDesmond Cheong Zhi Xi <desmondcheongzx@gmail.com>
      Cc: stable@vger.kernel.org
      Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
      Link: https://patchwork.freedesktop.org/patch/msgid/20210608110436.239583-1-desmondcheongzx@gmail.com
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      7d233ba7