Skip to content
  1. Jan 08, 2024
  2. Dec 20, 2023
    • Greg Kroah-Hartman's avatar
      Linux 5.4.265 · 2d21f73b
      Greg Kroah-Hartman authored
      
      
      Link: https://lore.kernel.org/r/20231218135042.748715259@linuxfoundation.org
      Tested-by: default avatarShuah Khan <skhan@linuxfoundation.org>
      Tested-by: default avatarHarshit Mogalapalli <harshit.m.mogalapalli@oracle.com>
      Tested-by: default avatarLinux Kernel Functional Testing <lkft@linaro.org>
      Tested-by: default avatarkernelci.org bot <bot@kernelci.org>
      Tested-by: default avatarFlorian Fainelli <florian.fainelli@broadcom.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      v5.4.265
      2d21f73b
    • Naveen N Rao's avatar
      powerpc/ftrace: Fix stack teardown in ftrace_no_trace · 5c70542f
      Naveen N Rao authored
      commit 4b3338aa upstream.
      
      Commit 41a506ef ("powerpc/ftrace: Create a dummy stackframe to fix
      stack unwind") added use of a new stack frame on ftrace entry to fix
      stack unwind. However, the commit missed updating the offset used while
      tearing down the ftrace stack when ftrace is disabled. Fix the same.
      
      In addition, the commit missed saving the correct stack pointer in
      pt_regs. Update the same.
      
      Fixes: 41a506ef
      
       ("powerpc/ftrace: Create a dummy stackframe to fix stack unwind")
      Cc: stable@vger.kernel.org # v6.5+
      Signed-off-by: default avatarNaveen N Rao <naveen@kernel.org>
      Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
      Link: https://msgid.link/20231130065947.2188860-1-naveen@kernel.org
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      5c70542f
    • Naveen N Rao's avatar
      powerpc/ftrace: Create a dummy stackframe to fix stack unwind · 0e1867b4
      Naveen N Rao authored
      commit 41a506ef upstream.
      
      With ppc64 -mprofile-kernel and ppc32 -pg, profiling instructions to
      call into ftrace are emitted right at function entry. The instruction
      sequence used is minimal to reduce overhead. Crucially, a stackframe is
      not created for the function being traced. This breaks stack unwinding
      since the function being traced does not have a stackframe for itself.
      As such, it never shows up in the backtrace:
      
      /sys/kernel/debug/tracing # echo 1 > /proc/sys/kernel/stack_tracer_enabled
      /sys/kernel/debug/tracing # cat stack_trace
              Depth    Size   Location    (17 entries)
              -----    ----   --------
        0)     4144      32   ftrace_call+0x4/0x44
        1)     4112     432   get_page_from_freelist+0x26c/0x1ad0
        2)     3680     496   __alloc_pages+0x290/0x1280
        3)     3184     336   __folio_alloc+0x34/0x90
        4)     2848     176   vma_alloc_folio+0xd8/0x540
        5)     2672     272   __handle_mm_fault+0x700/0x1cc0
        6)     2400     208   handle_mm_fault+0xf0/0x3f0
        7)     2192      80   ___do_page_fault+0x3e4/0xbe0
        8)     2112     160   do_page_fault+0x30/0xc0
        9)     1952     256   data_access_common_virt+0x210/0x220
       10)     1696     400   0xc00000000f16b100
       11)     1296     384   load_elf_binary+0x804/0x1b80
       12)      912     208   bprm_execve+0x2d8/0x7e0
       13)      704      64   do_execveat_common+0x1d0/0x2f0
       14)      640     160   sys_execve+0x54/0x70
       15)      480      64   system_call_exception+0x138/0x350
       16)      416     416   system_call_common+0x160/0x2c4
      
      Fix this by having ftrace create a dummy stackframe for the function
      being traced. With this, backtraces now capture the function being
      traced:
      
      /sys/kernel/debug/tracing # cat stack_trace
              Depth    Size   Location    (17 entries)
              -----    ----   --------
        0)     3888      32   _raw_spin_trylock+0x8/0x70
        1)     3856     576   get_page_from_freelist+0x26c/0x1ad0
        2)     3280      64   __alloc_pages+0x290/0x1280
        3)     3216     336   __folio_alloc+0x34/0x90
        4)     2880     176   vma_alloc_folio+0xd8/0x540
        5)     2704     416   __handle_mm_fault+0x700/0x1cc0
        6)     2288      96   handle_mm_fault+0xf0/0x3f0
        7)     2192      48   ___do_page_fault+0x3e4/0xbe0
        8)     2144     192   do_page_fault+0x30/0xc0
        9)     1952     608   data_access_common_virt+0x210/0x220
       10)     1344      16   0xc0000000334bbb50
       11)     1328     416   load_elf_binary+0x804/0x1b80
       12)      912      64   bprm_execve+0x2d8/0x7e0
       13)      848     176   do_execveat_common+0x1d0/0x2f0
       14)      672     192   sys_execve+0x54/0x70
       15)      480      64   system_call_exception+0x138/0x350
       16)      416     416   system_call_common+0x160/0x2c4
      
      This results in two additional stores in the ftrace entry code, but
      produces reliable backtraces.
      
      Fixes: 15308664
      
       ("powerpc/ftrace: Add support for -mprofile-kernel ftrace ABI")
      Cc: stable@vger.kernel.org
      Signed-off-by: default avatarNaveen N Rao <naveen@kernel.org>
      Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
      Link: https://msgid.link/20230621051349.759567-1-naveen@kernel.org
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      0e1867b4
    • Adrian Hunter's avatar
      mmc: block: Be sure to wait while busy in CQE error recovery · 9395c046
      Adrian Hunter authored
      commit c616696a upstream.
      
      STOP command does not guarantee to wait while busy, but subsequent command
      MMC_CMDQ_TASK_MGMT to discard the queue will fail if the card is busy, so
      be sure to wait by employing mmc_poll_for_busy().
      
      Fixes: 72a5af55
      
       ("mmc: core: Add support for handling CQE requests")
      Cc: stable@vger.kernel.org
      Signed-off-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
      Reviewed-by: default avatarAvri Altman <avri.altman@wdc.com>
      Reviewed-by: default avatarChristian Loehle <christian.loehle@arm.com>
      Link: https://lore.kernel.org/r/20231103084720.6886-4-adrian.hunter@intel.com
      Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
      Tested-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
      Signed-off-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      9395c046
    • Steven Rostedt (Google)'s avatar
      ring-buffer: Fix memory leak of free page · 3b8b2c5d
      Steven Rostedt (Google) authored
      commit 17d80175 upstream.
      
      Reading the ring buffer does a swap of a sub-buffer within the ring buffer
      with a empty sub-buffer. This allows the reader to have full access to the
      content of the sub-buffer that was swapped out without having to worry
      about contention with the writer.
      
      The readers call ring_buffer_alloc_read_page() to allocate a page that
      will be used to swap with the ring buffer. When the code is finished with
      the reader page, it calls ring_buffer_free_read_page(). Instead of freeing
      the page, it stores it as a spare. Then next call to
      ring_buffer_alloc_read_page() will return this spare instead of calling
      into the memory management system to allocate a new page.
      
      Unfortunately, on freeing of the ring buffer, this spare page is not
      freed, and causes a memory leak.
      
      Link: https://lore.kernel.org/linux-trace-kernel/20231210221250.7b9cc83c@rorschach.local.home
      
      Cc: stable@vger.kernel.org
      Cc: Mark Rutland <mark.rutland@arm.com>
      Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
      Fixes: 73a757e6
      
       ("ring-buffer: Return reader page back into existing ring buffer")
      Acked-by: default avatarMasami Hiramatsu (Google) <mhiramat@kernel.org>
      Signed-off-by: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      3b8b2c5d
    • Florent Revest's avatar
      team: Fix use-after-free when an option instance allocation fails · 3459c9aa
      Florent Revest authored
      commit c12296bb upstream.
      
      In __team_options_register, team_options are allocated and appended to
      the team's option_list.
      If one option instance allocation fails, the "inst_rollback" cleanup
      path frees the previously allocated options but doesn't remove them from
      the team's option_list.
      This leaves dangling pointers that can be dereferenced later by other
      parts of the team driver that iterate over options.
      
      This patch fixes the cleanup path to remove the dangling pointers from
      the list.
      
      As far as I can tell, this uaf doesn't have much security implications
      since it would be fairly hard to exploit (an attacker would need to make
      the allocation of that specific small object fail) but it's still nice
      to fix.
      
      Cc: stable@vger.kernel.org
      Fixes: 80f7c668
      
       ("team: add support for per-port options")
      Signed-off-by: default avatarFlorent Revest <revest@chromium.org>
      Reviewed-by: default avatarJiri Pirko <jiri@nvidia.com>
      Reviewed-by: default avatarHangbin Liu <liuhangbin@gmail.com>
      Link: https://lore.kernel.org/r/20231206123719.1963153-1-revest@chromium.org
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      3459c9aa
    • James Houghton's avatar
      arm64: mm: Always make sw-dirty PTEs hw-dirty in pte_modify · 363a67ef
      James Houghton authored
      commit 3c069607
      
       upstream.
      
      It is currently possible for a userspace application to enter an
      infinite page fault loop when using HugeTLB pages implemented with
      contiguous PTEs when HAFDBS is not available. This happens because:
      
      1. The kernel may sometimes write PTEs that are sw-dirty but hw-clean
         (PTE_DIRTY | PTE_RDONLY | PTE_WRITE).
      
      2. If, during a write, the CPU uses a sw-dirty, hw-clean PTE in handling
         the memory access on a system without HAFDBS, we will get a page
         fault.
      
      3. HugeTLB will check if it needs to update the dirty bits on the PTE.
         For contiguous PTEs, it will check to see if the pgprot bits need
         updating. In this case, HugeTLB wants to write a sequence of
         sw-dirty, hw-dirty PTEs, but it finds that all the PTEs it is about
         to overwrite are all pte_dirty() (pte_sw_dirty() => pte_dirty()),
         so it thinks no update is necessary.
      
      We can get the kernel to write a sw-dirty, hw-clean PTE with the
      following steps (showing the relevant VMA flags and pgprot bits):
      
      i.   Create a valid, writable contiguous PTE.
             VMA vmflags:     VM_SHARED | VM_READ | VM_WRITE
             VMA pgprot bits: PTE_RDONLY | PTE_WRITE
             PTE pgprot bits: PTE_DIRTY | PTE_WRITE
      
      ii.  mprotect the VMA to PROT_NONE.
             VMA vmflags:     VM_SHARED
             VMA pgprot bits: PTE_RDONLY
             PTE pgprot bits: PTE_DIRTY | PTE_RDONLY
      
      iii. mprotect the VMA back to PROT_READ | PROT_WRITE.
             VMA vmflags:     VM_SHARED | VM_READ | VM_WRITE
             VMA pgprot bits: PTE_RDONLY | PTE_WRITE
             PTE pgprot bits: PTE_DIRTY | PTE_WRITE | PTE_RDONLY
      
      Make it impossible to create a writeable sw-dirty, hw-clean PTE with
      pte_modify(). Such a PTE should be impossible to create, and there may
      be places that assume that pte_dirty() implies pte_hw_dirty().
      
      Signed-off-by: default avatarJames Houghton <jthoughton@google.com>
      Fixes: 031e6e6b
      
       ("arm64: hugetlb: Avoid unnecessary clearing in huge_ptep_set_access_flags")
      Cc: <stable@vger.kernel.org>
      Acked-by: default avatarWill Deacon <will@kernel.org>
      Reviewed-by: default avatarRyan Roberts <ryan.roberts@arm.com>
      Link: https://lore.kernel.org/r/20231204172646.2541916-3-jthoughton@google.com
      Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      363a67ef
    • Baokun Li's avatar
      ext4: prevent the normalized size from exceeding EXT_MAX_BLOCKS · de8ada02
      Baokun Li authored
      commit 2dcf5fde upstream.
      
      For files with logical blocks close to EXT_MAX_BLOCKS, the file size
      predicted in ext4_mb_normalize_request() may exceed EXT_MAX_BLOCKS.
      This can cause some blocks to be preallocated that will not be used.
      And after [Fixes], the following issue may be triggered:
      
      =========================================================
       kernel BUG at fs/ext4/mballoc.c:4653!
       Internal error: Oops - BUG: 00000000f2000800 [#1] SMP
       CPU: 1 PID: 2357 Comm: xfs_io 6.7.0-rc2-00195-g0f5cc96c367f
       Hardware name: linux,dummy-virt (DT)
       pc : ext4_mb_use_inode_pa+0x148/0x208
       lr : ext4_mb_use_inode_pa+0x98/0x208
       Call trace:
        ext4_mb_use_inode_pa+0x148/0x208
        ext4_mb_new_inode_pa+0x240/0x4a8
        ext4_mb_use_best_found+0x1d4/0x208
        ext4_mb_try_best_found+0xc8/0x110
        ext4_mb_regular_allocator+0x11c/0xf48
        ext4_mb_new_blocks+0x790/0xaa8
        ext4_ext_map_blocks+0x7cc/0xd20
        ext4_map_blocks+0x170/0x600
        ext4_iomap_begin+0x1c0/0x348
      =========================================================
      
      Here is a calculation when adjusting ac_b_ex in ext4_mb_new_inode_pa():
      
      	ex.fe_logical = orig_goal_end - EXT4_C2B(sbi, ex.fe_len);
      	if (ac->ac_o_ex.fe_logical >= ex.fe_logical)
      		goto adjust_bex;
      
      The problem is that when orig_goal_end is subtracted from ac_b_ex.fe_len
      it is still greater than EXT_MAX_BLOCKS, which causes ex.fe_logical to
      overflow to a very small value, which ultimately triggers a BUG_ON in
      ext4_mb_new_inode_pa() because pa->pa_free < len.
      
      The last logical block of an actual write request does not exceed
      EXT_MAX_BLOCKS, so in ext4_mb_normalize_request() also avoids normalizing
      the last logical block to exceed EXT_MAX_BLOCKS to avoid the above issue.
      
      The test case in [Link] can reproduce the above issue with 64k block size.
      
      Link: https://patchwork.kernel.org/project/fstests/list/?series=804003
      Cc:  <stable@kernel.org> # 6.4
      Fixes: 93cdf49f
      
       ("ext4: Fix best extent lstart adjustment logic in ext4_mb_new_inode_pa()")
      Signed-off-by: default avatarBaokun Li <libaokun1@huawei.com>
      Reviewed-by: default avatarJan Kara <jack@suse.cz>
      Link: https://lore.kernel.org/r/20231127063313.3734294-1-libaokun1@huawei.com
      Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      de8ada02
    • Krzysztof Kozlowski's avatar
      soundwire: stream: fix NULL pointer dereference for multi_link · f451d678
      Krzysztof Kozlowski authored
      commit e199bf52 upstream.
      
      If bus is marked as multi_link, but number of masters in the stream is
      not higher than bus->hw_sync_min_links (bus->multi_link && m_rt_count >=
      bus->hw_sync_min_links), bank switching should not happen.  The first
      part of do_bank_switch() code properly takes these conditions into
      account, but second part (sdw_ml_sync_bank_switch()) relies purely on
      bus->multi_link property.  This is not balanced and leads to NULL
      pointer dereference:
      
        Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000
        ...
        Call trace:
         wait_for_completion_timeout+0x124/0x1f0
         do_bank_switch+0x370/0x6f8
         sdw_prepare_stream+0x2d0/0x438
         qcom_snd_sdw_prepare+0xa0/0x118
         sm8450_snd_prepare+0x128/0x148
         snd_soc_link_prepare+0x5c/0xe8
         __soc_pcm_prepare+0x28/0x1ec
         dpcm_be_dai_prepare+0x1e0/0x2c0
         dpcm_fe_dai_prepare+0x108/0x28c
         snd_pcm_do_prepare+0x44/0x68
         snd_pcm_action_single+0x54/0xc0
         snd_pcm_action_nonatomic+0xe4/0xec
         snd_pcm_prepare+0xc4/0x114
         snd_pcm_common_ioctl+0x1154/0x1cc0
         snd_pcm_ioctl+0x54/0x74
      
      Fixes: ce6e74d0
      
       ("soundwire: Add support for multi link bank switch")
      Cc: stable@vger.kernel.org
      Signed-off-by: default avatarKrzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
      Reviewed-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
      Link: https://lore.kernel.org/r/20231124180136.390621-1-krzysztof.kozlowski@linaro.org
      Signed-off-by: default avatarVinod Koul <vkoul@kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      f451d678
    • Mark Rutland's avatar
      perf: Fix perf_event_validate_size() lockdep splat · 40490221
      Mark Rutland authored
      commit 7e2c1e4b upstream.
      
      When lockdep is enabled, the for_each_sibling_event(sibling, event)
      macro checks that event->ctx->mutex is held. When creating a new group
      leader event, we call perf_event_validate_size() on a partially
      initialized event where event->ctx is NULL, and so when
      for_each_sibling_event() attempts to check event->ctx->mutex, we get a
      splat, as reported by Lucas De Marchi:
      
        WARNING: CPU: 8 PID: 1471 at kernel/events/core.c:1950 __do_sys_perf_event_open+0xf37/0x1080
      
      This only happens for a new event which is its own group_leader, and in
      this case there cannot be any sibling events. Thus it's safe to skip the
      check for siblings, which avoids having to make invasive and ugly
      changes to for_each_sibling_event().
      
      Avoid the splat by bailing out early when the new event is its own
      group_leader.
      
      Fixes: 382c27f4
      
       ("perf: Fix perf_event_validate_size()")
      Closes: https://lore.kernel.org/lkml/20231214000620.3081018-1-lucas.demarchi@intel.com/
      Closes: https://lore.kernel.org/lkml/ZXpm6gQ%2Fd59jGsuW@xpf.sh.intel.com/
      Reported-by: default avatarLucas De Marchi <lucas.demarchi@intel.com>
      Reported-by: default avatarPengfei Xu <pengfei.xu@intel.com>
      Signed-off-by: default avatarMark Rutland <mark.rutland@arm.com>
      Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
      Link: https://lkml.kernel.org/r/20231215112450.3972309-1-mark.rutland@arm.com
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      40490221
    • Denis Benato's avatar
      HID: hid-asus: add const to read-only outgoing usb buffer · 4109d9a8
      Denis Benato authored
      [ Upstream commit 06ae5afc
      
       ]
      
      In the function asus_kbd_set_report the parameter buf is read-only
      as it gets copied in a memory portion suitable for USB transfer,
      but the parameter is not marked as const: add the missing const and mark
      const immutable buffers passed to that function.
      
      Signed-off-by: default avatarDenis Benato <benato.denis96@gmail.com>
      Signed-off-by: default avatarLuke D. Jones <luke@ljones.dev>
      Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      4109d9a8
    • Lech Perczak's avatar
      net: usb: qmi_wwan: claim interface 4 for ZTE MF290 · 1fc40919
      Lech Perczak authored
      [ Upstream commit 99360d96
      
       ]
      
      Interface 4 is used by for QMI interface in stock firmware of MF28D, the
      router which uses MF290 modem. Rebind it to qmi_wwan after freeing it up
      from option driver.
      The proper configuration is:
      
      Interface mapping is:
      0: QCDM, 1: (unknown), 2: AT (PCUI), 2: AT (Modem), 4: QMI
      
      T:  Bus=01 Lev=02 Prnt=02 Port=00 Cnt=01 Dev#=  4 Spd=480  MxCh= 0
      D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
      P:  Vendor=19d2 ProdID=0189 Rev= 0.00
      S:  Manufacturer=ZTE, Incorporated
      S:  Product=ZTE LTE Technologies MSM
      C:* #Ifs= 5 Cfg#= 1 Atr=e0 MxPwr=500mA
      I:* If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=option
      E:  Ad=81(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
      E:  Ad=01(O) Atr=02(Bulk) MxPS= 512 Ivl=4ms
      I:* If#= 1 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=option
      E:  Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
      E:  Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=4ms
      I:* If#= 2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=option
      E:  Ad=83(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
      E:  Ad=03(O) Atr=02(Bulk) MxPS= 512 Ivl=4ms
      I:* If#= 3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=option
      E:  Ad=84(I) Atr=03(Int.) MxPS=  64 Ivl=2ms
      E:  Ad=85(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
      E:  Ad=04(O) Atr=02(Bulk) MxPS= 512 Ivl=4ms
      I:* If#= 4 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=qmi_wwan
      E:  Ad=86(I) Atr=03(Int.) MxPS=  64 Ivl=2ms
      E:  Ad=87(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
      E:  Ad=05(O) Atr=02(Bulk) MxPS= 512 Ivl=4ms
      
      Cc: Bjørn Mork <bjorn@mork.no>
      Signed-off-by: default avatarLech Perczak <lech.perczak@gmail.com>
      Link: https://lore.kernel.org/r/20231117231918.100278-3-lech.perczak@gmail.com
      Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      1fc40919
    • Linus Torvalds's avatar
      asm-generic: qspinlock: fix queued_spin_value_unlocked() implementation · 88ceaf8e
      Linus Torvalds authored
      [ Upstream commit 125b0bb9 ]
      
      We really don't want to do atomic_read() or anything like that, since we
      already have the value, not the lock.  The whole point of this is that
      we've loaded the lock from memory, and we want to check whether the
      value we loaded was a locked one or not.
      
      The main use of this is the lockref code, which loads both the lock and
      the reference count in one atomic operation, and then works on that
      combined value.  With the atomic_read(), the compiler would pointlessly
      spill the value to the stack, in order to then be able to read it back
      "atomically".
      
      This is the qspinlock version of commit c6f4a900
      
       ("asm-generic:
      ticket-lock: Optimize arch_spin_value_unlocked()") which fixed this same
      bug for ticket locks.
      
      Cc: Guo Ren <guoren@kernel.org>
      Cc: Ingo Molnar <mingo@kernel.org>
      Cc: Waiman Long <longman@redhat.com>
      Link: https://lore.kernel.org/all/CAHk-=whNRv0v6kQiV5QO6DJhjH4KEL36vWQ6Re8Csrnh4zbRkQ@mail.gmail.com/
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      88ceaf8e
    • Aoba K's avatar
      HID: multitouch: Add quirk for HONOR GLO-GXXX touchpad · 91175d6f
      Aoba K authored
      [ Upstream commit 9ffccb69
      
       ]
      
      Honor MagicBook 13 2023 has a touchpad which do not switch to the multitouch
      mode until the input mode feature is written by the host.  The touchpad do
      report the input mode at touchpad(3), while itself working under mouse mode. As
      a workaround, it is possible to call MT_QUIRE_FORCE_GET_FEATURE to force set
      feature in mt_set_input_mode for such device.
      
      The touchpad reports as BLTP7853, which cannot retrive any useful manufacture
      information on the internel by this string at present.  As the serial number of
      the laptop is GLO-G52, while DMI info reports the laptop serial number as
      GLO-GXXX, this workaround should applied to all models which has the GLO-GXXX.
      
      Signed-off-by: default avatarAoba K <nexp_0x17@outlook.com>
      Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      91175d6f
    • Denis Benato's avatar
      HID: hid-asus: reset the backlight brightness level on resume · 1f94c0d6
      Denis Benato authored
      [ Upstream commit 546edbd2
      
       ]
      
      Some devices managed by this driver automatically set brightness to 0
      before entering a suspended state and reset it back to a default
      brightness level after the resume:
      this has the effect of having the kernel report wrong brightness
      status after a sleep, and on some devices (like the Asus RC71L) that
      brightness is the intensity of LEDs directly facing the user.
      
      Fix the above issue by setting back brightness to the level it had
      before entering a sleep state.
      
      Signed-off-by: default avatarDenis Benato <benato.denis96@gmail.com>
      Signed-off-by: default avatarLuke D. Jones <luke@ljones.dev>
      Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      1f94c0d6
    • Oliver Neukum's avatar
      HID: add ALWAYS_POLL quirk for Apple kb · e9a3cd3d
      Oliver Neukum authored
      [ Upstream commit c5509218
      
       ]
      
      These devices disconnect if suspended without remote wakeup. They can operate
      with the standard driver.
      
      Signed-off-by: default avatarOliver Neukum <oneukum@suse.com>
      Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      e9a3cd3d
    • Andy Shevchenko's avatar
      platform/x86: intel_telemetry: Fix kernel doc descriptions · 395ad0ba
      Andy Shevchenko authored
      [ Upstream commit a6584711
      
       ]
      
      LKP found issues with a kernel doc in the driver:
      
      core.c:116: warning: Function parameter or member 'ioss_evtconfig' not described in 'telemetry_update_events'
      core.c:188: warning: Function parameter or member 'ioss_evtconfig' not described in 'telemetry_get_eventconfig'
      
      It looks like it were copy'n'paste typos when these descriptions
      had been introduced. Fix the typos.
      
      Reported-by: default avatarkernel test robot <lkp@intel.com>
      Closes: https://lore.kernel.org/oe-kbuild-all/202310070743.WALmRGSY-lkp@intel.com/
      Signed-off-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
      Link: https://lore.kernel.org/r/20231120150756.1661425-1-andriy.shevchenko@linux.intel.com
      Reviewed-by: default avatarRajneesh Bhardwaj <irenic.rajneesh@gmail.com>
      Reviewed-by: default avatarIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
      Signed-off-by: default avatarIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      395ad0ba
    • Coly Li's avatar
      bcache: avoid NULL checking to c->root in run_cache_set() · af509912
      Coly Li authored
      [ Upstream commit 3eba5e0b
      
       ]
      
      In run_cache_set() after c->root returned from bch_btree_node_get(), it
      is checked by IS_ERR_OR_NULL(). Indeed it is unncessary to check NULL
      because bch_btree_node_get() will not return NULL pointer to caller.
      
      This patch replaces IS_ERR_OR_NULL() by IS_ERR() for the above reason.
      
      Signed-off-by: default avatarColy Li <colyli@suse.de>
      Link: https://lore.kernel.org/r/20231120052503.6122-11-colyli@suse.de
      Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      af509912
    • Coly Li's avatar
      bcache: add code comments for bch_btree_node_get() and __bch_btree_node_alloc() · 356ae9de
      Coly Li authored
      [ Upstream commit 31f5b956
      
       ]
      
      This patch adds code comments to bch_btree_node_get() and
      __bch_btree_node_alloc() that NULL pointer will not be returned and it
      is unnecessary to check NULL pointer by the callers of these routines.
      
      Signed-off-by: default avatarColy Li <colyli@suse.de>
      Link: https://lore.kernel.org/r/20231120052503.6122-10-colyli@suse.de
      Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      356ae9de
    • Coly Li's avatar
      bcache: avoid oversize memory allocation by small stripe_size · ca4b00c6
      Coly Li authored
      [ Upstream commit baf8fb7e
      
       ]
      
      Arraies bcache->stripe_sectors_dirty and bcache->full_dirty_stripes are
      used for dirty data writeback, their sizes are decided by backing device
      capacity and stripe size. Larger backing device capacity or smaller
      stripe size make these two arraies occupies more dynamic memory space.
      
      Currently bcache->stripe_size is directly inherited from
      queue->limits.io_opt of underlying storage device. For normal hard
      drives, its limits.io_opt is 0, and bcache sets the corresponding
      stripe_size to 1TB (1<<31 sectors), it works fine 10+ years. But for
      devices do declare value for queue->limits.io_opt, small stripe_size
      (comparing to 1TB) becomes an issue for oversize memory allocations of
      bcache->stripe_sectors_dirty and bcache->full_dirty_stripes, while the
      capacity of hard drives gets much larger in recent decade.
      
      For example a raid5 array assembled by three 20TB hardrives, the raid
      device capacity is 40TB with typical 512KB limits.io_opt. After the math
      calculation in bcache code, these two arraies will occupy 400MB dynamic
      memory. Even worse Andrea Tomassetti reports that a 4KB limits.io_opt is
      declared on a new 2TB hard drive, then these two arraies request 2GB and
      512MB dynamic memory from kzalloc(). The result is that bcache device
      always fails to initialize on his system.
      
      To avoid the oversize memory allocation, bcache->stripe_size should not
      directly inherited by queue->limits.io_opt from the underlying device.
      This patch defines BCH_MIN_STRIPE_SZ (4MB) as minimal bcache stripe size
      and set bcache device's stripe size against the declared limits.io_opt
      value from the underlying storage device,
      - If the declared limits.io_opt > BCH_MIN_STRIPE_SZ, bcache device will
        set its stripe size directly by this limits.io_opt value.
      - If the declared limits.io_opt < BCH_MIN_STRIPE_SZ, bcache device will
        set its stripe size by a value multiplying limits.io_opt and euqal or
        large than BCH_MIN_STRIPE_SZ.
      
      Then the minimal stripe size of a bcache device will always be >= 4MB.
      For a 40TB raid5 device with 512KB limits.io_opt, memory occupied by
      bcache->stripe_sectors_dirty and bcache->full_dirty_stripes will be 50MB
      in total. For a 2TB hard drive with 4KB limits.io_opt, memory occupied
      by these two arraies will be 2.5MB in total.
      
      Such mount of memory allocated for bcache->stripe_sectors_dirty and
      bcache->full_dirty_stripes is reasonable for most of storage devices.
      
      Reported-by: default avatarAndrea Tomassetti <andrea.tomassetti-opensource@devo.com>
      Signed-off-by: default avatarColy Li <colyli@suse.de>
      Reviewed-by: default avatarEric Wheeler <bcache@lists.ewheeler.net>
      Link: https://lore.kernel.org/r/20231120052503.6122-2-colyli@suse.de
      Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      ca4b00c6
    • Ming Lei's avatar
      blk-throttle: fix lockdep warning of "cgroup_mutex or RCU read lock required!" · e1d811cb
      Ming Lei authored
      [ Upstream commit 27b13e20
      
       ]
      
      Inside blkg_for_each_descendant_pre(), both
      css_for_each_descendant_pre() and blkg_lookup() requires RCU read lock,
      and either cgroup_assert_mutex_or_rcu_locked() or rcu_read_lock_held()
      is called.
      
      Fix the warning by adding rcu read lock.
      
      Reported-by: default avatarChanghui Zhong <czhong@redhat.com>
      Signed-off-by: default avatarMing Lei <ming.lei@redhat.com>
      Link: https://lore.kernel.org/r/20231117023527.3188627-2-ming.lei@redhat.com
      Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      e1d811cb
    • Oliver Neukum's avatar
      usb: aqc111: check packet for fixup for true limit · 84f2e5b3
      Oliver Neukum authored
      [ Upstream commit ccab434e
      
       ]
      
      If a device sends a packet that is inbetween 0
      and sizeof(u64) the value passed to skb_trim()
      as length will wrap around ending up as some very
      large value.
      
      The driver will then proceed to parse the header
      located at that position, which will either oops or
      process some random value.
      
      The fix is to check against sizeof(u64) rather than
      0, which the driver currently does. The issue exists
      since the introduction of the driver.
      
      Signed-off-by: default avatarOliver Neukum <oneukum@suse.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      84f2e5b3
    • Bjorn Helgaas's avatar
      Revert "PCI: acpiphp: Reassign resources on bridge if necessary" · 619a3406
      Bjorn Helgaas authored
      commit 5df12742 upstream.
      
      This reverts commit 40613da5 and the
      subsequent fix to it:
      
        cc22522f ("PCI: acpiphp: Use pci_assign_unassigned_bridge_resources() only for non-root bus")
      
      40613da5 fixed a problem where hot-adding a device with large BARs
      failed if the bridge windows programmed by firmware were not large enough.
      
      cc22522f ("PCI: acpiphp: Use pci_assign_unassigned_bridge_resources()
      only for non-root bus") fixed a problem with 40613da5: an ACPI hot-add
      of a device on a PCI root bus (common in the virt world) or firmware
      sending ACPI Bus Check to non-existent Root Ports (e.g., on Dell Inspiron
      7352/0W6WV0) caused a NULL pointer dereference and suspend/resume hangs.
      
      Unfortunately the combination of 40613da5 and cc22522f caused other
      problems:
      
        - Fiona reported that hot-add of SCSI disks in QEMU virtual machine fails
          sometimes.
      
        - Dongli reported a similar problem with hot-add of SCSI disks.
      
        - Jonathan reported a console freeze during boot on bare metal due to an
          error in radeon GPU initialization.
      
      Revert both patches to avoid adding these problems.  This means we will
      again see the problems with hot-adding devices with large BARs and the NULL
      pointer dereferences and suspend/resume issues that 40613da5 and
      cc22522f were intended to fix.
      
      Fixes: 40613da5 ("PCI: acpiphp: Reassign resources on bridge if necessary")
      Fixes: cc22522f
      
       ("PCI: acpiphp: Use pci_assign_unassigned_bridge_resources() only for non-root bus")
      Reported-by: default avatarFiona Ebner <f.ebner@proxmox.com>
      Closes: https://lore.kernel.org/r/9eb669c0-d8f2-431d-a700-6da13053ae54@proxmox.com
      Reported-by: default avatarDongli Zhang <dongli.zhang@oracle.com>
      Closes: https://lore.kernel.org/r/3c4a446a-b167-11b8-f36f-d3c1b49b42e9@oracle.com
      Reported-by: default avatarJonathan Woithe <jwoithe@just42.net>
      Closes: https://lore.kernel.org/r/ZXpaNCLiDM+Kv38H@marvin.atrad.com.au
      Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
      Acked-by: default avatarMichael S. Tsirkin <mst@redhat.com>
      Acked-by: default avatarIgor Mammedov <imammedo@redhat.com>
      Cc: <stable@vger.kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      619a3406
    • Kai Vehmanen's avatar
      ALSA: hda/hdmi: add force-connect quirks for ASUSTeK Z170 variants · 371dbce6
      Kai Vehmanen authored
      commit 924f5ca2
      
       upstream.
      
      On ASUSTeK Z170M PLUS and Z170 PRO GAMING systems, the display codec
      pins are not registered properly without the force-connect quirk. The
      codec will report only one pin as having external connectivity, but i915
      finds all three connectors on the system, so the two drivers are not
      in sync.
      
      Issue found with DRM igt-gpu-tools test kms_hdmi_inject@inject-audio.
      
      Link: https://gitlab.freedesktop.org/drm/intel/-/issues/9801
      Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
      Cc: Jani Saarinen <jani.saarinen@intel.com>
      Signed-off-by: default avatarKai Vehmanen <kai.vehmanen@linux.intel.com>
      Cc: <stable@vger.kernel.org>
      Link: https://lore.kernel.org/r/20231208132127.2438067-3-kai.vehmanen@linux.intel.com
      Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      371dbce6
    • Jens Axboe's avatar
      cred: switch to using atomic_long_t · be7676b0
      Jens Axboe authored
      commit f8fa5d76
      
       upstream.
      
      There are multiple ways to grab references to credentials, and the only
      protection we have against overflowing it is the memory required to do
      so.
      
      With memory sizes only moving in one direction, let's bump the reference
      count to 64-bit and move it outside the realm of feasibly overflowing.
      
      Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      be7676b0
    • Hyunwoo Kim's avatar
      appletalk: Fix Use-After-Free in atalk_ioctl · 9112bd10
      Hyunwoo Kim authored
      [ Upstream commit 189ff167 ]
      
      Because atalk_ioctl() accesses sk->sk_receive_queue
      without holding a sk->sk_receive_queue.lock, it can
      cause a race with atalk_recvmsg().
      A use-after-free for skb occurs with the following flow.
      ```
      atalk_ioctl() -> skb_peek()
      atalk_recvmsg() -> skb_recv_datagram() -> skb_free_datagram()
      ```
      Add sk->sk_receive_queue.lock to atalk_ioctl() to fix this issue.
      
      Fixes: 1da177e4
      
       ("Linux-2.6.12-rc2")
      Signed-off-by: default avatarHyunwoo Kim <v4bel@theori.io>
      Link: https://lore.kernel.org/r/20231213041056.GA519680@v4bel-B760M-AORUS-ELITE-AX
      Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      9112bd10
    • Andrew Halaney's avatar
      net: stmmac: Handle disabled MDIO busses from devicetree · 23ee0676
      Andrew Halaney authored
      [ Upstream commit e23c0d21 ]
      
      Many hardware configurations have the MDIO bus disabled, and are instead
      using some other MDIO bus to talk to the MAC's phy.
      
      of_mdiobus_register() returns -ENODEV in this case. Let's handle it
      gracefully instead of failing to probe the MAC.
      
      Fixes: 47dd7a54
      
       ("net: add support for STMicroelectronics Ethernet controllers.")
      Signed-off-by: default avatarAndrew Halaney <ahalaney@redhat.com>
      Reviewed-by: default avatarSerge Semin <fancer.lancer@gmail.com>
      Link: https://lore.kernel.org/r/20231212-b4-stmmac-handle-mdio-enodev-v2-1-600171acf79f@redhat.com
      Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      23ee0676
    • Rasmus Villemoes's avatar
      net: stmmac: use dev_err_probe() for reporting mdio bus registration failure · 538b7b8f
      Rasmus Villemoes authored
      [ Upstream commit 839612d2
      
       ]
      
      I have a board where these two lines are always printed during boot:
      
         imx-dwmac 30bf0000.ethernet: Cannot register the MDIO bus
         imx-dwmac 30bf0000.ethernet: stmmac_dvr_probe: MDIO bus (id: 1) registration failed
      
      It's perfectly fine, and the device is successfully (and silently, as
      far as the console goes) probed later.
      
      Use dev_err_probe() instead, which will demote these messages to debug
      level (thus removing the alarming messages from the console) when the
      error is -EPROBE_DEFER, and also has the advantage of including the
      error code if/when it happens to be something other than -EPROBE_DEFER.
      
      While here, add the missing \n to one of the format strings.
      
      Signed-off-by: default avatarRasmus Villemoes <linux@rasmusvillemoes.dk>
      Link: https://lore.kernel.org/r/20220602074840.1143360-1-linux@rasmusvillemoes.dk
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      Stable-dep-of: e23c0d21
      
       ("net: stmmac: Handle disabled MDIO busses from devicetree")
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      538b7b8f
    • Nikolay Kuratov's avatar
      vsock/virtio: Fix unsigned integer wrap around in virtio_transport_has_space() · 067e6ec9
      Nikolay Kuratov authored
      [ Upstream commit 60316d7f ]
      
      We need to do signed arithmetic if we expect condition
      `if (bytes < 0)` to be possible
      
      Found by Linux Verification Center (linuxtesting.org) with SVACE
      
      Fixes: 06a8fc78
      
       ("VSOCK: Introduce virtio_vsock_common.ko")
      Signed-off-by: default avatarNikolay Kuratov <kniv@yandex-team.ru>
      Reviewed-by: default avatarStefano Garzarella <sgarzare@redhat.com>
      Link: https://lore.kernel.org/r/20231211162317.4116625-1-kniv@yandex-team.ru
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      067e6ec9
    • Yusong Gao's avatar
      sign-file: Fix incorrect return values check · cc7cf0b2
      Yusong Gao authored
      [ Upstream commit 82964944 ]
      
      There are some wrong return values check in sign-file when call OpenSSL
      API. The ERR() check cond is wrong because of the program only check the
      return value is < 0 which ignored the return val is 0. For example:
      1. CMS_final() return 1 for success or 0 for failure.
      2. i2d_CMS_bio_stream() returns 1 for success or 0 for failure.
      3. i2d_TYPEbio() return 1 for success and 0 for failure.
      4. BIO_free() return 1 for success and 0 for failure.
      
      Link: https://www.openssl.org/docs/manmaster/man3/
      Fixes: e5a2e3c8
      
       ("scripts/sign-file.c: Add support for signing with a raw signature")
      Signed-off-by: default avatarYusong Gao <a869920004@gmail.com>
      Reviewed-by: default avatarJuerg Haefliger <juerg.haefliger@canonical.com>
      Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
      Link: https://lore.kernel.org/r/20231213024405.624692-1-a869920004@gmail.com/ # v5
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      cc7cf0b2
    • Dong Chenchen's avatar
      net: Remove acked SYN flag from packet in the transmit queue correctly · 510d4520
      Dong Chenchen authored
      [ Upstream commit f99cd562 ]
      
      syzkaller report:
      
       kernel BUG at net/core/skbuff.c:3452!
       invalid opcode: 0000 [#1] PREEMPT SMP KASAN PTI
       CPU: 0 PID: 0 Comm: swapper/0 Not tainted 6.7.0-rc4-00009-gbee0e7762ad2-dirty #135
       RIP: 0010:skb_copy_and_csum_bits (net/core/skbuff.c:3452)
       Call Trace:
       icmp_glue_bits (net/ipv4/icmp.c:357)
       __ip_append_data.isra.0 (net/ipv4/ip_output.c:1165)
       ip_append_data (net/ipv4/ip_output.c:1362 net/ipv4/ip_output.c:1341)
       icmp_push_reply (net/ipv4/icmp.c:370)
       __icmp_send (./include/net/route.h:252 net/ipv4/icmp.c:772)
       ip_fragment.constprop.0 (./include/linux/skbuff.h:1234 net/ipv4/ip_output.c:592 net/ipv4/ip_output.c:577)
       __ip_finish_output (net/ipv4/ip_output.c:311 net/ipv4/ip_output.c:295)
       ip_output (net/ipv4/ip_output.c:427)
       __ip_queue_xmit (net/ipv4/ip_output.c:535)
       __tcp_transmit_skb (net/ipv4/tcp_output.c:1462)
       __tcp_retransmit_skb (net/ipv4/tcp_output.c:3387)
       tcp_retransmit_skb (net/ipv4/tcp_output.c:3404)
       tcp_retransmit_timer (net/ipv4/tcp_timer.c:604)
       tcp_write_timer (./include/linux/spinlock.h:391 net/ipv4/tcp_timer.c:716)
      
      The panic issue was trigered by tcp simultaneous initiation.
      The initiation process is as follows:
      
            TCP A                                            TCP B
      
        1.  CLOSED                                           CLOSED
      
        2.  SYN-SENT     --> <SEQ=100><CTL=SYN>              ...
      
        3.  SYN-RECEIVED <-- <SEQ=300><CTL=SYN>              <-- SYN-SENT
      
        4.               ... <SEQ=100><CTL=SYN>              --> SYN-RECEIVED
      
        5.  SYN-RECEIVED --> <SEQ=100><ACK=301><CTL=SYN,ACK> ...
      
        // TCP B: not send challenge ack for ack limit or packet loss
        // TCP A: close
      	tcp_close
      	   tcp_send_fin
                    if (!tskb && tcp_under_memory_pressure(sk))
                        tskb = skb_rb_last(&sk->tcp_rtx_queue); //pick SYN_ACK packet
                 TCP_SKB_CB(tskb)->tcp_flags |= TCPHDR_FIN;  // set FIN flag
      
        6.  FIN_WAIT_1  --> <SEQ=100><ACK=301><END_SEQ=102><CTL=SYN,FIN,ACK> ...
      
        // TCP B: send challenge ack to SYN_FIN_ACK
      
        7.               ... <SEQ=301><ACK=101><CTL=ACK>   <-- SYN-RECEIVED //challenge ack
      
        // TCP A:  <SND.UNA=101>
      
        8.  FIN_WAIT_1 --> <SEQ=101><ACK=301><END_SEQ=102><CTL=SYN,FIN,ACK> ... // retransmit panic
      
      	__tcp_retransmit_skb  //skb->len=0
      	    tcp_trim_head
      		len = tp->snd_una - TCP_SKB_CB(skb)->seq // len=101-100
      		    __pskb_trim_head
      			skb->data_len -= len // skb->len=-1, wrap around
      	    ... ...
      	    ip_fragment
      		icmp_glue_bits //BUG_ON
      
      If we use tcp_trim_head() to remove acked SYN from packet that contains data
      or other flags, skb->len will be incorrectly decremented. We can remove SYN
      flag that has been acked from rtx_queue earlier than tcp_trim_head(), which
      can fix the problem mentioned above.
      
      Fixes: 1da177e4
      
       ("Linux-2.6.12-rc2")
      Co-developed-by: default avatarEric Dumazet <edumazet@google.com>
      Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
      Signed-off-by: default avatarDong Chenchen <dongchenchen2@huawei.com>
      Link: https://lore.kernel.org/r/20231210020200.1539875-1-dongchenchen2@huawei.com
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      510d4520
    • Dinghao Liu's avatar
      qed: Fix a potential use-after-free in qed_cxt_tables_alloc · 5d9d500a
      Dinghao Liu authored
      [ Upstream commit b65d52ac ]
      
      qed_ilt_shadow_alloc() will call qed_ilt_shadow_free() to
      free p_hwfn->p_cxt_mngr->ilt_shadow on error. However,
      qed_cxt_tables_alloc() accesses the freed pointer on failure
      of qed_ilt_shadow_alloc() through calling qed_cxt_mngr_free(),
      which may lead to use-after-free. Fix this issue by setting
      p_mngr->ilt_shadow to NULL in qed_ilt_shadow_free().
      
      Fixes: fe56b9e6
      
       ("qed: Add module with basic common support")
      Reviewed-by: default avatarPrzemek Kitszel <przemyslaw.kitszel@intel.com>
      Signed-off-by: default avatarDinghao Liu <dinghao.liu@zju.edu.cn>
      Link: https://lore.kernel.org/r/20231210045255.21383-1-dinghao.liu@zju.edu.cn
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      5d9d500a
    • Hyunwoo Kim's avatar
      net/rose: Fix Use-After-Free in rose_ioctl · 3df81262
      Hyunwoo Kim authored
      [ Upstream commit 810c38a3 ]
      
      Because rose_ioctl() accesses sk->sk_receive_queue
      without holding a sk->sk_receive_queue.lock, it can
      cause a race with rose_accept().
      A use-after-free for skb occurs with the following flow.
      ```
      rose_ioctl() -> skb_peek()
      rose_accept() -> skb_dequeue() -> kfree_skb()
      ```
      Add sk->sk_receive_queue.lock to rose_ioctl() to fix this issue.
      
      Fixes: 1da177e4
      
       ("Linux-2.6.12-rc2")
      Signed-off-by: default avatarHyunwoo Kim <v4bel@theori.io>
      Link: https://lore.kernel.org/r/20231209100538.GA407321@v4bel-B760M-AORUS-ELITE-AX
      Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      3df81262
    • Hyunwoo Kim's avatar
      atm: Fix Use-After-Free in do_vcc_ioctl · b099c288
      Hyunwoo Kim authored
      [ Upstream commit 24e90b9e ]
      
      Because do_vcc_ioctl() accesses sk->sk_receive_queue
      without holding a sk->sk_receive_queue.lock, it can
      cause a race with vcc_recvmsg().
      A use-after-free for skb occurs with the following flow.
      ```
      do_vcc_ioctl() -> skb_peek()
      vcc_recvmsg() -> skb_recv_datagram() -> skb_free_datagram()
      ```
      Add sk->sk_receive_queue.lock to do_vcc_ioctl() to fix this issue.
      
      Fixes: 1da177e4
      
       ("Linux-2.6.12-rc2")
      Signed-off-by: default avatarHyunwoo Kim <v4bel@theori.io>
      Link: https://lore.kernel.org/r/20231209094210.GA403126@v4bel-B760M-AORUS-ELITE-AX
      Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      b099c288
    • Chengfeng Ye's avatar
      atm: solos-pci: Fix potential deadlock on &tx_queue_lock · e3430b87
      Chengfeng Ye authored
      [ Upstream commit 15319a4e ]
      
      As &card->tx_queue_lock is acquired under softirq context along the
      following call chain from solos_bh(), other acquisition of the same
      lock inside process context should disable at least bh to avoid double
      lock.
      
      <deadlock #2>
      pclose()
      --> spin_lock(&card->tx_queue_lock)
      <interrupt>
         --> solos_bh()
         --> fpga_tx()
         --> spin_lock(&card->tx_queue_lock)
      
      This flaw was found by an experimental static analysis tool I am
      developing for irq-related deadlock.
      
      To prevent the potential deadlock, the patch uses spin_lock_bh()
      on &card->tx_queue_lock under process context code consistently to
      prevent the possible deadlock scenario.
      
      Fixes: 213e85d3
      
       ("solos-pci: clean up pclose() function")
      Signed-off-by: default avatarChengfeng Ye <dg573847474@gmail.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      e3430b87
    • Chengfeng Ye's avatar
      atm: solos-pci: Fix potential deadlock on &cli_queue_lock · 8cff60fb
      Chengfeng Ye authored
      [ Upstream commit d5dba32b ]
      
      As &card->cli_queue_lock is acquired under softirq context along the
      following call chain from solos_bh(), other acquisition of the same
      lock inside process context should disable at least bh to avoid double
      lock.
      
      <deadlock #1>
      console_show()
      --> spin_lock(&card->cli_queue_lock)
      <interrupt>
         --> solos_bh()
         --> spin_lock(&card->cli_queue_lock)
      
      This flaw was found by an experimental static analysis tool I am
      developing for irq-related deadlock.
      
      To prevent the potential deadlock, the patch uses spin_lock_bh()
      on the card->cli_queue_lock under process context code consistently
      to prevent the possible deadlock scenario.
      
      Fixes: 9c54004e
      
       ("atm: Driver for Solos PCI ADSL2+ card.")
      Signed-off-by: default avatarChengfeng Ye <dg573847474@gmail.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      8cff60fb
    • Stefan Wahren's avatar
      qca_spi: Fix reset behavior · fcf17666
      Stefan Wahren authored
      [ Upstream commit 1057812d ]
      
      In case of a reset triggered by the QCA7000 itself, the behavior of the
      qca_spi driver was not quite correct:
      - in case of a pending RX frame decoding the drop counter must be
        incremented and decoding state machine reseted
      - also the reset counter must always be incremented regardless of sync
        state
      
      Fixes: 291ab06e
      
       ("net: qualcomm: new Ethernet over SPI driver for QCA7000")
      Signed-off-by: default avatarStefan Wahren <wahrenst@gmx.net>
      Link: https://lore.kernel.org/r/20231206141222.52029-4-wahrenst@gmx.net
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      fcf17666
    • Stefan Wahren's avatar
      qca_debug: Fix ethtool -G iface tx behavior · 51ad9c19
      Stefan Wahren authored
      [ Upstream commit 96a7e861 ]
      
      After calling ethtool -g it was not possible to adjust the TX ring
      size again:
      
        # ethtool -g eth1
        Ring parameters for eth1:
        Pre-set maximums:
        RX:		4
        RX Mini:	n/a
        RX Jumbo:	n/a
        TX:		10
        Current hardware settings:
        RX:		4
        RX Mini:	n/a
        RX Jumbo:	n/a
        TX:		10
        # ethtool -G eth1 tx 8
        netlink error: Invalid argument
      
      The reason for this is that the readonly setting rx_pending get
      initialized and after that the range check in qcaspi_set_ringparam()
      fails regardless of the provided parameter. So fix this by accepting
      the exposed RX defaults. Instead of adding another magic number
      better use a new define here.
      
      Fixes: 291ab06e
      
       ("net: qualcomm: new Ethernet over SPI driver for QCA7000")
      Suggested-by: default avatarPaolo Abeni <pabeni@redhat.com>
      Signed-off-by: default avatarStefan Wahren <wahrenst@gmx.net>
      Link: https://lore.kernel.org/r/20231206141222.52029-3-wahrenst@gmx.net
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      51ad9c19
    • Stefan Wahren's avatar
      qca_debug: Prevent crash on TX ring changes · b7f58686
      Stefan Wahren authored
      [ Upstream commit f4e6064c ]
      
      The qca_spi driver stop and restart the SPI kernel thread
      (via ndo_stop & ndo_open) in case of TX ring changes. This is
      a big issue because it allows userspace to prevent restart of
      the SPI kernel thread (via signals). A subsequent change of
      TX ring wrongly assume a valid spi_thread pointer which result
      in a crash.
      
      So prevent this by stopping the network traffic handling and
      temporary park the SPI thread.
      
      Fixes: 291ab06e
      
       ("net: qualcomm: new Ethernet over SPI driver for QCA7000")
      Signed-off-by: default avatarStefan Wahren <wahrenst@gmx.net>
      Link: https://lore.kernel.org/r/20231206141222.52029-2-wahrenst@gmx.net
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      b7f58686