Skip to content
  1. Oct 06, 2021
    • Johannes Berg's avatar
      mac80211-hwsim: fix late beacon hrtimer handling · 9bee85de
      Johannes Berg authored
      [ Upstream commit 313bbd19
      
       ]
      
      Thomas explained in https://lore.kernel.org/r/87mtoeb4hb.ffs@tglx
      that our handling of the hrtimer here is wrong: If the timer fires
      late (e.g. due to vCPU scheduling, as reported by Dmitry/syzbot)
      then it tries to actually rearm the timer at the next deadline,
      which might be in the past already:
      
       1          2          3          N          N+1
       |          |          |   ...    |          |
      
       ^ intended to fire here (1)
                  ^ next deadline here (2)
                                            ^ actually fired here
      
      The next time it fires, it's later, but will still try to schedule
      for the next deadline (now 3), etc. until it catches up with N,
      but that might take a long time, causing stalls etc.
      
      Now, all of this is simulation, so we just have to fix it, but
      note that the behaviour is wrong even per spec, since there's no
      value then in sending all those beacons unaligned - they should be
      aligned to the TBTT (1, 2, 3, ... in the picture), and if we're a
      bit (or a lot) late, then just resume at that point.
      
      Therefore, change the code to use hrtimer_forward_now() which will
      ensure that the next firing of the timer would be at N+1 (in the
      picture), i.e. the next interval point after the current time.
      
      Suggested-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Reported-by: default avatarDmitry Vyukov <dvyukov@google.com>
      Reported-by: default avatar <syzbot+0e964fad69a9c462bc1e@syzkaller.appspotmail.com>
      Fixes: 01e59e46
      
       ("mac80211_hwsim: hrtimer beacon")
      Reviewed-by: default avatarThomas Gleixner <tglx@linutronix.de>
      Link: https://lore.kernel.org/r/20210915112936.544f383472eb.I3f9712009027aa09244b65399bf18bf482a8c4f1@changeid
      Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      9bee85de
    • Johannes Berg's avatar
      mac80211: mesh: fix potentially unaligned access · 21c3a844
      Johannes Berg authored
      [ Upstream commit b9731062 ]
      
      The pointer here points directly into the frame, so the
      access is potentially unaligned. Use get_unaligned_le16
      to avoid that.
      
      Fixes: 3f52b7e3
      
       ("mac80211: mesh power save basics")
      Link: https://lore.kernel.org/r/20210920154009.3110ff75be0c.Ib6a2ff9e9cc9bc6fca50fce631ec1ce725cc926b@changeid
      Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      21c3a844
    • Lorenzo Bianconi's avatar
      mac80211: limit injected vht mcs/nss in ieee80211_parse_tx_radiotap · ab859974
      Lorenzo Bianconi authored
      [ Upstream commit 13cb6d82
      
       ]
      
      Limit max values for vht mcs and nss in ieee80211_parse_tx_radiotap
      routine in order to fix the following warning reported by syzbot:
      
      WARNING: CPU: 0 PID: 10717 at include/net/mac80211.h:989 ieee80211_rate_set_vht include/net/mac80211.h:989 [inline]
      WARNING: CPU: 0 PID: 10717 at include/net/mac80211.h:989 ieee80211_parse_tx_radiotap+0x101e/0x12d0 net/mac80211/tx.c:2244
      Modules linked in:
      CPU: 0 PID: 10717 Comm: syz-executor.5 Not tainted 5.14.0-syzkaller #0
      Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
      RIP: 0010:ieee80211_rate_set_vht include/net/mac80211.h:989 [inline]
      RIP: 0010:ieee80211_parse_tx_radiotap+0x101e/0x12d0 net/mac80211/tx.c:2244
      RSP: 0018:ffffc9000186f3e8 EFLAGS: 00010216
      RAX: 0000000000000618 RBX: ffff88804ef76500 RCX: ffffc900143a5000
      RDX: 0000000000040000 RSI: ffffffff888f478e RDI: 0000000000000003
      RBP: 00000000ffffffff R08: 0000000000000000 R09: 0000000000000100
      R10: ffffffff888f46f9 R11: 0000000000000000 R12: 00000000fffffff8
      R13: ffff88804ef7653c R14: 0000000000000001 R15: 0000000000000004
      FS:  00007fbf5718f700(0000) GS:ffff8880b9c00000(0000) knlGS:0000000000000000
      CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      CR2: 0000001b2de23000 CR3: 000000006a671000 CR4: 00000000001506f0
      DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
      DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000600
      Call Trace:
       ieee80211_monitor_select_queue+0xa6/0x250 net/mac80211/iface.c:740
       netdev_core_pick_tx+0x169/0x2e0 net/core/dev.c:4089
       __dev_queue_xmit+0x6f9/0x3710 net/core/dev.c:4165
       __bpf_tx_skb net/core/filter.c:2114 [inline]
       __bpf_redirect_no_mac net/core/filter.c:2139 [inline]
       __bpf_redirect+0x5ba/0xd20 net/core/filter.c:2162
       ____bpf_clone_redirect net/core/filter.c:2429 [inline]
       bpf_clone_redirect+0x2ae/0x420 net/core/filter.c:2401
       bpf_prog_eeb6f53a69e5c6a2+0x59/0x234
       bpf_dispatcher_nop_func include/linux/bpf.h:717 [inline]
       __bpf_prog_run include/linux/filter.h:624 [inline]
       bpf_prog_run include/linux/filter.h:631 [inline]
       bpf_test_run+0x381/0xa30 net/bpf/test_run.c:119
       bpf_prog_test_run_skb+0xb84/0x1ee0 net/bpf/test_run.c:663
       bpf_prog_test_run kernel/bpf/syscall.c:3307 [inline]
       __sys_bpf+0x2137/0x5df0 kernel/bpf/syscall.c:4605
       __do_sys_bpf kernel/bpf/syscall.c:4691 [inline]
       __se_sys_bpf kernel/bpf/syscall.c:4689 [inline]
       __x64_sys_bpf+0x75/0xb0 kernel/bpf/syscall.c:4689
       do_syscall_x64 arch/x86/entry/common.c:50 [inline]
       do_syscall_64+0x35/0xb0 arch/x86/entry/common.c:80
       entry_SYSCALL_64_after_hwframe+0x44/0xae
      RIP: 0033:0x4665f9
      
      Reported-by: default avatar <syzbot+0196ac871673f0c20f68@syzkaller.appspotmail.com>
      Fixes: 646e76bb
      
       ("mac80211: parse VHT info in injected frames")
      Signed-off-by: default avatarLorenzo Bianconi <lorenzo@kernel.org>
      Link: https://lore.kernel.org/r/c26c3f02dcb38ab63b2f2534cb463d95ee81bb13.1632141760.git.lorenzo@kernel.org
      Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      ab859974
    • Chih-Kang Chang's avatar
      mac80211: Fix ieee80211_amsdu_aggregate frag_tail bug · 87e06c44
      Chih-Kang Chang authored
      [ Upstream commit fe94bac6 ]
      
      In ieee80211_amsdu_aggregate() set a pointer frag_tail point to the
      end of skb_shinfo(head)->frag_list, and use it to bind other skb in
      the end of this function. But when execute ieee80211_amsdu_aggregate()
      ->ieee80211_amsdu_realloc_pad()->pskb_expand_head(), the address of
      skb_shinfo(head)->frag_list will be changed. However, the
      ieee80211_amsdu_aggregate() not update frag_tail after call
      pskb_expand_head(). That will cause the second skb can't bind to the
      head skb appropriately.So we update the address of frag_tail to fix it.
      
      Fixes: 6e0456b5
      
       ("mac80211: add A-MSDU tx support")
      Signed-off-by: default avatarChih-Kang Chang <gary.chang@realtek.com>
      Signed-off-by: default avatarZong-Zhe Yang <kevin_yang@realtek.com>
      Signed-off-by: default avatarPing-Ke Shih <pkshih@realtek.com>
      Link: https://lore.kernel.org/r/20210830073240.12736-1-pkshih@realtek.com
      [reword comment]
      Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      87e06c44
    • Vadim Pasternak's avatar
      hwmon: (mlxreg-fan) Return non-zero value when fan current state is enforced from sysfs · a6c42ae1
      Vadim Pasternak authored
      [ Upstream commit e6fab7af ]
      
      Fan speed minimum can be enforced from sysfs. For example, setting
      current fan speed to 20 is used to enforce fan speed to be at 100%
      speed, 19 - to be not below 90% speed, etcetera. This feature provides
      ability to limit fan speed according to some system wise
      considerations, like absence of some replaceable units or high system
      ambient temperature.
      
      Request for changing fan minimum speed is configuration request and can
      be set only through 'sysfs' write procedure. In this situation value of
      argument 'state' is above nominal fan speed maximum.
      
      Return non-zero code in this case to avoid
      thermal_cooling_device_stats_update() call, because in this case
      statistics update violates thermal statistics table range.
      The issues is observed in case kernel is configured with option
      CONFIG_THERMAL_STATISTICS.
      
      Here is the trace from KASAN:
      [  159.506659] BUG: KASAN: slab-out-of-bounds in thermal_cooling_device_stats_update+0x7d/0xb0
      [  159.516016] Read of size 4 at addr ffff888116163840 by task hw-management.s/7444
      [  159.545625] Call Trace:
      [  159.548366]  dump_stack+0x92/0xc1
      [  159.552084]  ? thermal_cooling_device_stats_update+0x7d/0xb0
      [  159.635869]  thermal_zone_device_update+0x345/0x780
      [  159.688711]  thermal_zone_device_set_mode+0x7d/0xc0
      [  159.694174]  mlxsw_thermal_modules_init+0x48f/0x590 [mlxsw_core]
      [  159.700972]  ? mlxsw_thermal_set_cur_state+0x5a0/0x5a0 [mlxsw_core]
      [  159.731827]  mlxsw_thermal_init+0x763/0x880 [mlxsw_core]
      [  160.070233] RIP: 0033:0x7fd995909970
      [  160.074239] Code: 73 01 c3 48 8b 0d 28 d5 2b 00 f7 d8 64 89 01 48 83 c8 ff c3 66 0f 1f 44 00 00 83 3d 99 2d 2c 00 00 75 10 b8 01 00 00 00 0f 05 <48> 3d 01 f0 ff ..
      [  160.095242] RSP: 002b:00007fff54f5d938 EFLAGS: 00000246 ORIG_RAX: 0000000000000001
      [  160.103722] RAX: ffffffffffffffda RBX: 0000000000000013 RCX: 00007fd995909970
      [  160.111710] RDX: 0000000000000013 RSI: 0000000001906008 RDI: 0000000000000001
      [  160.119699] RBP: 0000000001906008 R08: 00007fd995bc9760 R09: 00007fd996210700
      [  160.127687] R10: 0000000000000073 R11: 0000000000000246 R12: 0000000000000013
      [  160.135673] R13: 0000000000000001 R14: 00007fd995bc8600 R15: 0000000000000013
      [  160.143671]
      [  160.145338] Allocated by task 2924:
      [  160.149242]  kasan_save_stack+0x19/0x40
      [  160.153541]  __kasan_kmalloc+0x7f/0xa0
      [  160.157743]  __kmalloc+0x1a2/0x2b0
      [  160.161552]  thermal_cooling_device_setup_sysfs+0xf9/0x1a0
      [  160.167687]  __thermal_cooling_device_register+0x1b5/0x500
      [  160.173833]  devm_thermal_of_cooling_device_register+0x60/0xa0
      [  160.180356]  mlxreg_fan_probe+0x474/0x5e0 [mlxreg_fan]
      [  160.248140]
      [  160.249807] The buggy address belongs to the object at ffff888116163400
      [  160.249807]  which belongs to the cache kmalloc-1k of size 1024
      [  160.263814] The buggy address is located 64 bytes to the right of
      [  160.263814]  1024-byte region [ffff888116163400, ffff888116163800)
      [  160.277536] The buggy address belongs to the page:
      [  160.282898] page:0000000012275840 refcount:1 mapcount:0 mapping:0000000000000000 index:0xffff888116167000 pfn:0x116160
      [  160.294872] head:0000000012275840 order:3 compound_mapcount:0 compound_pincount:0
      [  160.303251] flags: 0x200000000010200(slab|head|node=0|zone=2)
      [  160.309694] raw: 0200000000010200 ffffea00046f7208 ffffea0004928208 ffff88810004dbc0
      [  160.318367] raw: ffff888116167000 00000000000a0006 00000001ffffffff 0000000000000000
      [  160.327033] page dumped because: kasan: bad access detected
      [  160.333270]
      [  160.334937] Memory state around the buggy address:
      [  160.356469] >ffff888116163800: fc ..
      
      Fixes: 65afb4c8
      
       ("hwmon: (mlxreg-fan) Add support for Mellanox FAN driver")
      Signed-off-by: default avatarVadim Pasternak <vadimp@nvidia.com>
      Link: https://lore.kernel.org/r/20210916183151.869427-1-vadimp@nvidia.com
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      a6c42ae1
    • Andrea Claudi's avatar
      ipvs: check that ip_vs_conn_tab_bits is between 8 and 20 · 2c305922
      Andrea Claudi authored
      [ Upstream commit 69e73dbf ]
      
      ip_vs_conn_tab_bits may be provided by the user through the
      conn_tab_bits module parameter. If this value is greater than 31, or
      less than 0, the shift operator used to derive tab_size causes undefined
      behaviour.
      
      Fix this checking ip_vs_conn_tab_bits value to be in the range specified
      in ipvs Kconfig. If not, simply use default value.
      
      Fixes: 6f7edb48
      
       ("IPVS: Allow boot time change of hash size")
      Reported-by: default avatarYi Chen <yiche@redhat.com>
      Signed-off-by: default avatarAndrea Claudi <aclaudi@redhat.com>
      Acked-by: default avatarJulian Anastasov <ja@ssi.bg>
      Acked-by: default avatarSimon Horman <horms@verge.net.au>
      Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      2c305922
    • Charlene Liu's avatar
      drm/amd/display: Pass PCI deviceid into DC · 9a571d83
      Charlene Liu authored
      commit d9428568
      
       upstream.
      
      [why]
      pci deviceid not passed to dal dc, without proper break,
      dcn2.x falls into dcn3.x code path
      
      [how]
      pass in pci deviceid, and break once dal_version initialized.
      
      Reviewed-by: default avatarZhan Liu <Zhan.Liu@amd.com>
      Acked-by: default avatarAnson Jacob <Anson.Jacob@amd.com>
      Signed-off-by: default avatarCharlene Liu <Charlene.Liu@amd.com>
      Tested-by: default avatarDaniel Wheeler <daniel.wheeler@amd.com>
      Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
      Cc: stable@vger.kernel.org
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      9a571d83
    • Zelin Deng's avatar
      x86/kvmclock: Move this_cpu_pvti into kvmclock.h · 3443eb44
      Zelin Deng authored
      commit ad9af930
      
       upstream.
      
      There're other modules might use hv_clock_per_cpu variable like ptp_kvm,
      so move it into kvmclock.h and export the symbol to make it visiable to
      other modules.
      
      Signed-off-by: default avatarZelin Deng <zelin.deng@linux.alibaba.com>
      Cc: <stable@vger.kernel.org>
      Message-Id: <1632892429-101194-2-git-send-email-zelin.deng@linux.alibaba.com>
      Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      3443eb44
    • Johannes Berg's avatar
      mac80211: fix use-after-free in CCMP/GCMP RX · 50149e08
      Johannes Berg authored
      commit 94513069 upstream.
      
      When PN checking is done in mac80211, for fragmentation we need
      to copy the PN to the RX struct so we can later use it to do a
      comparison, since commit bf30ca92 ("mac80211: check defrag
      PN against current frame").
      
      Unfortunately, in that commit I used the 'hdr' variable without
      it being necessarily valid, so use-after-free could occur if it
      was necessary to reallocate (parts of) the frame.
      
      Fix this by reloading the variable after the code that results
      in the reallocations, if any.
      
      This fixes https://bugzilla.kernel.org/show_bug.cgi?id=214401.
      
      Cc: stable@vger.kernel.org
      Fixes: bf30ca92
      
       ("mac80211: check defrag PN against current frame")
      Link: https://lore.kernel.org/r/20210927115838.12b9ac6bb233.I1d066acd5408a662c3b6e828122cd314fcb28cdb@changeid
      Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      50149e08
    • Jonathan Hsu's avatar
      scsi: ufs: Fix illegal offset in UPIU event trace · 956bc3ee
      Jonathan Hsu authored
      commit e8c2da7e upstream.
      
      Fix incorrect index for UTMRD reference in ufshcd_add_tm_upiu_trace().
      
      Link: https://lore.kernel.org/r/20210924085848.25500-1-jonathan.hsu@mediatek.com
      Fixes: 4b42d557
      
       ("scsi: ufs: core: Fix wrong Task Tag used in task management request UPIUs")
      Cc: stable@vger.kernel.org
      Reviewed-by: default avatarStanley Chu <stanley.chu@mediatek.com>
      Reviewed-by: default avatarBart Van Assche <bvanassche@acm.org>
      Signed-off-by: default avatarJonathan Hsu <jonathan.hsu@mediatek.com>
      Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      956bc3ee
    • Nadezda Lutovinova's avatar
      hwmon: (w83791d) Fix NULL pointer dereference by removing unnecessary structure field · 44d3c480
      Nadezda Lutovinova authored
      commit 943c15ac
      
       upstream.
      
      If driver read val value sufficient for
      (val & 0x08) && (!(val & 0x80)) && ((val & 0x7) == ((val >> 4) & 0x7))
      from device then Null pointer dereference occurs.
      (It is possible if tmp = 0b0xyz1xyz, where same literals mean same numbers)
      Also lm75[] does not serve a purpose anymore after switching to
      devm_i2c_new_dummy_device() in w83791d_detect_subclients().
      
      The patch fixes possible NULL pointer dereference by removing lm75[].
      
      Found by Linux Driver Verification project (linuxtesting.org).
      
      Cc: stable@vger.kernel.org
      Signed-off-by: default avatarNadezda Lutovinova <lutovinova@ispras.ru>
      Link: https://lore.kernel.org/r/20210921155153.28098-1-lutovinova@ispras.ru
      [groeck: Dropped unnecessary continuation lines, fixed multi-line alignment]
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      44d3c480
    • Nadezda Lutovinova's avatar
      hwmon: (w83792d) Fix NULL pointer dereference by removing unnecessary structure field · 200ced5b
      Nadezda Lutovinova authored
      commit 0f36b881
      
       upstream.
      
      If driver read val value sufficient for
      (val & 0x08) && (!(val & 0x80)) && ((val & 0x7) == ((val >> 4) & 0x7))
      from device then Null pointer dereference occurs.
      (It is possible if tmp = 0b0xyz1xyz, where same literals mean same numbers)
      Also lm75[] does not serve a purpose anymore after switching to
      devm_i2c_new_dummy_device() in w83791d_detect_subclients().
      
      The patch fixes possible NULL pointer dereference by removing lm75[].
      
      Found by Linux Driver Verification project (linuxtesting.org).
      
      Cc: stable@vger.kernel.org
      Signed-off-by: default avatarNadezda Lutovinova <lutovinova@ispras.ru>
      Link: https://lore.kernel.org/r/20210921155153.28098-2-lutovinova@ispras.ru
      [groeck: Dropped unnecessary continuation lines, fixed multipline alignment]
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      200ced5b
    • Nadezda Lutovinova's avatar
      hwmon: (w83793) Fix NULL pointer dereference by removing unnecessary structure field · 6cb01fe6
      Nadezda Lutovinova authored
      commit dd4d747e
      
       upstream.
      
      If driver read tmp value sufficient for
      (tmp & 0x08) && (!(tmp & 0x80)) && ((tmp & 0x7) == ((tmp >> 4) & 0x7))
      from device then Null pointer dereference occurs.
      (It is possible if tmp = 0b0xyz1xyz, where same literals mean same numbers)
      Also lm75[] does not serve a purpose anymore after switching to
      devm_i2c_new_dummy_device() in w83791d_detect_subclients().
      
      The patch fixes possible NULL pointer dereference by removing lm75[].
      
      Found by Linux Driver Verification project (linuxtesting.org).
      
      Cc: stable@vger.kernel.org
      Signed-off-by: default avatarNadezda Lutovinova <lutovinova@ispras.ru>
      Link: https://lore.kernel.org/r/20210921155153.28098-3-lutovinova@ispras.ru
      [groeck: Dropped unnecessary continuation lines, fixed multi-line alignments]
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      6cb01fe6
    • Eric Biggers's avatar
      fs-verity: fix signed integer overflow with i_size near S64_MAX · 504cf969
      Eric Biggers authored
      commit 80f6e308
      
       upstream.
      
      If the file size is almost S64_MAX, the calculated number of Merkle tree
      levels exceeds FS_VERITY_MAX_LEVELS, causing FS_IOC_ENABLE_VERITY to
      fail.  This is unintentional, since as the comment above the definition
      of FS_VERITY_MAX_LEVELS states, it is enough for over U64_MAX bytes of
      data using SHA-256 and 4K blocks.  (Specifically, 4096*128**8 >= 2**64.)
      
      The bug is actually that when the number of blocks in the first level is
      calculated from i_size, there is a signed integer overflow due to i_size
      being signed.  Fix this by treating i_size as unsigned.
      
      This was found by the new test "generic: test fs-verity EFBIG scenarios"
      (https://lkml.kernel.org/r/b1d116cd4d0ea74b9cd86f349c672021e005a75c.1631558495.git.boris@bur.io).
      
      This didn't affect ext4 or f2fs since those have a smaller maximum file
      size, but it did affect btrfs which allows files up to S64_MAX bytes.
      
      Reported-by: default avatarBoris Burkov <boris@bur.io>
      Fixes: 3fda4c61 ("fs-verity: implement FS_IOC_ENABLE_VERITY ioctl")
      Fixes: fd2d1acf
      
       ("fs-verity: add the hook for file ->open()")
      Cc: <stable@vger.kernel.org> # v5.4+
      Reviewed-by: default avatarBoris Burkov <boris@bur.io>
      Link: https://lore.kernel.org/r/20210916203424.113376-1-ebiggers@kernel.org
      Signed-off-by: default avatarEric Biggers <ebiggers@google.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      504cf969
    • Pawel Laszczak's avatar
      usb: cdns3: fix race condition before setting doorbell · b2fb6ce0
      Pawel Laszczak authored
      commit b69ec50b upstream
      
      For DEV_VER_V3 version there exist race condition between clearing
      ep_sts.EP_STS_TRBERR and setting ep_cmd.EP_CMD_DRDY bit.
      Setting EP_CMD_DRDY will be ignored by controller when
      EP_STS_TRBERR is set. So, between these two instructions we have
      a small time gap in which the EP_STS_TRBERR can be set. In such case
      the transfer will not start after setting doorbell.
      
      Fixes: 7733f6c3
      
       ("usb: cdns3: Add Cadence USB3 DRD Driver")
      cc: <stable@vger.kernel.org> # 5.4.x
      Tested-by: default avatarAswath Govindraju <a-govindraju@ti.com>
      Reviewed-by: default avatarAswath Govindraju <a-govindraju@ti.com>
      Signed-off-by: default avatarPawel Laszczak <pawell@cadence.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      b2fb6ce0
    • James Morse's avatar
      cpufreq: schedutil: Destroy mutex before kobject_put() frees the memory · e2370e19
      James Morse authored
      [ Upstream commit cdef1196 ]
      
      Since commit e5c6b312 ("cpufreq: schedutil: Use kobject release()
      method to free sugov_tunables") kobject_put() has kfree()d the
      attr_set before gov_attr_set_put() returns.
      
      kobject_put() isn't the last user of attr_set in gov_attr_set_put(),
      the subsequent mutex_destroy() triggers a use-after-free:
      | BUG: KASAN: use-after-free in mutex_is_locked+0x20/0x60
      | Read of size 8 at addr ffff000800ca4250 by task cpuhp/2/20
      |
      | CPU: 2 PID: 20 Comm: cpuhp/2 Not tainted 5.15.0-rc1 #12369
      | Hardware name: ARM LTD ARM Juno Development Platform/ARM Juno Development
      | Platform, BIOS EDK II Jul 30 2018
      | Call trace:
      |  dump_backtrace+0x0/0x380
      |  show_stack+0x1c/0x30
      |  dump_stack_lvl+0x8c/0xb8
      |  print_address_description.constprop.0+0x74/0x2b8
      |  kasan_report+0x1f4/0x210
      |  kasan_check_range+0xfc/0x1a4
      |  __kasan_check_read+0x38/0x60
      |  mutex_is_locked+0x20/0x60
      |  mutex_destroy+0x80/0x100
      |  gov_attr_set_put+0xfc/0x150
      |  sugov_exit+0x78/0x190
      |  cpufreq_offline.isra.0+0x2c0/0x660
      |  cpuhp_cpufreq_offline+0x14/0x24
      |  cpuhp_invoke_callback+0x430/0x6d0
      |  cpuhp_thread_fun+0x1b0/0x624
      |  smpboot_thread_fn+0x5e0/0xa6c
      |  kthread+0x3a0/0x450
      |  ret_from_fork+0x10/0x20
      
      Swap the order of the calls.
      
      Fixes: e5c6b312
      
       ("cpufreq: schedutil: Use kobject release() method to free sugov_tunables")
      Cc: 4.7+ <stable@vger.kernel.org> # 4.7+
      Signed-off-by: default avatarJames Morse <james.morse@arm.com>
      Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      e2370e19
    • Kevin Hao's avatar
      cpufreq: schedutil: Use kobject release() method to free sugov_tunables · 67c98e02
      Kevin Hao authored
      [ Upstream commit e5c6b312 ]
      
      The struct sugov_tunables is protected by the kobject, so we can't free
      it directly. Otherwise we would get a call trace like this:
        ODEBUG: free active (active state 0) object type: timer_list hint: delayed_work_timer_fn+0x0/0x30
        WARNING: CPU: 3 PID: 720 at lib/debugobjects.c:505 debug_print_object+0xb8/0x100
        Modules linked in:
        CPU: 3 PID: 720 Comm: a.sh Tainted: G        W         5.14.0-rc1-next-20210715-yocto-standard+ #507
        Hardware name: Marvell OcteonTX CN96XX board (DT)
        pstate: 40400009 (nZcv daif +PAN -UAO -TCO BTYPE=--)
        pc : debug_print_object+0xb8/0x100
        lr : debug_print_object+0xb8/0x100
        sp : ffff80001ecaf910
        x29: ffff80001ecaf910 x28: ffff00011b10b8d0 x27: ffff800011043d80
        x26: ffff00011a8f0000 x25: ffff800013cb3ff0 x24: 0000000000000000
        x23: ffff80001142aa68 x22: ffff800011043d80 x21: ffff00010de46f20
        x20: ffff800013c0c520 x19: ffff800011d8f5b0 x18: 0000000000000010
        x17: 6e6968207473696c x16: 5f72656d6974203a x15: 6570797420746365
        x14: 6a626f2029302065 x13: 303378302f307830 x12: 2b6e665f72656d69
        x11: ffff8000124b1560 x10: ffff800012331520 x9 : ffff8000100ca6b0
        x8 : 000000000017ffe8 x7 : c0000000fffeffff x6 : 0000000000000001
        x5 : ffff800011d8c000 x4 : ffff800011d8c740 x3 : 0000000000000000
        x2 : ffff0001108301c0 x1 : ab3c90eedf9c0f00 x0 : 0000000000000000
        Call trace:
         debug_print_object+0xb8/0x100
         __debug_check_no_obj_freed+0x1c0/0x230
         debug_check_no_obj_freed+0x20/0x88
         slab_free_freelist_hook+0x154/0x1c8
         kfree+0x114/0x5d0
         sugov_exit+0xbc/0xc0
         cpufreq_exit_governor+0x44/0x90
         cpufreq_set_policy+0x268/0x4a8
         store_scaling_governor+0xe0/0x128
         store+0xc0/0xf0
         sysfs_kf_write+0x54/0x80
         kernfs_fop_write_iter+0x128/0x1c0
         new_sync_write+0xf0/0x190
         vfs_write+0x2d4/0x478
         ksys_write+0x74/0x100
         __arm64_sys_write+0x24/0x30
         invoke_syscall.constprop.0+0x54/0xe0
         do_el0_svc+0x64/0x158
         el0_svc+0x2c/0xb0
         el0t_64_sync_handler+0xb0/0xb8
         el0t_64_sync+0x198/0x19c
        irq event stamp: 5518
        hardirqs last  enabled at (5517): [<ffff8000100cbd7c>] console_unlock+0x554/0x6c8
        hardirqs last disabled at (5518): [<ffff800010fc0638>] el1_dbg+0x28/0xa0
        softirqs last  enabled at (5504): [<ffff8000100106e0>] __do_softirq+0x4d0/0x6c0
        softirqs last disabled at (5483): [<ffff800010049548>] irq_exit+0x1b0/0x1b8
      
      So split the original sugov_tunables_free() into two functions,
      sugov_clear_global_tunables() is just used to clear the global_tunables
      and the new sugov_tunables_free() is used as kobj_type::release to
      release the sugov_tunables safely.
      
      Fixes: 9bdcb44e
      
       ("cpufreq: schedutil: New governor based on scheduler utilization data")
      Cc: 4.7+ <stable@vger.kernel.org> # 4.7+
      Signed-off-by: default avatarKevin Hao <haokexin@gmail.com>
      Acked-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
      Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      67c98e02
    • Igor Matheus Andrade Torrente's avatar
      tty: Fix out-of-bound vmalloc access in imageblit · 883f7897
      Igor Matheus Andrade Torrente authored
      [ Upstream commit 3b0c4061
      
       ]
      
      This issue happens when a userspace program does an ioctl
      FBIOPUT_VSCREENINFO passing the fb_var_screeninfo struct
      containing only the fields xres, yres, and bits_per_pixel
      with values.
      
      If this struct is the same as the previous ioctl, the
      vc_resize() detects it and doesn't call the resize_screen(),
      leaving the fb_var_screeninfo incomplete. And this leads to
      the updatescrollmode() calculates a wrong value to
      fbcon_display->vrows, which makes the real_y() return a
      wrong value of y, and that value, eventually, causes
      the imageblit to access an out-of-bound address value.
      
      To solve this issue I made the resize_screen() be called
      even if the screen does not need any resizing, so it will
      "fix and fill" the fb_var_screeninfo independently.
      
      Cc: stable <stable@vger.kernel.org> # after 5.15-rc2 is out, give it time to bake
      Reported-and-tested-by: default avatar <syzbot+858dc7a2f7ef07c2c219@syzkaller.appspotmail.com>
      Signed-off-by: default avatarIgor Matheus Andrade Torrente <igormtorrente@gmail.com>
      Link: https://lore.kernel.org/r/20210628134509.15895-1-igormtorrente@gmail.com
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      883f7897
  2. Sep 30, 2021
    • Greg Kroah-Hartman's avatar
      Linux 5.4.150 · 3a7dc5b4
      Greg Kroah-Hartman authored
      
      
      Link: https://lore.kernel.org/r/20210927170219.901812470@linuxfoundation.org
      Tested-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
      Tested-by: default avatarShuah Khan <skhan@linuxfoundation.org>
      Tested-by: default avatarJon Hunter <jonathanh@nvidia.com>
      Tested-by: default avatarLinux Kernel Functional Testing <lkft@linaro.org>
      Tested-by: default avatarSudip Mukherjee <sudip.mukherjee@codethink.co.uk>
      Tested-by: default avatarHulk Robot <hulkrobot@huawei.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      v5.4.150
      3a7dc5b4
    • Linus Torvalds's avatar
      qnx4: work around gcc false positive warning bug · 27f8c440
      Linus Torvalds authored
      commit d5f65459 upstream.
      
      In commit b7213ffa
      
       ("qnx4: avoid stringop-overread errors") I tried
      to teach gcc about how the directory entry structure can be two
      different things depending on a status flag.  It made the code clearer,
      and it seemed to make gcc happy.
      
      However, Arnd points to a gcc bug, where despite using two different
      members of a union, gcc then gets confused, and uses the size of one of
      the members to decide if a string overrun happens.  And not necessarily
      the rigth one.
      
      End result: with some configurations, gcc-11 will still complain about
      the source buffer size being overread:
      
        fs/qnx4/dir.c: In function 'qnx4_readdir':
        fs/qnx4/dir.c:76:32: error: 'strnlen' specified bound [16, 48] exceeds source size 1 [-Werror=stringop-overread]
           76 |                         size = strnlen(name, size);
              |                                ^~~~~~~~~~~~~~~~~~~
        fs/qnx4/dir.c:26:22: note: source object declared here
           26 |                 char de_name;
              |                      ^~~~~~~
      
      because gcc will get confused about which union member entry is actually
      getting accessed, even when the source code is very clear about it.  Gcc
      internally will have combined two "redundant" pointers (pointing to
      different union elements that are at the same offset), and takes the
      size checking from one or the other - not necessarily the right one.
      
      This is clearly a gcc bug, but we can work around it fairly easily.  The
      biggest thing here is the big honking comment about why we do what we
      do.
      
      Link: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99578#c6
      Reported-and-tested-by: default avatarArnd Bergmann <arnd@kernel.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      27f8c440
    • Juergen Gross's avatar
      xen/balloon: fix balloon kthread freezing · 3a0f951e
      Juergen Gross authored
      commit 96f5bd03 upstream.
      
      Commit 8480ed9c ("xen/balloon: use a kernel thread instead a
      workqueue") switched the Xen balloon driver to use a kernel thread.
      Unfortunately the patch omitted to call try_to_freeze() or to use
      wait_event_freezable_timeout(), causing a system suspend to fail.
      
      Fixes: 8480ed9c
      
       ("xen/balloon: use a kernel thread instead a workqueue")
      Signed-off-by: default avatarJuergen Gross <jgross@suse.com>
      Reviewed-by: default avatarBoris Ostrovsky <boris.ostrovsky@oracle.com>
      Link: https://lore.kernel.org/r/20210920100345.21939-1-jgross@suse.com
      Signed-off-by: default avatarJuergen Gross <jgross@suse.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      3a0f951e
    • Pali Rohár's avatar
      arm64: dts: marvell: armada-37xx: Extend PCIe MEM space · f80b6793
      Pali Rohár authored
      commit 514ef1e6
      
       upstream.
      
      Current PCIe MEM space of size 16 MB is not enough for some combination
      of PCIe cards (e.g. NVMe disk together with ath11k wifi card). ARM Trusted
      Firmware for Armada 3700 platform already assigns 128 MB for PCIe window,
      so extend PCIe MEM space to the end of 128 MB PCIe window which allows to
      allocate more PCIe BARs for more PCIe cards.
      
      Without this change some combination of PCIe cards cannot be used and
      kernel show error messages in dmesg during initialization:
      
          pci 0000:00:00.0: BAR 8: no space for [mem size 0x01800000]
          pci 0000:00:00.0: BAR 8: failed to assign [mem size 0x01800000]
          pci 0000:00:00.0: BAR 6: assigned [mem 0xe8000000-0xe80007ff pref]
          pci 0000:01:00.0: BAR 8: no space for [mem size 0x01800000]
          pci 0000:01:00.0: BAR 8: failed to assign [mem size 0x01800000]
          pci 0000:02:03.0: BAR 8: no space for [mem size 0x01000000]
          pci 0000:02:03.0: BAR 8: failed to assign [mem size 0x01000000]
          pci 0000:02:07.0: BAR 8: no space for [mem size 0x00100000]
          pci 0000:02:07.0: BAR 8: failed to assign [mem size 0x00100000]
          pci 0000:03:00.0: BAR 0: no space for [mem size 0x01000000 64bit]
          pci 0000:03:00.0: BAR 0: failed to assign [mem size 0x01000000 64bit]
      
      Due to bugs in U-Boot port for Turris Mox, the second range in Turris Mox
      kernel DTS file for PCIe must start at 16 MB offset. Otherwise U-Boot
      crashes during loading of kernel DTB file. This bug is present only in
      U-Boot code for Turris Mox and therefore other Armada 3700 devices are not
      affected by this bug. Bug is fixed in U-Boot version 2021.07.
      
      To not break booting new kernels on existing versions of U-Boot on Turris
      Mox, use first 16 MB range for IO and second range with rest of PCIe window
      for MEM.
      
      Signed-off-by: default avatarPali Rohár <pali@kernel.org>
      Fixes: 76f6386b
      
       ("arm64: dts: marvell: Add Aardvark PCIe support for Armada 3700")
      Signed-off-by: default avatarGregory CLEMENT <gregory.clement@bootlin.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      f80b6793
    • Antoine Tenart's avatar
      thermal/drivers/int340x: Do not set a wrong tcc offset on resume · 04783de9
      Antoine Tenart authored
      commit 8b4bd256 upstream.
      
      After upgrading to Linux 5.13.3 I noticed my laptop would shutdown due
      to overheat (when it should not). It turned out this was due to commit
      fe6a6de6 ("thermal/drivers/int340x/processor_thermal: Fix tcc setting").
      
      What happens is this drivers uses a global variable to keep track of the
      tcc offset (tcc_offset_save) and uses it on resume. The issue is this
      variable is initialized to 0, but is only set in
      tcc_offset_degree_celsius_store, i.e. when the tcc offset is explicitly
      set by userspace. If that does not happen, the resume path will set the
      offset to 0 (in my case the h/w default being 3, the offset would become
      too low after a suspend/resume cycle).
      
      The issue did not arise before commit fe6a6de6, as the function
      setting the offset would return if the offset was 0. This is no longer
      the case (rightfully).
      
      Fix this by not applying the offset if it wasn't saved before, reverting
      back to the old logic. A better approach will come later, but this will
      be easier to apply to stable kernels.
      
      The logic to restore the offset after a resume was there long before
      commit fe6a6de6, but as a value of 0 was considered invalid I'm
      referencing the commit that made the issue possible in the Fixes tag
      instead.
      
      Fixes: fe6a6de6
      
       ("thermal/drivers/int340x/processor_thermal: Fix tcc setting")
      Cc: stable@vger.kernel.org
      Cc: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
      Signed-off-by: default avatarAntoine Tenart <atenart@kernel.org>
      Signed-off-by: default avatarDaniel Lezcano <daniel.lezcano@linaro.org>
      Reviewed-by: default avatarSrinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
      Tested-by: default avatarSrinivas Pandruvada &lt;srinivas.pI <andruvada@linux.intel.com>
      Link: https://lore.kernel.org/r/20210909085613.5577-2-atenart@kernel.org
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      04783de9
    • Sai Krishna Potthuri's avatar
      EDAC/synopsys: Fix wrong value type assignment for edac_mode · de1c3506
      Sai Krishna Potthuri authored
      commit 5297cfa6 upstream.
      
      dimm->edac_mode contains values of type enum edac_type - not the
      corresponding capability flags. Fix that.
      
      Issue caught by Coverity check "enumerated type mixed with another
      type."
      
       [ bp: Rewrite commit message, add tags. ]
      
      Fixes: ae9b56e3
      
       ("EDAC, synps: Add EDAC support for zynq ddr ecc controller")
      Signed-off-by: default avatarSai Krishna Potthuri <lakshmi.sai.krishna.potthuri@xilinx.com>
      Signed-off-by: default avatarShubhrajyoti Datta <shubhrajyoti.datta@xilinx.com>
      Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
      Cc: <stable@vger.kernel.org>
      Link: https://lkml.kernel.org/r/20210818072315.15149-1-shubhrajyoti.datta@xilinx.com
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      de1c3506
    • Linus Torvalds's avatar
      spi: Fix tegra20 build with CONFIG_PM=n · 8ede848b
      Linus Torvalds authored
      [ Upstream commit efafec27
      
       ]
      
      Without CONFIG_PM enabled, the SET_RUNTIME_PM_OPS() macro ends up being
      empty, and the only use of tegra_slink_runtime_{resume,suspend} goes
      away, resulting in
      
        drivers/spi/spi-tegra20-slink.c:1200:12: error: ‘tegra_slink_runtime_resume’ defined but not used [-Werror=unused-function]
         1200 | static int tegra_slink_runtime_resume(struct device *dev)
              |            ^~~~~~~~~~~~~~~~~~~~~~~~~~
        drivers/spi/spi-tegra20-slink.c:1188:12: error: ‘tegra_slink_runtime_suspend’ defined but not used [-Werror=unused-function]
         1188 | static int tegra_slink_runtime_suspend(struct device *dev)
              |            ^~~~~~~~~~~~~~~~~~~~~~~~~~~
      
      mark the functions __maybe_unused to make the build happy.
      
      This hits the alpha allmodconfig build (and others).
      
      Reported-by: default avatarGuenter Roeck <linux@roeck-us.net>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      8ede848b
    • Guenter Roeck's avatar
      net: 6pack: Fix tx timeout and slot time · d193f7db
      Guenter Roeck authored
      [ Upstream commit 3c0d2a46
      
       ]
      
      tx timeout and slot time are currently specified in units of HZ.  On
      Alpha, HZ is defined as 1024.  When building alpha:allmodconfig, this
      results in the following error message.
      
        drivers/net/hamradio/6pack.c: In function 'sixpack_open':
        drivers/net/hamradio/6pack.c:71:41: error:
        	unsigned conversion from 'int' to 'unsigned char'
        	changes value from '256' to '0'
      
      In the 6PACK protocol, tx timeout is specified in units of 10 ms and
      transmitted over the wire:
      
          https://www.linux-ax25.org/wiki/6PACK
      
      Defining a value dependent on HZ doesn't really make sense, and
      presumably comes from the (very historical) situation where HZ was
      originally 100.
      
      Note that the SIXP_SLOTTIME use explicitly is about 10ms granularity:
      
              mod_timer(&sp->tx_t, jiffies + ((when + 1) * HZ) / 100);
      
      and the SIXP_TXDELAY walue is sent as a byte over the wire.
      
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      d193f7db
    • Guenter Roeck's avatar
      alpha: Declare virt_to_phys and virt_to_bus parameter as pointer to volatile · fa56f2c9
      Guenter Roeck authored
      [ Upstream commit 35a3f4ef
      
       ]
      
      Some drivers pass a pointer to volatile data to virt_to_bus() and
      virt_to_phys(), and that works fine.  One exception is alpha.  This
      results in a number of compile errors such as
      
        drivers/net/wan/lmc/lmc_main.c: In function 'lmc_softreset':
        drivers/net/wan/lmc/lmc_main.c:1782:50: error:
      	passing argument 1 of 'virt_to_bus' discards 'volatile'
      	qualifier from pointer target type
      
        drivers/atm/ambassador.c: In function 'do_loader_command':
        drivers/atm/ambassador.c:1747:58: error:
      	passing argument 1 of 'virt_to_bus' discards 'volatile'
      	qualifier from pointer target type
      
      Declare the parameter of virt_to_phys and virt_to_bus as pointer to
      volatile to fix the problem.
      
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      Acked-by: default avatarArnd Bergmann <arnd@arndb.de>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      fa56f2c9
    • Dan Li's avatar
      arm64: Mark __stack_chk_guard as __ro_after_init · af4a142a
      Dan Li authored
      [ Upstream commit 9fcb2e93
      
       ]
      
      __stack_chk_guard is setup once while init stage and never changed
      after that.
      
      Although the modification of this variable at runtime will usually
      cause the kernel to crash (so does the attacker), it should be marked
      as __ro_after_init, and it should not affect performance if it is
      placed in the ro_after_init section.
      
      Signed-off-by: default avatarDan Li <ashimida@linux.alibaba.com>
      Acked-by: default avatarMark Rutland <mark.rutland@arm.com>
      Link: https://lore.kernel.org/r/1631612642-102881-1-git-send-email-ashimida@linux.alibaba.com
      Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      af4a142a
    • Helge Deller's avatar
      parisc: Use absolute_pointer() to define PAGE0 · aeb19da4
      Helge Deller authored
      [ Upstream commit 90cc7bed
      
       ]
      
      Use absolute_pointer() wrapper for PAGE0 to avoid this compiler warning:
      
        arch/parisc/kernel/setup.c: In function 'start_parisc':
        error: '__builtin_memcmp_eq' specified bound 8 exceeds source size 0
      
      Signed-off-by: default avatarHelge Deller <deller@gmx.de>
      Co-Developed-by: default avatarGuenter Roeck <linux@roeck-us.net>
      Suggested-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      aeb19da4
    • Linus Torvalds's avatar
      qnx4: avoid stringop-overread errors · 8cd34eb6
      Linus Torvalds authored
      [ Upstream commit b7213ffa
      
       ]
      
      The qnx4 directory entries are 64-byte blocks that have different
      contents depending on the a status byte that is in the last byte of the
      block.
      
      In particular, a directory entry can be either a "link info" entry with
      a 48-byte name and pointers to the real inode information, or an "inode
      entry" with a smaller 16-byte name and the full inode information.
      
      But the code was written to always just treat the directory name as if
      it was part of that "inode entry", and just extend the name to the
      longer case if the status byte said it was a link entry.
      
      That work just fine and gives the right results, but now that gcc is
      tracking data structure accesses much more, the code can trigger a
      compiler error about using up to 48 bytes (the long name) in a structure
      that only has that shorter name in it:
      
         fs/qnx4/dir.c: In function ‘qnx4_readdir’:
         fs/qnx4/dir.c:51:32: error: ‘strnlen’ specified bound 48 exceeds source size 16 [-Werror=stringop-overread]
            51 |                         size = strnlen(de->di_fname, size);
               |                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~
         In file included from fs/qnx4/qnx4.h:3,
                          from fs/qnx4/dir.c:16:
         include/uapi/linux/qnx4_fs.h:45:25: note: source object declared here
            45 |         char            di_fname[QNX4_SHORT_NAME_MAX];
               |                         ^~~~~~~~
      
      which is because the source code doesn't really make this whole "one of
      two different types" explicit.
      
      Fix this by introducing a very explicit union of the two types, and
      basically explaining to the compiler what is really going on.
      
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      8cd34eb6
    • Linus Torvalds's avatar
      sparc: avoid stringop-overread errors · 1214ace6
      Linus Torvalds authored
      [ Upstream commit fc7c028d
      
       ]
      
      The sparc mdesc code does pointer games with 'struct mdesc_hdr', but
      didn't describe to the compiler how that header is then followed by the
      data that the header describes.
      
      As a result, gcc is now unhappy since it does stricter pointer range
      tracking, and doesn't understand about how these things work.  This
      results in various errors like:
      
          arch/sparc/kernel/mdesc.c: In function ‘mdesc_node_by_name’:
          arch/sparc/kernel/mdesc.c:647:22: error: ‘strcmp’ reading 1 or more bytes from a region of size 0 [-Werror=stringop-overread]
            647 |                 if (!strcmp(names + ep[ret].name_offset, name))
                |                      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      
      which are easily avoided by just describing 'struct mdesc_hdr' better,
      and making the node_block() helper function look into that unsized
      data[] that follows the header.
      
      This makes the sparc64 build happy again at least for my cross-compiler
      version (gcc version 11.2.1).
      
      Link: https://lore.kernel.org/lkml/CAHk-=wi4NW3NC0xWykkw=6LnjQD6D_rtRtxY9g8gQAJXtQMi8A@mail.gmail.com/
      Cc: Guenter Roeck <linux@roeck-us.net>
      Cc: David S. Miller <davem@davemloft.net>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      1214ace6
    • Guenter Roeck's avatar
      net: i825xx: Use absolute_pointer for memcpy from fixed memory location · 113a8edf
      Guenter Roeck authored
      [ Upstream commit dff2d131
      
       ]
      
      gcc 11.x reports the following compiler warning/error.
      
        drivers/net/ethernet/i825xx/82596.c: In function 'i82596_probe':
        arch/m68k/include/asm/string.h:72:25: error:
      	'__builtin_memcpy' reading 6 bytes from a region of size 0 [-Werror=stringop-overread]
      
      Use absolute_pointer() to work around the problem.
      
      Cc: Geert Uytterhoeven <geert@linux-m68k.org>
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      Reviewed-by: default avatarGeert Uytterhoeven <geert@linux-m68k.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      113a8edf
    • Guenter Roeck's avatar
      compiler.h: Introduce absolute_pointer macro · 2397ea2d
      Guenter Roeck authored
      [ Upstream commit f6b5f1a5
      
       ]
      
      absolute_pointer() disassociates a pointer from its originating symbol
      type and context. Use it to prevent compiler warnings/errors such as
      
        drivers/net/ethernet/i825xx/82596.c: In function 'i82596_probe':
        arch/m68k/include/asm/string.h:72:25: error:
      	'__builtin_memcpy' reading 6 bytes from a region of size 0 [-Werror=stringop-overread]
      
      Such warnings may be reported by gcc 11.x for string and memory
      operations on fixed addresses.
      
      Suggested-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      Reviewed-by: default avatarGeert Uytterhoeven <geert@linux-m68k.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      2397ea2d
    • Li Jinlin's avatar
      blk-cgroup: fix UAF by grabbing blkcg lock before destroying blkg pd · d12ddd84
      Li Jinlin authored
      [ Upstream commit 858560b2
      
       ]
      
      KASAN reports a use-after-free report when doing fuzz test:
      
      [693354.104835] ==================================================================
      [693354.105094] BUG: KASAN: use-after-free in bfq_io_set_weight_legacy+0xd3/0x160
      [693354.105336] Read of size 4 at addr ffff888be0a35664 by task sh/1453338
      
      [693354.105607] CPU: 41 PID: 1453338 Comm: sh Kdump: loaded Not tainted 4.18.0-147
      [693354.105610] Hardware name: Huawei 2288H V5/BC11SPSCB0, BIOS 0.81 07/02/2018
      [693354.105612] Call Trace:
      [693354.105621]  dump_stack+0xf1/0x19b
      [693354.105626]  ? show_regs_print_info+0x5/0x5
      [693354.105634]  ? printk+0x9c/0xc3
      [693354.105638]  ? cpumask_weight+0x1f/0x1f
      [693354.105648]  print_address_description+0x70/0x360
      [693354.105654]  kasan_report+0x1b2/0x330
      [693354.105659]  ? bfq_io_set_weight_legacy+0xd3/0x160
      [693354.105665]  ? bfq_io_set_weight_legacy+0xd3/0x160
      [693354.105670]  bfq_io_set_weight_legacy+0xd3/0x160
      [693354.105675]  ? bfq_cpd_init+0x20/0x20
      [693354.105683]  cgroup_file_write+0x3aa/0x510
      [693354.105693]  ? ___slab_alloc+0x507/0x540
      [693354.105698]  ? cgroup_file_poll+0x60/0x60
      [693354.105702]  ? 0xffffffff89600000
      [693354.105708]  ? usercopy_abort+0x90/0x90
      [693354.105716]  ? mutex_lock+0xef/0x180
      [693354.105726]  kernfs_fop_write+0x1ab/0x280
      [693354.105732]  ? cgroup_file_poll+0x60/0x60
      [693354.105738]  vfs_write+0xe7/0x230
      [693354.105744]  ksys_write+0xb0/0x140
      [693354.105749]  ? __ia32_sys_read+0x50/0x50
      [693354.105760]  do_syscall_64+0x112/0x370
      [693354.105766]  ? syscall_return_slowpath+0x260/0x260
      [693354.105772]  ? do_page_fault+0x9b/0x270
      [693354.105779]  ? prepare_exit_to_usermode+0xf9/0x1a0
      [693354.105784]  ? enter_from_user_mode+0x30/0x30
      [693354.105793]  entry_SYSCALL_64_after_hwframe+0x65/0xca
      
      [693354.105875] Allocated by task 1453337:
      [693354.106001]  kasan_kmalloc+0xa0/0xd0
      [693354.106006]  kmem_cache_alloc_node_trace+0x108/0x220
      [693354.106010]  bfq_pd_alloc+0x96/0x120
      [693354.106015]  blkcg_activate_policy+0x1b7/0x2b0
      [693354.106020]  bfq_create_group_hierarchy+0x1e/0x80
      [693354.106026]  bfq_init_queue+0x678/0x8c0
      [693354.106031]  blk_mq_init_sched+0x1f8/0x460
      [693354.106037]  elevator_switch_mq+0xe1/0x240
      [693354.106041]  elevator_switch+0x25/0x40
      [693354.106045]  elv_iosched_store+0x1a1/0x230
      [693354.106049]  queue_attr_store+0x78/0xb0
      [693354.106053]  kernfs_fop_write+0x1ab/0x280
      [693354.106056]  vfs_write+0xe7/0x230
      [693354.106060]  ksys_write+0xb0/0x140
      [693354.106064]  do_syscall_64+0x112/0x370
      [693354.106069]  entry_SYSCALL_64_after_hwframe+0x65/0xca
      
      [693354.106114] Freed by task 1453336:
      [693354.106225]  __kasan_slab_free+0x130/0x180
      [693354.106229]  kfree+0x90/0x1b0
      [693354.106233]  blkcg_deactivate_policy+0x12c/0x220
      [693354.106238]  bfq_exit_queue+0xf5/0x110
      [693354.106241]  blk_mq_exit_sched+0x104/0x130
      [693354.106245]  __elevator_exit+0x45/0x60
      [693354.106249]  elevator_switch_mq+0xd6/0x240
      [693354.106253]  elevator_switch+0x25/0x40
      [693354.106257]  elv_iosched_store+0x1a1/0x230
      [693354.106261]  queue_attr_store+0x78/0xb0
      [693354.106264]  kernfs_fop_write+0x1ab/0x280
      [693354.106268]  vfs_write+0xe7/0x230
      [693354.106271]  ksys_write+0xb0/0x140
      [693354.106275]  do_syscall_64+0x112/0x370
      [693354.106280]  entry_SYSCALL_64_after_hwframe+0x65/0xca
      
      [693354.106329] The buggy address belongs to the object at ffff888be0a35580
                       which belongs to the cache kmalloc-1k of size 1024
      [693354.106736] The buggy address is located 228 bytes inside of
                       1024-byte region [ffff888be0a35580, ffff888be0a35980)
      [693354.107114] The buggy address belongs to the page:
      [693354.107273] page:ffffea002f828c00 count:1 mapcount:0 mapping:ffff888107c17080 index:0x0 compound_mapcount: 0
      [693354.107606] flags: 0x17ffffc0008100(slab|head)
      [693354.107760] raw: 0017ffffc0008100 ffffea002fcbc808 ffffea0030bd3a08 ffff888107c17080
      [693354.108020] raw: 0000000000000000 00000000001c001c 00000001ffffffff 0000000000000000
      [693354.108278] page dumped because: kasan: bad access detected
      
      [693354.108511] Memory state around the buggy address:
      [693354.108671]  ffff888be0a35500: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
      [693354.116396]  ffff888be0a35580: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
      [693354.124473] >ffff888be0a35600: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
      [693354.132421]                                                        ^
      [693354.140284]  ffff888be0a35680: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
      [693354.147912]  ffff888be0a35700: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
      [693354.155281] ==================================================================
      
      blkgs are protected by both queue and blkcg locks and holding
      either should stabilize them. However, the path of destroying
      blkg policy data is only protected by queue lock in
      blkcg_activate_policy()/blkcg_deactivate_policy(). Other tasks
      can get the blkg policy data before the blkg policy data is
      destroyed, and use it after destroyed, which will result in a
      use-after-free.
      
      CPU0                             CPU1
      blkcg_deactivate_policy
        spin_lock_irq(&q->queue_lock)
                                       bfq_io_set_weight_legacy
                                         spin_lock_irq(&blkcg->lock)
                                         blkg_to_bfqg(blkg)
                                           pd_to_bfqg(blkg->pd[pol->plid])
                                           ^^^^^^blkg->pd[pol->plid] != NULL
                                                 bfqg != NULL
        pol->pd_free_fn(blkg->pd[pol->plid])
          pd_to_bfqg(blkg->pd[pol->plid])
          bfqg_put(bfqg)
            kfree(bfqg)
        blkg->pd[pol->plid] = NULL
        spin_unlock_irq(q->queue_lock);
                                         bfq_group_set_weight(bfqg, val, 0)
                                           bfqg->entity.new_weight
                                           ^^^^^^trigger uaf here
                                         spin_unlock_irq(&blkcg->lock);
      
      Fix by grabbing the matching blkcg lock before trying to
      destroy blkg policy data.
      
      Suggested-by: default avatarTejun Heo <tj@kernel.org>
      Signed-off-by: default avatarLi Jinlin <lijinlin3@huawei.com>
      Acked-by: default avatarTejun Heo <tj@kernel.org>
      Link: https://lore.kernel.org/r/20210914042605.3260596-1-lijinlin3@huawei.com
      Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      d12ddd84
    • Andreas Larsson's avatar
      sparc32: page align size in arch_dma_alloc · 9d779882
      Andreas Larsson authored
      [ Upstream commit 59583f74 ]
      
      Commit 53b7670e
      
       ("sparc: factor the dma coherent mapping into
      helper") lost the page align for the calls to dma_make_coherent and
      srmmu_unmapiorange. The latter cannot handle a non page aligned len
      argument.
      
      Signed-off-by: default avatarAndreas Larsson <andreas@gaisler.com>
      Reviewed-by: default avatarSam Ravnborg <sam@ravnborg.org>
      Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      9d779882
    • Anton Eidelman's avatar
      nvme-multipath: fix ANA state updates when a namespace is not present · ec49f3f7
      Anton Eidelman authored
      [ Upstream commit 79f528af
      
       ]
      
      nvme_update_ana_state() has a deficiency that results in a failure to
      properly update the ana state for a namespace in the following case:
      
        NSIDs in ctrl->namespaces:	1, 3,    4
        NSIDs in desc->nsids:		1, 2, 3, 4
      
      Loop iteration 0:
          ns index = 0, n = 0, ns->head->ns_id = 1, nsid = 1, MATCH.
      Loop iteration 1:
          ns index = 1, n = 1, ns->head->ns_id = 3, nsid = 2, NO MATCH.
      Loop iteration 2:
          ns index = 2, n = 2, ns->head->ns_id = 4, nsid = 4, MATCH.
      
      Where the update to the ANA state of NSID 3 is missed.  To fix this
      increment n and retry the update with the same ns when ns->head->ns_id is
      higher than nsid,
      
      Signed-off-by: default avatarAnton Eidelman <anton@lightbitslabs.com>
      Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
      Reviewed-by: default avatarSagi Grimberg <sagi@grimberg.me>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      ec49f3f7
    • Juergen Gross's avatar
      xen/balloon: use a kernel thread instead a workqueue · 29917bbb
      Juergen Gross authored
      [ Upstream commit 8480ed9c
      
       ]
      
      Today the Xen ballooning is done via delayed work in a workqueue. This
      might result in workqueue hangups being reported in case of large
      amounts of memory are being ballooned in one go (here 16GB):
      
      BUG: workqueue lockup - pool cpus=6 node=0 flags=0x0 nice=0 stuck for 64s!
      Showing busy workqueues and worker pools:
      workqueue events: flags=0x0
        pwq 12: cpus=6 node=0 flags=0x0 nice=0 active=2/256 refcnt=3
          in-flight: 229:balloon_process
          pending: cache_reap
      workqueue events_freezable_power_: flags=0x84
        pwq 12: cpus=6 node=0 flags=0x0 nice=0 active=1/256 refcnt=2
          pending: disk_events_workfn
      workqueue mm_percpu_wq: flags=0x8
        pwq 12: cpus=6 node=0 flags=0x0 nice=0 active=1/256 refcnt=2
          pending: vmstat_update
      pool 12: cpus=6 node=0 flags=0x0 nice=0 hung=64s workers=3 idle: 2222 43
      
      This can easily be avoided by using a dedicated kernel thread for doing
      the ballooning work.
      
      Reported-by: default avatarJan Beulich <jbeulich@suse.com>
      Signed-off-by: default avatarJuergen Gross <jgross@suse.com>
      Reviewed-by: default avatarBoris Ostrovsky <boris.ostrovsky@oracle.com>
      Link: https://lore.kernel.org/r/20210827123206.15429-1-jgross@suse.com
      Signed-off-by: default avatarJuergen Gross <jgross@suse.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      29917bbb
    • Bixuan Cui's avatar
      bpf: Add oversize check before call kvcalloc() · 93937596
      Bixuan Cui authored
      [ Upstream commit 0e6491b5 ]
      
      Commit 7661809d
      
       ("mm: don't allow oversized kvmalloc() calls") add the
      oversize check. When the allocation is larger than what kmalloc() supports,
      the following warning triggered:
      
      WARNING: CPU: 0 PID: 8408 at mm/util.c:597 kvmalloc_node+0x108/0x110 mm/util.c:597
      Modules linked in:
      CPU: 0 PID: 8408 Comm: syz-executor221 Not tainted 5.14.0-syzkaller #0
      Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
      RIP: 0010:kvmalloc_node+0x108/0x110 mm/util.c:597
      Call Trace:
       kvmalloc include/linux/mm.h:806 [inline]
       kvmalloc_array include/linux/mm.h:824 [inline]
       kvcalloc include/linux/mm.h:829 [inline]
       check_btf_line kernel/bpf/verifier.c:9925 [inline]
       check_btf_info kernel/bpf/verifier.c:10049 [inline]
       bpf_check+0xd634/0x150d0 kernel/bpf/verifier.c:13759
       bpf_prog_load kernel/bpf/syscall.c:2301 [inline]
       __sys_bpf+0x11181/0x126e0 kernel/bpf/syscall.c:4587
       __do_sys_bpf kernel/bpf/syscall.c:4691 [inline]
       __se_sys_bpf kernel/bpf/syscall.c:4689 [inline]
       __x64_sys_bpf+0x78/0x90 kernel/bpf/syscall.c:4689
       do_syscall_x64 arch/x86/entry/common.c:50 [inline]
       do_syscall_64+0x3d/0xb0 arch/x86/entry/common.c:80
       entry_SYSCALL_64_after_hwframe+0x44/0xae
      
      Reported-by: default avatar <syzbot+f3e749d4c662818ae439@syzkaller.appspotmail.com>
      Signed-off-by: default avatarBixuan Cui <cuibixuan@huawei.com>
      Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
      Acked-by: default avatarYonghong Song <yhs@fb.com>
      Link: https://lore.kernel.org/bpf/20210911005557.45518-1-cuibixuan@huawei.com
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      93937596
    • zhang kai's avatar
      ipv6: delay fib6_sernum increase in fib6_add · 7273cb18
      zhang kai authored
      [ Upstream commit e87b5052
      
       ]
      
      only increase fib6_sernum in net namespace after add fib6_info
      successfully.
      
      Signed-off-by: default avatarzhang kai <zhangkaiheb@126.com>
      Reviewed-by: default avatarDavid Ahern <dsahern@kernel.org>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      7273cb18
    • Guenter Roeck's avatar
      m68k: Double cast io functions to unsigned long · 7432ecc5
      Guenter Roeck authored
      [ Upstream commit b1a89856
      
       ]
      
      m68k builds fail widely with errors such as
      
      arch/m68k/include/asm/raw_io.h:20:19: error:
      	cast to pointer from integer of different size
      arch/m68k/include/asm/raw_io.h:30:32: error:
      	cast to pointer from integer of different size [-Werror=int-to-p
      
      On m68k, io functions are defined as macros. The problem is seen if the
      macro parameter variable size differs from the size of a pointer. Cast
      the parameter of all io macros to unsigned long before casting it to
      a pointer to fix the problem.
      
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      Link: https://lore.kernel.org/r/20210907060729.2391992-1-linux@roeck-us.net
      Signed-off-by: default avatarGeert Uytterhoeven <geert@linux-m68k.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      7432ecc5