Skip to content
  1. Mar 18, 2021
    • Arnd Bergmann's avatar
      stop_machine: mark helpers __always_inline · 7da7542c
      Arnd Bergmann authored
      [ Upstream commit cbf78d85 ]
      
      With clang-13, some functions only get partially inlined, with a
      specialized version referring to a global variable.  This triggers a
      harmless build-time check for the intel-rng driver:
      
      WARNING: modpost: drivers/char/hw_random/intel-rng.o(.text+0xe): Section mismatch in reference from the function stop_machine() to the function .init.text:intel_rng_hw_init()
      The function stop_machine() references
      the function __init intel_rng_hw_init().
      This is often because stop_machine lacks a __init
      annotation or the annotation of intel_rng_hw_init is wrong.
      
      In this instance, an easy workaround is to force the stop_machine()
      function to be inline, along with related interfaces that did not show the
      same behavior at the moment, but theoretically could.
      
      The combination of the two patches listed below triggers the behavior in
      clang-13, but individually these commits are correct.
      
      Link: https://lkml.kernel.org/r/20210225130153.1956990-1-arnd@kernel.org
      Fixes: fe5595c0 ("stop_machine: Provide stop_machine_cpuslocked()")
      Fixes: ee527cd3
      
       ("Use stop_machine_run in the Intel RNG driver")
      Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
      Cc: Nathan Chancellor <nathan@kernel.org>
      Cc: Nick Desaulniers <ndesaulniers@google.com>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
      Cc: "Paul E. McKenney" <paulmck@kernel.org>
      Cc: Ingo Molnar <mingo@kernel.org>
      Cc: Prarit Bhargava <prarit@redhat.com>
      Cc: Daniel Bristot de Oliveira <bristot@redhat.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Cc: Valentin Schneider <valentin.schneider@arm.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      7da7542c
    • Peter Zijlstra's avatar
      seqlock,lockdep: Fix seqcount_latch_init() · 2a39eb7b
      Peter Zijlstra authored
      [ Upstream commit 4817a52b ]
      
      seqcount_init() must be a macro in order to preserve the static
      variable that is used for the lockdep key. Don't then wrap it in an
      inline function, which destroys that.
      
      Luckily there aren't many users of this function, but fix it before it
      becomes a problem.
      
      Fixes: 80793c34
      
       ("seqlock: Introduce seqcount_latch_t")
      Reported-by: default avatarEric Dumazet <eric.dumazet@gmail.com>
      Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
      Link: https://lkml.kernel.org/r/YEeFEbNUVkZaXDp4@hirez.programming.kicks-ass.net
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      2a39eb7b
    • Daniel Axtens's avatar
      powerpc/64s/exception: Clean up a missed SRR specifier · 372734dc
      Daniel Axtens authored
      [ Upstream commit c080a173 ]
      
      Nick's patch cleaning up the SRR specifiers in exception-64s.S missed
      a single instance of EXC_HV_OR_STD. Clean that up.
      
      Caught by clang's integrated assembler.
      
      Fixes: 3f7fbd97
      
       ("powerpc/64s/exception: Clean up SRR specifiers")
      Signed-off-by: default avatarDaniel Axtens <dja@axtens.net>
      Acked-by: default avatarNicholas Piggin <npiggin@gmail.com>
      Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
      Link: https://lore.kernel.org/r/20210225031006.1204774-2-dja@axtens.net
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      372734dc
    • Anna-Maria Behnsen's avatar
      hrtimer: Update softirq_expires_next correctly after __hrtimer_get_next_event() · df7dbfc2
      Anna-Maria Behnsen authored
      [ Upstream commit 46eb1701 ]
      
      hrtimer_force_reprogram() and hrtimer_interrupt() invokes
      __hrtimer_get_next_event() to find the earliest expiry time of hrtimer
      bases. __hrtimer_get_next_event() does not update
      cpu_base::[softirq_]_expires_next to preserve reprogramming logic. That
      needs to be done at the callsites.
      
      hrtimer_force_reprogram() updates cpu_base::softirq_expires_next only when
      the first expiring timer is a softirq timer and the soft interrupt is not
      activated. That's wrong because cpu_base::softirq_expires_next is left
      stale when the first expiring timer of all bases is a timer which expires
      in hard interrupt context. hrtimer_interrupt() does never update
      cpu_base::softirq_expires_next which is wrong too.
      
      That becomes a problem when clock_settime() sets CLOCK_REALTIME forward and
      the first soft expiring timer is in the CLOCK_REALTIME_SOFT base. Setting
      CLOCK_REALTIME forward moves the clock MONOTONIC based expiry time of that
      timer before the stale cpu_base::softirq_expires_next.
      
      cpu_base::softirq_expires_next is cached to make the check for raising the
      soft interrupt fast. In the above case the soft interrupt won't be raised
      until clock monotonic reaches the stale cpu_base::softirq_expires_next
      value. That's incorrect, but what's worse it that if the softirq timer
      becomes the first expiring timer of all clock bases after the hard expiry
      timer has been handled the reprogramming of the clockevent from
      hrtimer_interrupt() will result in an interrupt storm. That happens because
      the reprogramming does not use cpu_base::softirq_expires_next, it uses
      __hrtimer_get_next_event() which returns the actual expiry time. Once clock
      MONOTONIC reaches cpu_base::softirq_expires_next the soft interrupt is
      raised and the storm subsides.
      
      Change the logic in hrtimer_force_reprogram() to evaluate the soft and hard
      bases seperately, update softirq_expires_next and handle the case when a
      soft expiring timer is the first of all bases by comparing the expiry times
      and updating the required cpu base fields. Split this functionality into a
      separate function to be able to use it in hrtimer_interrupt() as well
      without copy paste.
      
      Fixes: 5da70160
      
       ("hrtimer: Implement support for softirq based hrtimers")
      Reported-by: default avatarMikael Beckius <mikael.beckius@windriver.com>
      Suggested-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Tested-by: default avatarMikael Beckius <mikael.beckius@windriver.com>
      Signed-off-by: default avatarAnna-Maria Behnsen <anna-maria@linutronix.de>
      Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
      Link: https://lore.kernel.org/r/20210223160240.27518-1-anna-maria@linutronix.de
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      df7dbfc2
    • Kan Liang's avatar
      perf/x86/intel: Set PERF_ATTACH_SCHED_CB for large PEBS and LBR · 896846b8
      Kan Liang authored
      [ Upstream commit afbef301 ]
      
      To supply a PID/TID for large PEBS, it requires flushing the PEBS buffer
      in a context switch.
      
      For normal LBRs, a context switch can flip the address space and LBR
      entries are not tagged with an identifier, we need to wipe the LBR, even
      for per-cpu events.
      
      For LBR callstack, save/restore the stack is required during a context
      switch.
      
      Set PERF_ATTACH_SCHED_CB for the event with large PEBS & LBR.
      
      Fixes: 9c964efa
      
       ("perf/x86/intel: Drain the PEBS buffer during context switches")
      Signed-off-by: default avatarKan Liang <kan.liang@linux.intel.com>
      Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
      Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
      Link: https://lkml.kernel.org/r/20201130193842.10569-2-kan.liang@linux.intel.com
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      896846b8
    • Kan Liang's avatar
      perf/core: Flush PMU internal buffers for per-CPU events · 82ad50c1
      Kan Liang authored
      [ Upstream commit a5398bff ]
      
      Sometimes the PMU internal buffers have to be flushed for per-CPU events
      during a context switch, e.g., large PEBS. Otherwise, the perf tool may
      report samples in locations that do not belong to the process where the
      samples are processed in, because PEBS does not tag samples with PID/TID.
      
      The current code only flush the buffers for a per-task event. It doesn't
      check a per-CPU event.
      
      Add a new event state flag, PERF_ATTACH_SCHED_CB, to indicate that the
      PMU internal buffers have to be flushed for this event during a context
      switch.
      
      Add sched_cb_entry and perf_sched_cb_usages back to track the PMU/cpuctx
      which is required to be flushed.
      
      Only need to invoke the sched_task() for per-CPU events in this patch.
      The per-task events have been handled in perf_event_context_sched_in/out
      already.
      
      Fixes: 9c964efa
      
       ("perf/x86/intel: Drain the PEBS buffer during context switches")
      Reported-by: default avatarGabriel Marin <gmx@google.com>
      Originally-by: default avatarNamhyung Kim <namhyung@kernel.org>
      Signed-off-by: default avatarKan Liang <kan.liang@linux.intel.com>
      Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
      Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
      Link: https://lkml.kernel.org/r/20201130193842.10569-1-kan.liang@linux.intel.com
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      82ad50c1
    • Ard Biesheuvel's avatar
      arm64: mm: use a 48-bit ID map when possible on 52-bit VA builds · 3ebd4bd2
      Ard Biesheuvel authored
      [ Upstream commit 7ba8f2b2 ]
      
      52-bit VA kernels can run on hardware that is only 48-bit capable, but
      configure the ID map as 52-bit by default. This was not a problem until
      recently, because the special T0SZ value for a 52-bit VA space was never
      programmed into the TCR register anwyay, and because a 52-bit ID map
      happens to use the same number of translation levels as a 48-bit one.
      
      This behavior was changed by commit 1401bef7 ("arm64: mm: Always update
      TCR_EL1 from __cpu_set_tcr_t0sz()"), which causes the unsupported T0SZ
      value for a 52-bit VA to be programmed into TCR_EL1. While some hardware
      simply ignores this, Mark reports that Amberwing systems choke on this,
      resulting in a broken boot. But even before that commit, the unsupported
      idmap_t0sz value was exposed to KVM and used to program TCR_EL2 incorrectly
      as well.
      
      Given that we already have to deal with address spaces being either 48-bit
      or 52-bit in size, the cleanest approach seems to be to simply default to
      a 48-bit VA ID map, and only switch to a 52-bit one if the placement of the
      kernel in DRAM requires it. This is guaranteed not to happen unless the
      system is actually 52-bit VA capable.
      
      Fixes: 90ec95cd
      
       ("arm64: mm: Introduce VA_BITS_MIN")
      Reported-by: default avatarMark Salter <msalter@redhat.com>
      Link: http://lore.kernel.org/r/20210310003216.410037-1-msalter@redhat.com
      Signed-off-by: default avatarArd Biesheuvel <ardb@kernel.org>
      Link: https://lore.kernel.org/r/20210310171515.416643-2-ardb@kernel.org
      Signed-off-by: default avatarWill Deacon <will@kernel.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      3ebd4bd2
    • Daiyue Zhang's avatar
      configfs: fix a use-after-free in __configfs_open_file · 10972034
      Daiyue Zhang authored
      [ Upstream commit 14fbbc82 ]
      
      Commit b0841eef ("configfs: provide exclusion between IO and removals")
      uses ->frag_dead to mark the fragment state, thus no bothering with extra
      refcount on config_item when opening a file. The configfs_get_config_item
      was removed in __configfs_open_file, but not with config_item_put. So the
      refcount on config_item will lost its balance, causing use-after-free
      issues in some occasions like this:
      
      Test:
      1. Mount configfs on /config with read-only items:
      drwxrwx--- 289 root   root            0 2021-04-01 11:55 /config
      drwxr-xr-x   2 root   root            0 2021-04-01 11:54 /config/a
      --w--w--w-   1 root   root         4096 2021-04-01 11:53 /config/a/1.txt
      ......
      
      2. Then run:
      for file in /config
      do
      echo $file
      grep -R 'key' $file
      done
      
      3. __configfs_open_file will be called in parallel, the first one
      got called will do:
      if (file->f_mode & FMODE_READ) {
      	if (!(inode->i_mode & S_IRUGO))
      		goto out_put_module;
      			config_item_put(buffer->item);
      				kref_put()
      					package_details_release()
      						kfree()
      
      the other one will run into use-after-free issues like this:
      BUG: KASAN: use-after-free in __configfs_open_file+0x1bc/0x3b0
      Read of size 8 at addr fffffff155f02480 by task grep/13096
      CPU: 0 PID: 13096 Comm: grep VIP: 00 Tainted: G        W       4.14.116-kasan #1
      TGID: 13096 Comm: grep
      Call trace:
      dump_stack+0x118/0x160
      kasan_report+0x22c/0x294
      __asan_load8+0x80/0x88
      __configfs_open_file+0x1bc/0x3b0
      configfs_open_file+0x28/0x34
      do_dentry_open+0x2cc/0x5c0
      vfs_open+0x80/0xe0
      path_openat+0xd8c/0x2988
      do_filp_open+0x1c4/0x2fc
      do_sys_open+0x23c/0x404
      SyS_openat+0x38/0x48
      
      Allocated by task 2138:
      kasan_kmalloc+0xe0/0x1ac
      kmem_cache_alloc_trace+0x334/0x394
      packages_make_item+0x4c/0x180
      configfs_mkdir+0x358/0x740
      vfs_mkdir2+0x1bc/0x2e8
      SyS_mkdirat+0x154/0x23c
      el0_svc_naked+0x34/0x38
      
      Freed by task 13096:
      kasan_slab_free+0xb8/0x194
      kfree+0x13c/0x910
      package_details_release+0x524/0x56c
      kref_put+0xc4/0x104
      config_item_put+0x24/0x34
      __configfs_open_file+0x35c/0x3b0
      configfs_open_file+0x28/0x34
      do_dentry_open+0x2cc/0x5c0
      vfs_open+0x80/0xe0
      path_openat+0xd8c/0x2988
      do_filp_open+0x1c4/0x2fc
      do_sys_open+0x23c/0x404
      SyS_openat+0x38/0x48
      el0_svc_naked+0x34/0x38
      
      To fix this issue, remove the config_item_put in
      __configfs_open_file to balance the refcount of config_item.
      
      Fixes: b0841eef
      
       ("configfs: provide exclusion between IO and removals")
      Signed-off-by: default avatarDaiyue Zhang <zhangdaiyue1@huawei.com>
      Signed-off-by: default avatarYi Chen <chenyi77@huawei.com>
      Signed-off-by: default avatarGe Qiu <qiuge@huawei.com>
      Reviewed-by: default avatarChao Yu <yuchao0@huawei.com>
      Acked-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
      Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      10972034
    • James Smart's avatar
      nvme-fc: fix racing controller reset and create association · 6cf11f3a
      James Smart authored
      [ Upstream commit f20ef34d ]
      
      Recent patch to prevent calling __nvme_fc_abort_outstanding_ios in
      interrupt context results in a possible race condition. A controller
      reset results in errored io completions, which schedules error
      work. The change of error work to a work element allows it to fire
      after the ctrl state transition to NVME_CTRL_CONNECTING, causing
      any outstanding io (used to initialize the controller) to fail and
      cause problems for connect_work.
      
      Add a state check to only schedule error work if not in the RESETTING
      state.
      
      Fixes: 19fce047
      
       ("nvme-fc: avoid calling _nvme_fc_abort_outstanding_ios from interrupt context")
      Signed-off-by: default avatarNigel Kirkland <nkirkland2304@gmail.com>
      Signed-off-by: default avatarJames Smart <jsmart2021@gmail.com>
      Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      6cf11f3a
    • Jia-Ju Bai's avatar
      block: rsxx: fix error return code of rsxx_pci_probe() · d1d91849
      Jia-Ju Bai authored
      [ Upstream commit df66617b ]
      
      When create_singlethread_workqueue returns NULL to card->event_wq, no
      error return code of rsxx_pci_probe() is assigned.
      
      To fix this bug, st is assigned with -ENOMEM in this case.
      
      Fixes: 8722ff8c
      
       ("block: IBM RamSan 70/80 device driver")
      Reported-by: default avatarTOTE Robot <oslab@tsinghua.edu.cn>
      Signed-off-by: default avatarJia-Ju Bai <baijiaju1990@gmail.com>
      Link: https://lore.kernel.org/r/20210310033017.4023-1-baijiaju1990@gmail.com
      Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      d1d91849
    • Ondrej Mosnacek's avatar
      NFSv4.2: fix return value of _nfs4_get_security_label() · caa86901
      Ondrej Mosnacek authored
      [ Upstream commit 53cb2454 ]
      
      An xattr 'get' handler is expected to return the length of the value on
      success, yet _nfs4_get_security_label() (and consequently also
      nfs4_xattr_get_nfs4_label(), which is used as an xattr handler) returns
      just 0 on success.
      
      Fix this by returning label.len instead, which contains the length of
      the result.
      
      Fixes: aa9c2669
      
       ("NFS: Client implementation of Labeled-NFS")
      Signed-off-by: default avatarOndrej Mosnacek <omosnace@redhat.com>
      Reviewed-by: default avatarJames Morris <jamorris@linux.microsoft.com>
      Reviewed-by: default avatarPaul Moore <paul@paul-moore.com>
      Signed-off-by: default avatarAnna Schumaker <Anna.Schumaker@Netapp.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      caa86901
    • Trond Myklebust's avatar
      NFS: Don't gratuitously clear the inode cache when lookup failed · e181960e
      Trond Myklebust authored
      [ Upstream commit 47397915 ]
      
      The fact that the lookup revalidation failed, does not mean that the
      inode contents have changed.
      
      Fixes: 5ceb9d7f
      
       ("NFS: Refactor nfs_lookup_revalidate()")
      Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
      Signed-off-by: default avatarAnna Schumaker <Anna.Schumaker@Netapp.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      e181960e
    • Trond Myklebust's avatar
      NFS: Don't revalidate the directory permissions on a lookup failure · dd756d05
      Trond Myklebust authored
      [ Upstream commit 82e7ca13
      
       ]
      
      There should be no reason to expect the directory permissions to change
      just because the directory contents changed or a negative lookup timed
      out. So let's avoid doing a full call to nfs_mark_for_revalidate() in
      that case.
      Furthermore, if this is a negative dentry, and we haven't actually done
      a new lookup, then we have no reason yet to believe the directory has
      changed at all. So let's remove the gratuitous directory inode
      invalidation altogether when called from
      nfs_lookup_revalidate_negative().
      
      Reported-by: default avatarGeert Jansen <gerardu@amazon.com>
      Fixes: 5ceb9d7f
      
       ("NFS: Refactor nfs_lookup_revalidate()")
      Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
      Signed-off-by: default avatarAnna Schumaker <Anna.Schumaker@Netapp.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      dd756d05
    • Benjamin Coddington's avatar
      SUNRPC: Set memalloc_nofs_save() for sync tasks · faa48b23
      Benjamin Coddington authored
      [ Upstream commit f0940f4b ]
      
      We could recurse into NFS doing memory reclaim while sending a sync task,
      which might result in a deadlock.  Set memalloc_nofs_save for sync task
      execution.
      
      Fixes: a1231fda
      
       ("SUNRPC: Set memalloc_nofs_save() on all rpciod/xprtiod jobs")
      Signed-off-by: default avatarBenjamin Coddington <bcodding@redhat.com>
      Signed-off-by: default avatarAnna Schumaker <Anna.Schumaker@Netapp.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      faa48b23
    • Anshuman Khandual's avatar
      arm64/mm: Fix pfn_valid() for ZONE_DEVICE based memory · 475a4307
      Anshuman Khandual authored
      [ Upstream commit eeb0753b
      
       ]
      
      pfn_valid() validates a pfn but basically it checks for a valid struct page
      backing for that pfn. It should always return positive for memory ranges
      backed with struct page mapping. But currently pfn_valid() fails for all
      ZONE_DEVICE based memory types even though they have struct page mapping.
      
      pfn_valid() asserts that there is a memblock entry for a given pfn without
      MEMBLOCK_NOMAP flag being set. The problem with ZONE_DEVICE based memory is
      that they do not have memblock entries. Hence memblock_is_map_memory() will
      invariably fail via memblock_search() for a ZONE_DEVICE based address. This
      eventually fails pfn_valid() which is wrong. memblock_is_map_memory() needs
      to be skipped for such memory ranges. As ZONE_DEVICE memory gets hotplugged
      into the system via memremap_pages() called from a driver, their respective
      memory sections will not have SECTION_IS_EARLY set.
      
      Normal hotplug memory will never have MEMBLOCK_NOMAP set in their memblock
      regions. Because the flag MEMBLOCK_NOMAP was specifically designed and set
      for firmware reserved memory regions. memblock_is_map_memory() can just be
      skipped as its always going to be positive and that will be an optimization
      for the normal hotplug memory. Like ZONE_DEVICE based memory, all normal
      hotplugged memory too will not have SECTION_IS_EARLY set for their sections
      
      Skipping memblock_is_map_memory() for all non early memory sections would
      fix pfn_valid() problem for ZONE_DEVICE based memory and also improve its
      performance for normal hotplug memory as well.
      
      Cc: Catalin Marinas <catalin.marinas@arm.com>
      Cc: Will Deacon <will@kernel.org>
      Cc: Ard Biesheuvel <ardb@kernel.org>
      Cc: Robin Murphy <robin.murphy@arm.com>
      Cc: linux-arm-kernel@lists.infradead.org
      Cc: linux-kernel@vger.kernel.org
      Acked-by: default avatarDavid Hildenbrand <david@redhat.com>
      Fixes: 73b20c84
      
       ("arm64: mm: implement pte_devmap support")
      Signed-off-by: default avatarAnshuman Khandual <anshuman.khandual@arm.com>
      Acked-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
      Link: https://lore.kernel.org/r/1614921898-4099-2-git-send-email-anshuman.khandual@arm.com
      Signed-off-by: default avatarWill Deacon <will@kernel.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      475a4307
    • Wei Yongjun's avatar
      cpufreq: qcom-hw: Fix return value check in qcom_cpufreq_hw_cpu_init() · e50ada58
      Wei Yongjun authored
      [ Upstream commit 536eb97a ]
      
      In case of error, the function ioremap() returns NULL pointer
      not ERR_PTR(). The IS_ERR() test in the return value check
      should be replaced with NULL test.
      
      Fixes: 67fc209b
      
       ("cpufreq: qcom-hw: drop devm_xxx() calls from init/exit hooks")
      Reported-by: default avatarHulk Robot <hulkci@huawei.com>
      Signed-off-by: default avatarWei Yongjun <weiyongjun1@huawei.com>
      Acked-by: default avatarShawn Guo <shawn.guo@linaro.org>
      Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      e50ada58
    • Shawn Guo's avatar
      cpufreq: qcom-hw: fix dereferencing freed memory 'data' · 7dfe37e9
      Shawn Guo authored
      [ Upstream commit 02fc4095 ]
      
      Commit 67fc209b ("cpufreq: qcom-hw: drop devm_xxx() calls from
      init/exit hooks") introduces an issue of dereferencing freed memory
      'data'.  Fix it.
      
      Fixes: 67fc209b
      
       ("cpufreq: qcom-hw: drop devm_xxx() calls from init/exit hooks")
      Reported-by: default avatarkernel test robot <lkp@intel.com>
      Reported-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
      Signed-off-by: default avatarShawn Guo <shawn.guo@linaro.org>
      Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      7dfe37e9
    • Sergey Shtylyov's avatar
      sh_eth: fix TRSCER mask for R7S72100 · 75d9be57
      Sergey Shtylyov authored
      [ Upstream commit 75be7fb7 ]
      
      According  to  the RZ/A1H Group, RZ/A1M Group User's Manual: Hardware,
      Rev. 4.00, the TRSCER register has bit 9 reserved, hence we can't use
      the driver's default TRSCER mask.  Add the explicit initializer for
      sh_eth_cpu_data::trscer_err_mask for R7S72100.
      
      Fixes: db893473
      
       ("sh_eth: Add support for r7s72100")
      Signed-off-by: default avatarSergey Shtylyov <s.shtylyov@omprussia.ru>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      75d9be57
    • Ian Abbott's avatar
      staging: comedi: pcl818: Fix endian problem for AI command data · a854bd05
      Ian Abbott authored
      commit 148e34fd upstream.
      
      The analog input subdevice supports Comedi asynchronous commands that
      use Comedi's 16-bit sample format.  However, the call to
      `comedi_buf_write_samples()` is passing the address of a 32-bit integer
      parameter.  On bigendian machines, this will copy 2 bytes from the wrong
      end of the 32-bit value.  Fix it by changing the type of the parameter
      holding the sample value to `unsigned short`.
      
      [Note: the bug was introduced in commit edf4537b ("staging: comedi:
      pcl818: use comedi_buf_write_samples()") but the patch applies better to
      commit d615416d ("staging: comedi: pcl818: introduce
      pcl818_ai_write_sample()").]
      
      Fixes: d615416d
      
       ("staging: comedi: pcl818: introduce pcl818_ai_write_sample()")
      Cc: <stable@vger.kernel.org> # 4.0+
      Signed-off-by: default avatarIan Abbott <abbotti@mev.co.uk>
      Link: https://lore.kernel.org/r/20210223143055.257402-10-abbotti@mev.co.uk
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      a854bd05
    • Ian Abbott's avatar
      staging: comedi: pcl711: Fix endian problem for AI command data · ddfeb236
      Ian Abbott authored
      commit a084303a upstream.
      
      The analog input subdevice supports Comedi asynchronous commands that
      use Comedi's 16-bit sample format.  However, the call to
      `comedi_buf_write_samples()` is passing the address of a 32-bit integer
      variable.  On bigendian machines, this will copy 2 bytes from the wrong
      end of the 32-bit value.  Fix it by changing the type of the variable
      holding the sample value to `unsigned short`.
      
      Fixes: 1f44c034
      
       ("staging: comedi: pcl711: use comedi_buf_write_samples()")
      Cc: <stable@vger.kernel.org> # 3.19+
      Signed-off-by: default avatarIan Abbott <abbotti@mev.co.uk>
      Link: https://lore.kernel.org/r/20210223143055.257402-9-abbotti@mev.co.uk
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      ddfeb236
    • Ian Abbott's avatar
      staging: comedi: me4000: Fix endian problem for AI command data · c30fe0f7
      Ian Abbott authored
      commit b39dfcce upstream.
      
      The analog input subdevice supports Comedi asynchronous commands that
      use Comedi's 16-bit sample format.  However, the calls to
      `comedi_buf_write_samples()` are passing the address of a 32-bit integer
      variable.  On bigendian machines, this will copy 2 bytes from the wrong
      end of the 32-bit value.  Fix it by changing the type of the variable
      holding the sample value to `unsigned short`.
      
      Fixes: de88924f
      
       ("staging: comedi: me4000: use comedi_buf_write_samples()")
      Cc: <stable@vger.kernel.org> # 3.19+
      Signed-off-by: default avatarIan Abbott <abbotti@mev.co.uk>
      Link: https://lore.kernel.org/r/20210223143055.257402-8-abbotti@mev.co.uk
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      c30fe0f7
    • Ian Abbott's avatar
      staging: comedi: dmm32at: Fix endian problem for AI command data · 2c1ea26a
      Ian Abbott authored
      commit 54999c0d upstream.
      
      The analog input subdevice supports Comedi asynchronous commands that
      use Comedi's 16-bit sample format.  However, the call to
      `comedi_buf_write_samples()` is passing the address of a 32-bit integer
      variable.  On bigendian machines, this will copy 2 bytes from the wrong
      end of the 32-bit value.  Fix it by changing the type of the variable
      holding the sample value to `unsigned short`.
      
      [Note: the bug was introduced in commit 1700529b ("staging: comedi:
      dmm32at: use comedi_buf_write_samples()") but the patch applies better
      to the later (but in the same kernel release) commit 0c0eadad
      ("staging: comedi: dmm32at: introduce dmm32_ai_get_sample()").]
      
      Fixes: 0c0eadad
      
       ("staging: comedi: dmm32at: introduce dmm32_ai_get_sample()")
      Cc: <stable@vger.kernel.org> # 3.19+
      Signed-off-by: default avatarIan Abbott <abbotti@mev.co.uk>
      Link: https://lore.kernel.org/r/20210223143055.257402-7-abbotti@mev.co.uk
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      2c1ea26a
    • Ian Abbott's avatar
      staging: comedi: das800: Fix endian problem for AI command data · c36d2f40
      Ian Abbott authored
      commit 459b1e8c upstream.
      
      The analog input subdevice supports Comedi asynchronous commands that
      use Comedi's 16-bit sample format.  However, the call to
      `comedi_buf_write_samples()` is passing the address of a 32-bit integer
      variable.  On bigendian machines, this will copy 2 bytes from the wrong
      end of the 32-bit value.  Fix it by changing the type of the variable
      holding the sample value to `unsigned short`.
      
      Fixes: ad9eb43c
      
       ("staging: comedi: das800: use comedi_buf_write_samples()")
      Cc: <stable@vger.kernel.org> # 3.19+
      Signed-off-by: default avatarIan Abbott <abbotti@mev.co.uk>
      Link: https://lore.kernel.org/r/20210223143055.257402-6-abbotti@mev.co.uk
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      c36d2f40
    • Ian Abbott's avatar
      staging: comedi: das6402: Fix endian problem for AI command data · d8f26a41
      Ian Abbott authored
      commit 1c0f20b7 upstream.
      
      The analog input subdevice supports Comedi asynchronous commands that
      use Comedi's 16-bit sample format.  However, the call to
      `comedi_buf_write_samples()` is passing the address of a 32-bit integer
      variable.  On bigendian machines, this will copy 2 bytes from the wrong
      end of the 32-bit value.  Fix it by changing the type of the variable
      holding the sample value to `unsigned short`.
      
      Fixes: d1d24cb6
      
       ("staging: comedi: das6402: read analog input samples in interrupt handler")
      Cc: <stable@vger.kernel.org> # 3.19+
      Signed-off-by: default avatarIan Abbott <abbotti@mev.co.uk>
      Link: https://lore.kernel.org/r/20210223143055.257402-5-abbotti@mev.co.uk
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      d8f26a41
    • Ian Abbott's avatar
      staging: comedi: adv_pci1710: Fix endian problem for AI command data · b46f6908
      Ian Abbott authored
      commit b2e78630 upstream.
      
      The analog input subdevice supports Comedi asynchronous commands that
      use Comedi's 16-bit sample format.  However, the calls to
      `comedi_buf_write_samples()` are passing the address of a 32-bit integer
      variable.  On bigendian machines, this will copy 2 bytes from the wrong
      end of the 32-bit value.  Fix it by changing the type of the variables
      holding the sample value to `unsigned short`.  The type of the `val`
      parameter of `pci1710_ai_read_sample()` is changed to `unsigned short *`
      accordingly.  The type of the `val` variable in `pci1710_ai_insn_read()`
      is also changed to `unsigned short` since its address is passed to
      `pci1710_ai_read_sample()`.
      
      Fixes: a9c3a015
      
       ("staging: comedi: adv_pci1710: use comedi_buf_write_samples()")
      Cc: <stable@vger.kernel.org> # 4.0+
      Signed-off-by: default avatarIan Abbott <abbotti@mev.co.uk>
      Link: https://lore.kernel.org/r/20210223143055.257402-4-abbotti@mev.co.uk
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      b46f6908
    • Ian Abbott's avatar
      staging: comedi: addi_apci_1500: Fix endian problem for command sample · 66a44ed4
      Ian Abbott authored
      commit ac0bbf55 upstream.
      
      The digital input subdevice supports Comedi asynchronous commands that
      read interrupt status information.  This uses 16-bit Comedi samples (of
      which only the bottom 8 bits contain status information).  However, the
      interrupt handler is calling `comedi_buf_write_samples()` with the
      address of a 32-bit variable `unsigned int status`.  On a bigendian
      machine, this will copy 2 bytes from the wrong end of the variable.  Fix
      it by changing the type of the variable to `unsigned short`.
      
      Fixes: a8c66b68
      
       ("staging: comedi: addi_apci_1500: rewrite the subdevice support functions")
      Cc: <stable@vger.kernel.org> #4.0+
      Signed-off-by: default avatarIan Abbott <abbotti@mev.co.uk>
      Link: https://lore.kernel.org/r/20210223143055.257402-3-abbotti@mev.co.uk
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      66a44ed4
    • Ian Abbott's avatar
      staging: comedi: addi_apci_1032: Fix endian problem for COS sample · 4d14685f
      Ian Abbott authored
      commit 25317f42 upstream.
      
      The Change-Of-State (COS) subdevice supports Comedi asynchronous
      commands to read 16-bit change-of-state values.  However, the interrupt
      handler is calling `comedi_buf_write_samples()` with the address of a
      32-bit integer `&s->state`.  On bigendian architectures, it will copy 2
      bytes from the wrong end of the 32-bit integer.  Fix it by transferring
      the value via a 16-bit integer.
      
      Fixes: 6bb45f2b
      
       ("staging: comedi: addi_apci_1032: use comedi_buf_write_samples()")
      Cc: <stable@vger.kernel.org> # 3.19+
      Signed-off-by: default avatarIan Abbott <abbotti@mev.co.uk>
      Link: https://lore.kernel.org/r/20210223143055.257402-2-abbotti@mev.co.uk
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      4d14685f
    • Lee Gibson's avatar
      staging: rtl8192e: Fix possible buffer overflow in _rtl92e_wx_set_scan · c5d3e25e
      Lee Gibson authored
      commit 8687bf9e
      
       upstream.
      
      Function _rtl92e_wx_set_scan calls memcpy without checking the length.
      A user could control that length and trigger a buffer overflow.
      Fix by checking the length is within the maximum allowed size.
      
      Reviewed-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
      Signed-off-by: default avatarLee Gibson <leegib@gmail.com>
      Cc: stable <stable@vger.kernel.org>
      Link: https://lore.kernel.org/r/20210226145157.424065-1-leegib@gmail.com
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      c5d3e25e
    • Lee Gibson's avatar
      staging: rtl8712: Fix possible buffer overflow in r8712_sitesurvey_cmd · 74a14d8a
      Lee Gibson authored
      commit b93c1e39
      
       upstream.
      
      Function r8712_sitesurvey_cmd calls memcpy without checking the length.
      A user could control that length and trigger a buffer overflow.
      Fix by checking the length is within the maximum allowed size.
      
      Signed-off-by: default avatarLee Gibson <leegib@gmail.com>
      Link: https://lore.kernel.org/r/20210301132648.420296-1-leegib@gmail.com
      Cc: stable <stable@vger.kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      74a14d8a
    • Dan Carpenter's avatar
      staging: ks7010: prevent buffer overflow in ks_wlan_set_scan() · 66cf4f58
      Dan Carpenter authored
      commit e163b982 upstream.
      
      The user can specify a "req->essid_len" of up to 255 but if it's
      over IW_ESSID_MAX_SIZE (32) that can lead to memory corruption.
      
      Fixes: 13a9930d
      
       ("staging: ks7010: add driver from Nanonote extra-repository")
      Signed-off-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
      Cc: stable <stable@vger.kernel.org>
      Link: https://lore.kernel.org/r/YD4fS8+HmM/Qmrw6@mwanda
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      66cf4f58
    • Dan Carpenter's avatar
      staging: rtl8188eu: fix potential memory corruption in rtw_check_beacon_data() · be974530
      Dan Carpenter authored
      commit d4ac6403 upstream.
      
      The "ie_len" is a value in the 1-255 range that comes from the user.  We
      have to cap it to ensure that it's not too large or it could lead to
      memory corruption.
      
      Fixes: 9a7fe54d
      
       ("staging: r8188eu: Add source files for new driver - part 1")
      Signed-off-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
      Cc: stable <stable@vger.kernel.org>
      Link: https://lore.kernel.org/r/YEHyQCrFZKTXyT7J@mwanda
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      be974530
    • Dan Carpenter's avatar
      staging: rtl8712: unterminated string leads to read overflow · 550c9e49
      Dan Carpenter authored
      commit d660f4f4 upstream.
      
      The memdup_user() function does not necessarily return a NUL terminated
      string so this can lead to a read overflow.  Switch from memdup_user()
      to strndup_user() to fix this bug.
      
      Fixes: c6dc001f
      
       ("staging: r8712u: Merging Realtek's latest (v2.6.6). Various fixes.")
      Cc: stable <stable@vger.kernel.org>
      Signed-off-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
      Link: https://lore.kernel.org/r/YDYSR+1rj26NRhvb@mwanda
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      550c9e49
    • Dan Carpenter's avatar
      staging: rtl8188eu: prevent ->ssid overflow in rtw_wx_set_scan() · d972a516
      Dan Carpenter authored
      commit 74b6b20d upstream.
      
      This code has a check to prevent read overflow but it needs another
      check to prevent writing beyond the end of the ->ssid[] array.
      
      Fixes: a2c60d42
      
       ("staging: r8188eu: Add files for new driver - part 16")
      Signed-off-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
      Cc: stable <stable@vger.kernel.org>
      Link: https://lore.kernel.org/r/YEHymwsnHewzoam7@mwanda
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      d972a516
    • Dan Carpenter's avatar
      staging: rtl8192u: fix ->ssid overflow in r8192_wx_set_scan() · 1642b515
      Dan Carpenter authored
      commit 87107518 upstream.
      
      We need to cap len at IW_ESSID_MAX_SIZE (32) to avoid memory corruption.
      This can be controlled by the user via the ioctl.
      
      Fixes: 5f53d8ca
      
       ("Staging: add rtl8192SU wireless usb driver")
      Signed-off-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
      Cc: stable <stable@vger.kernel.org>
      Link: https://lore.kernel.org/r/YEHoAWMOSZBUw91F@mwanda
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      1642b515
    • Dmitry Baryshkov's avatar
      misc: fastrpc: restrict user apps from sending kernel RPC messages · 52feb58f
      Dmitry Baryshkov authored
      commit 20c40794 upstream.
      
      Verify that user applications are not using the kernel RPC message
      handle to restrict them from directly attaching to guest OS on the
      remote subsystem. This is a port of CVE-2019-2308 fix.
      
      Fixes: c68cfb71
      
       ("misc: fastrpc: Add support for context Invoke method")
      Cc: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
      Cc: Jonathan Marek <jonathan@marek.ca>
      Cc: stable@vger.kernel.org
      Signed-off-by: default avatarDmitry Baryshkov <dmitry.baryshkov@linaro.org>
      Link: https://lore.kernel.org/r/20210212192658.3476137-1-dmitry.baryshkov@linaro.org
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      52feb58f
    • Shile Zhang's avatar
      misc/pvpanic: Export module FDT device table · 7ae2482c
      Shile Zhang authored
      commit 65527a51 upstream.
      
      Export the module FDT device table to ensure the FDT compatible strings
      are listed in the module alias. This help the pvpanic driver can be
      loaded on boot automatically not only the ACPI device, but also the FDT
      device.
      
      Fixes: 46f934c9
      
       ("misc/pvpanic: add support to get pvpanic device info FDT")
      Signed-off-by: default avatarShile Zhang <shile.zhang@linux.alibaba.com>
      Link: https://lore.kernel.org/r/20210218123116.207751-1-shile.zhang@linux.alibaba.com
      Cc: stable <stable@vger.kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      7ae2482c
    • Alexander Shiyan's avatar
      Revert "serial: max310x: rework RX interrupt handling" · 70c26fc7
      Alexander Shiyan authored
      commit 2334de19 upstream.
      
      This reverts commit fce3c5c1
      
      .
      
      FIFO is triggered 4 intervals after receiving a byte, it's good
      when we don't care about the time of reception, but are only
      interested in the presence of any activity on the line.
      Unfortunately, this method is not suitable for all tasks,
      for example, the RS-485 protocol will not work properly,
      since the state machine must track the request-response time
      and after the timeout expires, a decision is made that the device
      on the line is not responding.
      
      Signed-off-by: default avatarAlexander Shiyan <shc_work@mail.ru>
      Link: https://lore.kernel.org/r/20210217080608.31192-1-shc_work@mail.ru
      Fixes: fce3c5c1
      
       ("serial: max310x: rework RX interrupt handling")
      Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
      Cc: stable <stable@vger.kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      70c26fc7
    • Shuah Khan's avatar
      usbip: fix vudc usbip_sockfd_store races leading to gpf · 9951e645
      Shuah Khan authored
      commit 46613c9d upstream.
      
      usbip_sockfd_store() is invoked when user requests attach (import)
      detach (unimport) usb gadget device from usbip host. vhci_hcd sends
      import request and usbip_sockfd_store() exports the device if it is
      free for export.
      
      Export and unexport are governed by local state and shared state
      - Shared state (usbip device status, sockfd) - sockfd and Device
        status are used to determine if stub should be brought up or shut
        down. Device status is shared between host and client.
      - Local state (tcp_socket, rx and tx thread task_struct ptrs)
        A valid tcp_socket controls rx and tx thread operations while the
        device is in exported state.
      - While the device is exported, device status is marked used and socket,
        sockfd, and thread pointers are valid.
      
      Export sequence (stub-up) includes validating the socket and creating
      receive (rx) and transmit (tx) threads to talk to the client to provide
      access to the exported device. rx and tx threads depends on local and
      shared state to be correct and in sync.
      
      Unexport (stub-down) sequence shuts the socket down and stops the rx and
      tx threads. Stub-down sequence relies on local and shared states to be
      in sync.
      
      There are races in updating the local and shared status in the current
      stub-up sequence resulting in crashes. These stem from starting rx and
      tx threads before local and global state is updated correctly to be in
      sync.
      
      1. Doesn't handle kthread_create() error and saves invalid ptr in local
         state that drives rx and tx threads.
      2. Updates tcp_socket and sockfd,  starts stub_rx and stub_tx threads
         before updating usbip_device status to SDEV_ST_USED. This opens up a
         race condition between the threads and usbip_sockfd_store() stub up
         and down handling.
      
      Fix the above problems:
      - Stop using kthread_get_run() macro to create/start threads.
      - Create threads and get task struct reference.
      - Add kthread_create() failure handling and bail out.
      - Hold usbip_device lock to update local and shared states after
        creating rx and tx threads.
      - Update usbip_device status to SDEV_ST_USED.
      - Update usbip_device tcp_socket, sockfd, tcp_rx, and tcp_tx
      - Start threads after usbip_device (tcp_socket, sockfd, tcp_rx, tcp_tx,
        and status) is complete.
      
      Credit goes to syzbot and Tetsuo Handa for finding and root-causing the
      kthread_get_run() improper error handling problem and others. This is a
      hard problem to find and debug since the races aren't seen in a normal
      case. Fuzzing forces the race window to be small enough for the
      kthread_get_run() error path bug and starting threads before updating the
      local and shared state bug in the stub-up sequence.
      
      Fixes: 9720b4bc
      
       ("staging/usbip: convert to kthread")
      Cc: stable@vger.kernel.org
      Reported-by: default avatarsyzbot <syzbot+a93fba6d384346a761e3@syzkaller.appspotmail.com>
      Reported-by: default avatarsyzbot <syzbot+bf1a360e305ee719e364@syzkaller.appspotmail.com>
      Reported-by: default avatarsyzbot <syzbot+95ce4b142579611ef0a9@syzkaller.appspotmail.com>
      Reported-by: default avatarTetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
      Signed-off-by: default avatarShuah Khan <skhan@linuxfoundation.org>
      Link: https://lore.kernel.org/r/b1c08b983ffa185449c9f0f7d1021dc8c8454b60.1615171203.git.skhan@linuxfoundation.org
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      9951e645
    • Shuah Khan's avatar
      usbip: fix vhci_hcd attach_store() races leading to gpf · 116a7108
      Shuah Khan authored
      commit 718ad969 upstream.
      
      attach_store() is invoked when user requests import (attach) a device
      from usbip host.
      
      Attach and detach are governed by local state and shared state
      - Shared state (usbip device status) - Device status is used to manage
        the attach and detach operations on import-able devices.
      - Local state (tcp_socket, rx and tx thread task_struct ptrs)
        A valid tcp_socket controls rx and tx thread operations while the
        device is in exported state.
      - Device has to be in the right state to be attached and detached.
      
      Attach sequence includes validating the socket and creating receive (rx)
      and transmit (tx) threads to talk to the host to get access to the
      imported device. rx and tx threads depends on local and shared state to
      be correct and in sync.
      
      Detach sequence shuts the socket down and stops the rx and tx threads.
      Detach sequence relies on local and shared states to be in sync.
      
      There are races in updating the local and shared status in the current
      attach sequence resulting in crashes. These stem from starting rx and
      tx threads before local and global state is updated correctly to be in
      sync.
      
      1. Doesn't handle kthread_create() error and saves invalid ptr in local
         state that drives rx and tx threads.
      2. Updates tcp_socket and sockfd,  starts stub_rx and stub_tx threads
         before updating usbip_device status to VDEV_ST_NOTASSIGNED. This opens
         up a race condition between the threads, port connect, and detach
         handling.
      
      Fix the above problems:
      - Stop using kthread_get_run() macro to create/start threads.
      - Create threads and get task struct reference.
      - Add kthread_create() failure handling and bail out.
      - Hold vhci and usbip_device locks to update local and shared states after
        creating rx and tx threads.
      - Update usbip_device status to VDEV_ST_NOTASSIGNED.
      - Update usbip_device tcp_socket, sockfd, tcp_rx, and tcp_tx
      - Start threads after usbip_device (tcp_socket, sockfd, tcp_rx, tcp_tx,
        and status) is complete.
      
      Credit goes to syzbot and Tetsuo Handa for finding and root-causing the
      kthread_get_run() improper error handling problem and others. This is
      hard problem to find and debug since the races aren't seen in a normal
      case. Fuzzing forces the race window to be small enough for the
      kthread_get_run() error path bug and starting threads before updating the
      local and shared state bug in the attach sequence.
      - Update usbip_device tcp_rx and tcp_tx pointers holding vhci and
        usbip_device locks.
      
      Tested with syzbot reproducer:
      - https://syzkaller.appspot.com/text?tag=ReproC&x=14801034d00000
      
      Fixes: 9720b4bc
      
       ("staging/usbip: convert to kthread")
      Cc: stable@vger.kernel.org
      Reported-by: default avatarsyzbot <syzbot+a93fba6d384346a761e3@syzkaller.appspotmail.com>
      Reported-by: default avatarsyzbot <syzbot+bf1a360e305ee719e364@syzkaller.appspotmail.com>
      Reported-by: default avatarsyzbot <syzbot+95ce4b142579611ef0a9@syzkaller.appspotmail.com>
      Reported-by: default avatarTetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
      Signed-off-by: default avatarShuah Khan <skhan@linuxfoundation.org>
      Link: https://lore.kernel.org/r/bb434bd5d7a64fbec38b5ecfb838a6baef6eb12b.1615171203.git.skhan@linuxfoundation.org
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      116a7108
    • Shuah Khan's avatar
      usbip: fix stub_dev usbip_sockfd_store() races leading to gpf · ab5c3186
      Shuah Khan authored
      commit 9380afd6 upstream.
      
      usbip_sockfd_store() is invoked when user requests attach (import)
      detach (unimport) usb device from usbip host. vhci_hcd sends import
      request and usbip_sockfd_store() exports the device if it is free
      for export.
      
      Export and unexport are governed by local state and shared state
      - Shared state (usbip device status, sockfd) - sockfd and Device
        status are used to determine if stub should be brought up or shut
        down.
      - Local state (tcp_socket, rx and tx thread task_struct ptrs)
        A valid tcp_socket controls rx and tx thread operations while the
        device is in exported state.
      - While the device is exported, device status is marked used and socket,
        sockfd, and thread pointers are valid.
      
      Export sequence (stub-up) includes validating the socket and creating
      receive (rx) and transmit (tx) threads to talk to the client to provide
      access to the exported device. rx and tx threads depends on local and
      shared state to be correct and in sync.
      
      Unexport (stub-down) sequence shuts the socket down and stops the rx and
      tx threads. Stub-down sequence relies on local and shared states to be
      in sync.
      
      There are races in updating the local and shared status in the current
      stub-up sequence resulting in crashes. These stem from starting rx and
      tx threads before local and global state is updated correctly to be in
      sync.
      
      1. Doesn't handle kthread_create() error and saves invalid ptr in local
         state that drives rx and tx threads.
      2. Updates tcp_socket and sockfd,  starts stub_rx and stub_tx threads
         before updating usbip_device status to SDEV_ST_USED. This opens up a
         race condition between the threads and usbip_sockfd_store() stub up
         and down handling.
      
      Fix the above problems:
      - Stop using kthread_get_run() macro to create/start threads.
      - Create threads and get task struct reference.
      - Add kthread_create() failure handling and bail out.
      - Hold usbip_device lock to update local and shared states after
        creating rx and tx threads.
      - Update usbip_device status to SDEV_ST_USED.
      - Update usbip_device tcp_socket, sockfd, tcp_rx, and tcp_tx
      - Start threads after usbip_device (tcp_socket, sockfd, tcp_rx, tcp_tx,
        and status) is complete.
      
      Credit goes to syzbot and Tetsuo Handa for finding and root-causing the
      kthread_get_run() improper error handling problem and others. This is a
      hard problem to find and debug since the races aren't seen in a normal
      case. Fuzzing forces the race window to be small enough for the
      kthread_get_run() error path bug and starting threads before updating the
      local and shared state bug in the stub-up sequence.
      
      Tested with syzbot reproducer:
      - https://syzkaller.appspot.com/text?tag=ReproC&x=14801034d00000
      
      Fixes: 9720b4bc
      
       ("staging/usbip: convert to kthread")
      Cc: stable@vger.kernel.org
      Reported-by: default avatarsyzbot <syzbot+a93fba6d384346a761e3@syzkaller.appspotmail.com>
      Reported-by: default avatarsyzbot <syzbot+bf1a360e305ee719e364@syzkaller.appspotmail.com>
      Reported-by: default avatarsyzbot <syzbot+95ce4b142579611ef0a9@syzkaller.appspotmail.com>
      Reported-by: default avatarTetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
      Signed-off-by: default avatarShuah Khan <skhan@linuxfoundation.org>
      Link: https://lore.kernel.org/r/268a0668144d5ff36ec7d87fdfa90faf583b7ccc.1615171203.git.skhan@linuxfoundation.org
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      ab5c3186