Skip to content
  1. Mar 11, 2023
    • Xin Long's avatar
      sctp: add a refcnt in sctp_stream_priorities to avoid a nested loop · cec32644
      Xin Long authored
      [ Upstream commit 68ba4463 ]
      
      With this refcnt added in sctp_stream_priorities, we don't need to
      traverse all streams to check if the prio is used by other streams
      when freeing one stream's prio in sctp_sched_prio_free_sid(). This
      can avoid a nested loop (up to 65535 * 65535), which may cause a
      stuck as Ying reported:
      
          watchdog: BUG: soft lockup - CPU#23 stuck for 26s! [ksoftirqd/23:136]
          Call Trace:
           <TASK>
           sctp_sched_prio_free_sid+0xab/0x100 [sctp]
           sctp_stream_free_ext+0x64/0xa0 [sctp]
           sctp_stream_free+0x31/0x50 [sctp]
           sctp_association_free+0xa5/0x200 [sctp]
      
      Note that it doesn't need to use refcount_t type for this counter,
      as its accessing is always protected under the sock lock.
      
      v1->v2:
       - add a check in sctp_sched_prio_set to avoid the possible prio_head
         refcnt overflow.
      
      Fixes: 9ed7bfc7
      
       ("sctp: fix memory leak in sctp_stream_outq_migrate()")
      Reported-by: default avatarYing Xu <yinxu@redhat.com>
      Acked-by: default avatarMarcelo Ricardo Leitner <marcelo.leitner@gmail.com>
      Signed-off-by: default avatarXin Long <lucien.xin@gmail.com>
      Link: https://lore.kernel.org/r/825eb0c905cb864991eba335f4a2b780e543f06b.1677085641.git.lucien.xin@gmail.com
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      cec32644
    • Lu Wei's avatar
      ipv6: Add lwtunnel encap size of all siblings in nexthop calculation · aba298b3
      Lu Wei authored
      [ Upstream commit 4cc59f38 ]
      
      In function rt6_nlmsg_size(), the length of nexthop is calculated
      by multipling the nexthop length of fib6_info and the number of
      siblings. However if the fib6_info has no lwtunnel but the siblings
      have lwtunnels, the nexthop length is less than it should be, and
      it will trigger a warning in inet6_rt_notify() as follows:
      
      WARNING: CPU: 0 PID: 6082 at net/ipv6/route.c:6180 inet6_rt_notify+0x120/0x130
      ......
      Call Trace:
       <TASK>
       fib6_add_rt2node+0x685/0xa30
       fib6_add+0x96/0x1b0
       ip6_route_add+0x50/0xd0
       inet6_rtm_newroute+0x97/0xa0
       rtnetlink_rcv_msg+0x156/0x3d0
       netlink_rcv_skb+0x5a/0x110
       netlink_unicast+0x246/0x350
       netlink_sendmsg+0x250/0x4c0
       sock_sendmsg+0x66/0x70
       ___sys_sendmsg+0x7c/0xd0
       __sys_sendmsg+0x5d/0xb0
       do_syscall_64+0x3f/0x90
       entry_SYSCALL_64_after_hwframe+0x72/0xdc
      
      This bug can be reproduced by script:
      
      ip -6 addr add 2002::2/64 dev ens2
      ip -6 route add 100::/64 via 2002::1 dev ens2 metric 100
      
      for i in 10 20 30 40 50 60 70;
      do
      	ip link add link ens2 name ipv_$i type ipvlan
      	ip -6 addr add 2002::$i/64 dev ipv_$i
      	ifconfig ipv_$i up
      done
      
      for i in 10 20 30 40 50 60;
      do
      	ip -6 route append 100::/64 encap ip6 dst 2002::$i via 2002::1
      dev ipv_$i metric 100
      done
      
      ip -6 route append 100::/64 via 2002::1 dev ipv_70 metric 100
      
      This patch fixes it by adding nexthop_len of every siblings using
      rt6_nh_nlmsg_size().
      
      Fixes: beb1afac
      
       ("net: ipv6: Add support to dump multipath routes via RTA_MULTIPATH attribute")
      Signed-off-by: default avatarLu Wei <luwei32@huawei.com>
      Reviewed-by: default avatarDavid Ahern <dsahern@kernel.org>
      Link: https://lore.kernel.org/r/20230222083629.335683-2-luwei32@huawei.com
      Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      aba298b3
    • Hangyu Hua's avatar
      netfilter: ctnetlink: fix possible refcount leak in ctnetlink_create_conntrack() · 5d0d3880
      Hangyu Hua authored
      [ Upstream commit ac489398 ]
      
      nf_ct_put() needs to be called to put the refcount got by
      nf_conntrack_find_get() to avoid refcount leak when
      nf_conntrack_hash_check_insert() fails.
      
      Fixes: 7d367e06
      
       ("netfilter: ctnetlink: fix soft lockup when netlink adds new entries (v2)")
      Signed-off-by: default avatarHangyu Hua <hbh25y@gmail.com>
      Acked-by: default avatarFlorian Westphal <fw@strlen.de>
      Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      5d0d3880
    • Li Hua's avatar
      watchdog: pcwd_usb: Fix attempting to access uninitialized memory · fe65d6f2
      Li Hua authored
      [ Upstream commit 7d06c07c ]
      
      The stack variable msb and lsb may be used uninitialized in function
      usb_pcwd_get_temperature and usb_pcwd_get_timeleft when usb card no response.
      
      The build waring is:
      drivers/watchdog/pcwd_usb.c:336:22: error: ‘lsb’ is used uninitialized in this function [-Werror=uninitialized]
        *temperature = (lsb * 9 / 5) + 32;
                        ~~~~^~~
      drivers/watchdog/pcwd_usb.c:328:21: note: ‘lsb’ was declared here
        unsigned char msb, lsb;
                           ^~~
      cc1: all warnings being treated as errors
      scripts/Makefile.build:250: recipe for target 'drivers/watchdog/pcwd_usb.o' failed
      make[3]: *** [drivers/watchdog/pcwd_usb.o] Error 1
      
      Fixes: b7e04f8c
      
       ("mv watchdog tree under drivers")
      Signed-off-by: default avatarLi Hua <hucool.lihua@huawei.com>
      Reviewed-by: default avatarGuenter Roeck <linux@roeck-us.net>
      Link: https://lore.kernel.org/r/20221116020706.70847-1-hucool.lihua@huawei.com
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      Signed-off-by: default avatarWim Van Sebroeck <wim@linux-watchdog.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      fe65d6f2
    • Chen Jun's avatar
      watchdog: Fix kmemleak in watchdog_cdev_register · 59e391b3
      Chen Jun authored
      [ Upstream commit 13721a2a ]
      
      kmemleak reports memory leaks in watchdog_dev_register, as follows:
      unreferenced object 0xffff888116233000 (size 2048):
        comm ""modprobe"", pid 28147, jiffies 4353426116 (age 61.741s)
        hex dump (first 32 bytes):
          80 fa b9 05 81 88 ff ff 08 30 23 16 81 88 ff ff  .........0#.....
          08 30 23 16 81 88 ff ff 00 00 00 00 00 00 00 00  .0#.............
        backtrace:
          [<000000007f001ffd>] __kmem_cache_alloc_node+0x157/0x220
          [<000000006a389304>] kmalloc_trace+0x21/0x110
          [<000000008d640eea>] watchdog_dev_register+0x4e/0x780 [watchdog]
          [<0000000053c9f248>] __watchdog_register_device+0x4f0/0x680 [watchdog]
          [<00000000b2979824>] watchdog_register_device+0xd2/0x110 [watchdog]
          [<000000001f730178>] 0xffffffffc10880ae
          [<000000007a1a8bcc>] do_one_initcall+0xcb/0x4d0
          [<00000000b98be325>] do_init_module+0x1ca/0x5f0
          [<0000000046d08e7c>] load_module+0x6133/0x70f0
          ...
      
      unreferenced object 0xffff888105b9fa80 (size 16):
        comm ""modprobe"", pid 28147, jiffies 4353426116 (age 61.741s)
        hex dump (first 16 bytes):
          77 61 74 63 68 64 6f 67 31 00 b9 05 81 88 ff ff  watchdog1.......
        backtrace:
          [<000000007f001ffd>] __kmem_cache_alloc_node+0x157/0x220
          [<00000000486ab89b>] __kmalloc_node_track_caller+0x44/0x1b0
          [<000000005a39aab0>] kvasprintf+0xb5/0x140
          [<0000000024806f85>] kvasprintf_const+0x55/0x180
          [<000000009276cb7f>] kobject_set_name_vargs+0x56/0x150
          [<00000000a92e820b>] dev_set_name+0xab/0xe0
          [<00000000cec812c6>] watchdog_dev_register+0x285/0x780 [watchdog]
          [<0000000053c9f248>] __watchdog_register_device+0x4f0/0x680 [watchdog]
          [<00000000b2979824>] watchdog_register_device+0xd2/0x110 [watchdog]
          [<000000001f730178>] 0xffffffffc10880ae
          [<000000007a1a8bcc>] do_one_initcall+0xcb/0x4d0
          [<00000000b98be325>] do_init_module+0x1ca/0x5f0
          [<0000000046d08e7c>] load_module+0x6133/0x70f0
          ...
      
      The reason is that put_device is not be called if cdev_device_add fails
      and wdd->id != 0.
      
      watchdog_cdev_register
        wd_data = kzalloc                             [1]
        err = dev_set_name                            [2]
        ..
        err = cdev_device_add
        if (err) {
          if (wdd->id == 0) {  // wdd->id != 0
            ..
          }
          return err;  // [1],[2] would be leaked
      
      To fix it, call put_device in all wdd->id cases.
      
      Fixes: 72139dfa
      
       ("watchdog: Fix the race between the release of watchdog_core_data and cdev")
      Signed-off-by: default avatarChen Jun <chenjun102@huawei.com>
      Reviewed-by: default avatarGuenter Roeck <linux@roeck-us.net>
      Link: https://lore.kernel.org/r/20221116012714.102066-1-chenjun102@huawei.com
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      Signed-off-by: default avatarWim Van Sebroeck <wim@linux-watchdog.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      59e391b3
    • ruanjinjie's avatar
      watchdog: at91sam9_wdt: use devm_request_irq to avoid missing free_irq() in error path · 7c428fc9
      ruanjinjie authored
      [ Upstream commit 07bec0e0 ]
      
      free_irq() is missing in case of error in at91_wdt_init(), use
      devm_request_irq to fix that.
      
      Fixes: 5161b31d
      
       ("watchdog: at91sam9_wdt: better watchdog support")
      Signed-off-by: default avatarruanjinjie <ruanjinjie@huawei.com>
      Reviewed-by: default avatarGuenter Roeck <linux@roeck-us.net>
      Link: https://lore.kernel.org/r/20221116094950.3141943-1-ruanjinjie@huawei.com
      [groeck: Adjust multi-line alignment]
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      Signed-off-by: default avatarWim Van Sebroeck <wim@linux-watchdog.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      7c428fc9
    • Ammar Faizi's avatar
      x86: um: vdso: Add '%rcx' and '%r11' to the syscall clobber list · a8816afc
      Ammar Faizi authored
      [ Upstream commit 5541992e ]
      
      The 'syscall' instruction clobbers '%rcx' and '%r11', but they are not
      listed in the inline Assembly that performs the syscall instruction.
      
      No real bug is found. It wasn't buggy by luck because '%rcx' and '%r11'
      are caller-saved registers, and not used in the functions, and the
      functions are never inlined.
      
      Add them to the clobber list for code correctness.
      
      Fixes: f1c2bb8b
      
       ("um: implement a x86_64 vDSO")
      Signed-off-by: default avatarAmmar Faizi <ammarfaizi2@gnuweeb.org>
      Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      a8816afc
    • Zhihao Cheng's avatar
      ubi: ubi_wl_put_peb: Fix infinite loop when wear-leveling work failed · b5be23f6
      Zhihao Cheng authored
      [ Upstream commit 4d57a733 ]
      
      Following process will trigger an infinite loop in ubi_wl_put_peb():
      
      	ubifs_bgt		ubi_bgt
      ubifs_leb_unmap
        ubi_leb_unmap
          ubi_eba_unmap_leb
            ubi_wl_put_peb	wear_leveling_worker
                                e1 = rb_entry(rb_first(&ubi->used)
      			  e2 = get_peb_for_wl(ubi)
      			  ubi_io_read_vid_hdr  // return err (flash fault)
      			  out_error:
      			    ubi->move_from = ubi->move_to = NULL
      			    wl_entry_destroy(ubi, e1)
      			      ubi->lookuptbl[e->pnum] = NULL
            retry:
              e = ubi->lookuptbl[pnum];	// return NULL
      	if (e == ubi->move_from) {	// NULL == NULL gets true
      	  goto retry;			// infinite loop !!!
      
      $ top
        PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     COMMAND
        7676 root     20   0       0      0      0 R 100.0  0.0  ubifs_bgt0_0
      
      Fix it by:
       1) Letting ubi_wl_put_peb() returns directly if wearl leveling entry has
          been removed from 'ubi->lookuptbl'.
       2) Using 'ubi->wl_lock' protecting wl entry deletion to preventing an
          use-after-free problem for wl entry in ubi_wl_put_peb().
      
      Fetch a reproducer in [Link].
      
      Fixes: 43f9b25a ("UBI: bugfix: protect from volume removal")
      Fixes: ee59ba8b
      
       ("UBI: Fix stale pointers in ubi->lookuptbl")
      Link: https://bugzilla.kernel.org/show_bug.cgi?id=216111
      Signed-off-by: default avatarZhihao Cheng <chengzhihao1@huawei.com>
      Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      b5be23f6
    • Zhihao Cheng's avatar
      ubi: Fix UAF wear-leveling entry in eraseblk_count_seq_show() · 1cb14c06
      Zhihao Cheng authored
      [ Upstream commit a240bc5c ]
      
      Wear-leveling entry could be freed in error path, which may be accessed
      again in eraseblk_count_seq_show(), for example:
      
      __erase_worker                eraseblk_count_seq_show
                                      wl = ubi->lookuptbl[*block_number]
      				if (wl)
        wl_entry_destroy
          ubi->lookuptbl[e->pnum] = NULL
          kmem_cache_free(ubi_wl_entry_slab, e)
      		                   erase_count = wl->ec  // UAF!
      
      Wear-leveling entry updating/accessing in ubi->lookuptbl should be
      protected by ubi->wl_lock, fix it by adding ubi->wl_lock to serialize
      wl entry accessing between wl_entry_destroy() and
      eraseblk_count_seq_show().
      
      Fetch a reproducer in [Link].
      
      Link: https://bugzilla.kernel.org/show_bug.cgi?id=216305
      Fixes: 7bccd12d ("ubi: Add debugfs file for tracking PEB state")
      Fixes: 801c135c
      
       ("UBI: Unsorted Block Images")
      Signed-off-by: default avatarZhihao Cheng <chengzhihao1@huawei.com>
      Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      1cb14c06
    • Zhihao Cheng's avatar
      ubifs: ubifs_writepage: Mark page dirty after writing inode failed · 7fcbc41d
      Zhihao Cheng authored
      [ Upstream commit fb8bc4c7 ]
      
      There are two states for ubifs writing pages:
      1. Dirty, Private
      2. Not Dirty, Not Private
      
      There is a third possibility which maybe related to [1] that page is
      private but not dirty caused by following process:
      
                PA
      lock(page)
      ubifs_write_end
        attach_page_private		// set Private
          __set_page_dirty_nobuffers	// set Dirty
      unlock(page)
      
      write_cache_pages
        lock(page)
        clear_page_dirty_for_io(page)	// clear Dirty
        ubifs_writepage
          write_inode
          // fail, goto out, following codes are not executed
          // do_writepage
          //   set_page_writeback 	// set Writeback
          //   detach_page_private	// clear Private
          //   end_page_writeback 	// clear Writeback
          out:
          unlock(page)		// Private, Not Dirty
      
                                             PB
      				ksys_fadvise64_64
      				  generic_fadvise
      				     invalidate_inode_page
      				     // page is neither Dirty nor Writeback
      				       invalidate_complete_page
      				       // page_has_private is true
      					 try_to_release_page
      					   ubifs_releasepage
      					     ubifs_assert(c, 0) !!!
      
      Then we may get following assertion failed:
        UBIFS error (ubi0:0 pid 1492): ubifs_assert_failed [ubifs]:
        UBIFS assert failed: 0, in fs/ubifs/file.c:1499
        UBIFS warning (ubi0:0 pid 1492): ubifs_ro_mode [ubifs]:
        switched to read-only mode, error -22
        CPU: 2 PID: 1492 Comm: aa Not tainted 5.16.0-rc2-00012-g7bb767dee0ba-dirty
        Call Trace:
          dump_stack+0x13/0x1b
          ubifs_ro_mode+0x54/0x60 [ubifs]
          ubifs_assert_failed+0x4b/0x80 [ubifs]
          ubifs_releasepage+0x7e/0x1e0 [ubifs]
          try_to_release_page+0x57/0xe0
          invalidate_inode_page+0xfb/0x130
          invalidate_mapping_pagevec+0x12/0x20
          generic_fadvise+0x303/0x3c0
          vfs_fadvise+0x35/0x40
          ksys_fadvise64_64+0x4c/0xb0
      
      Jump [2] to find a reproducer.
      
      [1] https://linux-mtd.infradead.narkive.com/NQoBeT1u/patch-rfc-ubifs-fix-assert-failed-in-ubifs-set-page-dirty
      [2] https://bugzilla.kernel.org/show_bug.cgi?id=215357
      
      Fixes: 1e51764a
      
       ("UBIFS: add new flash file system")
      Signed-off-by: default avatarZhihao Cheng <chengzhihao1@huawei.com>
      Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      7fcbc41d
    • Zhihao Cheng's avatar
      ubifs: dirty_cow_znode: Fix memleak in error handling path · 510b80ab
      Zhihao Cheng authored
      [ Upstream commit 122deabf ]
      
      Following process will cause a memleak for copied up znode:
      
      dirty_cow_znode
        zn = copy_znode(c, znode);
        err = insert_old_idx(c, zbr->lnum, zbr->offs);
        if (unlikely(err))
           return ERR_PTR(err);   // No one refers to zn.
      
      Fix it by adding copied znode back to tnc, then it will be freed
      by ubifs_destroy_tnc_subtree() while closing tnc.
      
      Fetch a reproducer in [Link].
      
      Link: https://bugzilla.kernel.org/show_bug.cgi?id=216705
      Fixes: 1e51764a
      
       ("UBIFS: add new flash file system")
      Signed-off-by: default avatarZhihao Cheng <chengzhihao1@huawei.com>
      Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      510b80ab
    • Zhihao Cheng's avatar
      ubifs: Re-statistic cleaned znode count if commit failed · 0875edca
      Zhihao Cheng authored
      [ Upstream commit 944e096a ]
      
      Dirty znodes will be written on flash in committing process with
      following states:
      
      	      process A			|  znode state
      ------------------------------------------------------
      do_commit				| DIRTY_ZNODE
        ubifs_tnc_start_commit		| DIRTY_ZNODE
         get_znodes_to_commit			| DIRTY_ZNODE | COW_ZNODE
          layout_commit			| DIRTY_ZNODE | COW_ZNODE
           fill_gap                           | 0
        write master				| 0 or OBSOLETE_ZNODE
      
      	      process B			|  znode state
      ------------------------------------------------------
      do_commit				| DIRTY_ZNODE[1]
        ubifs_tnc_start_commit		| DIRTY_ZNODE
         get_znodes_to_commit			| DIRTY_ZNODE | COW_ZNODE
        ubifs_tnc_end_commit			| DIRTY_ZNODE | COW_ZNODE
         write_index                          | 0
        write master				| 0 or OBSOLETE_ZNODE[2] or
      					| DIRTY_ZNODE[3]
      
      [1] znode is dirtied without concurrent committing process
      [2] znode is copied up (re-dirtied by other process) before cleaned
          up in committing process
      [3] znode is re-dirtied after cleaned up in committing process
      
      Currently, the clean znode count is updated in free_obsolete_znodes(),
      which is called only in normal path. If do_commit failed, clean znode
      count won't be updated, which triggers a failure ubifs assertion[4] in
      ubifs_tnc_close():
       ubifs_assert_failed [ubifs]: UBIFS assert failed: freed == n
      
      [4] Commit 380347e9 ("UBIFS: Add an assertion for clean_zn_cnt").
      
      Fix it by re-statisticing cleaned znode count in tnc_destroy_cnext().
      
      Fetch a reproducer in [Link].
      
      Link: https://bugzilla.kernel.org/show_bug.cgi?id=216704
      Fixes: 1e51764a
      
       ("UBIFS: add new flash file system")
      Signed-off-by: default avatarZhihao Cheng <chengzhihao1@huawei.com>
      Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      0875edca
    • Yang Yingliang's avatar
      ubi: Fix possible null-ptr-deref in ubi_free_volume() · 234c53e5
      Yang Yingliang authored
      [ Upstream commit c15859bf ]
      
      It willl cause null-ptr-deref in the following case:
      
      uif_init()
        ubi_add_volume()
          cdev_add() -> if it fails, call kill_volumes()
          device_register()
      
      kill_volumes() -> if ubi_add_volume() fails call this function
        ubi_free_volume()
          cdev_del()
          device_unregister() -> trying to delete a not added device,
      			   it causes null-ptr-deref
      
      So in ubi_free_volume(), it delete devices whether they are added
      or not, it will causes null-ptr-deref.
      
      Handle the error case whlie calling ubi_add_volume() to fix this
      problem. If add volume fails, set the corresponding vol to null,
      so it can not be accessed in kill_volumes() and release the
      resource in ubi_add_volume() error path.
      
      Fixes: 801c135c
      
       ("UBI: Unsorted Block Images")
      Suggested-by: default avatarZhihao Cheng <chengzhihao1@huawei.com>
      Signed-off-by: default avatarYang Yingliang <yangyingliang@huawei.com>
      Reviewed-by: default avatarZhihao Cheng <chengzhihao1@huawei.com>
      Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      234c53e5
    • Li Zetao's avatar
      ubifs: Fix memory leak in alloc_wbufs() · 1f206002
      Li Zetao authored
      [ Upstream commit 4a1ff3c5 ]
      
      kmemleak reported a sequence of memory leaks, and show them as following:
      
        unreferenced object 0xffff8881575f8400 (size 1024):
          comm "mount", pid 19625, jiffies 4297119604 (age 20.383s)
          hex dump (first 32 bytes):
            00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
            00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
          backtrace:
            [<ffffffff8176cecd>] __kmalloc+0x4d/0x150
            [<ffffffffa0406b2b>] ubifs_mount+0x307b/0x7170 [ubifs]
            [<ffffffff819fa8fd>] legacy_get_tree+0xed/0x1d0
            [<ffffffff81936f2d>] vfs_get_tree+0x7d/0x230
            [<ffffffff819b2bd4>] path_mount+0xdd4/0x17b0
            [<ffffffff819b37aa>] __x64_sys_mount+0x1fa/0x270
            [<ffffffff83c14295>] do_syscall_64+0x35/0x80
            [<ffffffff83e0006a>] entry_SYSCALL_64_after_hwframe+0x46/0xb0
      
        unreferenced object 0xffff8881798a6e00 (size 512):
          comm "mount", pid 19677, jiffies 4297121912 (age 37.816s)
          hex dump (first 32 bytes):
            6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b  kkkkkkkkkkkkkkkk
            6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b  kkkkkkkkkkkkkkkk
          backtrace:
            [<ffffffff8176cecd>] __kmalloc+0x4d/0x150
            [<ffffffffa0418342>] ubifs_wbuf_init+0x52/0x480 [ubifs]
            [<ffffffffa0406ca5>] ubifs_mount+0x31f5/0x7170 [ubifs]
            [<ffffffff819fa8fd>] legacy_get_tree+0xed/0x1d0
            [<ffffffff81936f2d>] vfs_get_tree+0x7d/0x230
            [<ffffffff819b2bd4>] path_mount+0xdd4/0x17b0
            [<ffffffff819b37aa>] __x64_sys_mount+0x1fa/0x270
            [<ffffffff83c14295>] do_syscall_64+0x35/0x80
            [<ffffffff83e0006a>] entry_SYSCALL_64_after_hwframe+0x46/0xb0
      
      The problem is that the ubifs_wbuf_init() returns an error in the
      loop which in the alloc_wbufs(), then the wbuf->buf and wbuf->inodes
      that were successfully alloced before are not freed.
      
      Fix it by adding error hanging path in alloc_wbufs() which frees
      the memory alloced before when ubifs_wbuf_init() returns an error.
      
      Fixes: 1e51764a
      
       ("UBIFS: add new flash file system")
      Signed-off-by: default avatarLi Zetao <lizetao1@huawei.com>
      Reviewed-by: default avatarZhihao Cheng <chengzhihao1@huawei.com>
      Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      1f206002
    • Li Zetao's avatar
      ubi: Fix unreferenced object reported by kmemleak in ubi_resize_volume() · 07b60f74
      Li Zetao authored
      [ Upstream commit 1e591ea0 ]
      
      There is a memory leaks problem reported by kmemleak:
      
      unreferenced object 0xffff888102007a00 (size 128):
        comm "ubirsvol", pid 32090, jiffies 4298464136 (age 2361.231s)
        hex dump (first 32 bytes):
      ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff  ................
      ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff  ................
        backtrace:
      [<ffffffff8176cecd>] __kmalloc+0x4d/0x150
      [<ffffffffa02a9a36>] ubi_eba_create_table+0x76/0x170 [ubi]
      [<ffffffffa029764e>] ubi_resize_volume+0x1be/0xbc0 [ubi]
      [<ffffffffa02a3321>] ubi_cdev_ioctl+0x701/0x1850 [ubi]
      [<ffffffff81975d2d>] __x64_sys_ioctl+0x11d/0x170
      [<ffffffff83c142a5>] do_syscall_64+0x35/0x80
      [<ffffffff83e0006a>] entry_SYSCALL_64_after_hwframe+0x46/0xb0
      
      This is due to a mismatch between create and destroy interfaces, and
      in detail that "new_eba_tbl" created by ubi_eba_create_table() but
      destroyed by kfree(), while will causing "new_eba_tbl->entries" not
      freed.
      
      Fix it by replacing kfree(new_eba_tbl) with
      ubi_eba_destroy_table(new_eba_tbl)
      
      Fixes: 799dca34
      
       ("UBI: hide EBA internals")
      Signed-off-by: default avatarLi Zetao <lizetao1@huawei.com>
      Reviewed-by: default avatarZhihao Cheng <chengzhihao1@huawei.com>
      Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      07b60f74
    • Li Zetao's avatar
      ubi: Fix use-after-free when volume resizing failed · 9c8be1f1
      Li Zetao authored
      [ Upstream commit 9af31d6e ]
      
      There is an use-after-free problem reported by KASAN:
        ==================================================================
        BUG: KASAN: use-after-free in ubi_eba_copy_table+0x11f/0x1c0 [ubi]
        Read of size 8 at addr ffff888101eec008 by task ubirsvol/4735
      
        CPU: 2 PID: 4735 Comm: ubirsvol
        Not tainted 6.1.0-rc1-00003-g84fa3304a7fc-dirty #14
        Hardware name: QEMU Standard PC (i440FX + PIIX, 1996),
        BIOS 1.14.0-1.fc33 04/01/2014
        Call Trace:
         <TASK>
         dump_stack_lvl+0x34/0x44
         print_report+0x171/0x472
         kasan_report+0xad/0x130
         ubi_eba_copy_table+0x11f/0x1c0 [ubi]
         ubi_resize_volume+0x4f9/0xbc0 [ubi]
         ubi_cdev_ioctl+0x701/0x1850 [ubi]
         __x64_sys_ioctl+0x11d/0x170
         do_syscall_64+0x35/0x80
         entry_SYSCALL_64_after_hwframe+0x46/0xb0
         </TASK>
      
      When ubi_change_vtbl_record() returns an error in ubi_resize_volume(),
      "new_eba_tbl" will be freed on error handing path, but it is holded
      by "vol->eba_tbl" in ubi_eba_replace_table(). It means that the liftcycle
      of "vol->eba_tbl" and "vol" are different, so when resizing volume in
      next time, it causing an use-after-free fault.
      
      Fix it by not freeing "new_eba_tbl" after it replaced in
      ubi_eba_replace_table(), while will be freed in next volume resizing.
      
      Fixes: 801c135c
      
       ("UBI: Unsorted Block Images")
      Signed-off-by: default avatarLi Zetao <lizetao1@huawei.com>
      Reviewed-by: default avatarZhihao Cheng <chengzhihao1@huawei.com>
      Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      9c8be1f1
    • Zhihao Cheng's avatar
      ubifs: Reserve one leb for each journal head while doing budget · e86d1b2b
      Zhihao Cheng authored
      [ Upstream commit e874dcde ]
      
      UBIFS calculates available space by c->main_bytes - c->lst.total_used
      (which means non-index lebs' free and dirty space is accounted into
      total available), then index lebs and four lebs (one for gc_lnum, one
      for deletions, two for journal heads) are deducted.
      In following situation, ubifs may get -ENOSPC from make_reservation():
       LEB 84: DATAHD   free 122880 used 1920  dirty 2176  dark 6144
       LEB 110:DELETION free 126976 used 0     dirty 0     dark 6144 (empty)
       LEB 201:gc_lnum  free 126976 used 0     dirty 0     dark 6144
       LEB 272:GCHD     free 77824  used 47672 dirty 1480  dark 6144
       LEB 356:BASEHD   free 0      used 39776 dirty 87200 dark 6144
       OTHERS: index lebs, zero-available non-index lebs
      
      UBIFS calculates the available bytes is 6888 (How to calculate it:
      126976 * 5[remain main bytes] - 1920[used] - 47672[used] - 39776[used] -
      126976 * 1[deletions] - 126976 * 1[gc_lnum] - 126976 * 2[journal heads]
      - 6144 * 5[dark] = 6888) after doing budget, however UBIFS cannot use
      BASEHD's dirty space(87200), because UBIFS cannot find next BASEHD to
      reclaim current BASEHD. (c->bi.min_idx_lebs equals to c->lst.idx_lebs,
      the empty leb won't be found by ubifs_find_free_space(), and dirty index
      lebs won't be picked as gced lebs. All non-index lebs has dirty space
      less then c->dead_wm, non-index lebs won't be picked as gced lebs
      either. So new free lebs won't be produced.). See more details in Link.
      
      To fix it, reserve one leb for each journal head while doing budget.
      
      Link: https://bugzilla.kernel.org/show_bug.cgi?id=216562
      Fixes: 1e51764a
      
       ("UBIFS: add new flash file system")
      Signed-off-by: default avatarZhihao Cheng <chengzhihao1@huawei.com>
      Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      e86d1b2b
    • Zhihao Cheng's avatar
      ubifs: do_rename: Fix wrong space budget when target inode's nlink > 1 · 82c096d0
      Zhihao Cheng authored
      [ Upstream commit 25fce616 ]
      
      If target inode is a special file (eg. block/char device) with nlink
      count greater than 1, the inode with ui->data will be re-written on
      disk. However, UBIFS losts target inode's data_len while doing space
      budget. Bad space budget may let make_reservation() return with -ENOSPC,
      which could turn ubifs to read-only mode in do_writepage() process.
      
      Fetch a reproducer in [Link].
      
      Link: https://bugzilla.kernel.org/show_bug.cgi?id=216494
      Fixes: 1e51764a
      
       ("UBIFS: add new flash file system")
      Signed-off-by: default avatarZhihao Cheng <chengzhihao1@huawei.com>
      Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      82c096d0
    • Zhihao Cheng's avatar
      ubifs: Fix wrong dirty space budget for dirty inode · bf8f5495
      Zhihao Cheng authored
      [ Upstream commit b248eaf0 ]
      
      Each dirty inode should reserve 'c->bi.inode_budget' bytes in space
      budget calculation. Currently, space budget for dirty inode reports
      more space than what UBIFS actually needs to write.
      
      Fixes: 1e51764a
      
       ("UBIFS: add new flash file system")
      Signed-off-by: default avatarZhihao Cheng <chengzhihao1@huawei.com>
      Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      bf8f5495
    • Zhihao Cheng's avatar
      ubifs: Rectify space budget for ubifs_xrename() · f29168fb
      Zhihao Cheng authored
      [ Upstream commit 1b2ba090 ]
      
      There is no space budget for ubifs_xrename(). It may let
      make_reservation() return with -ENOSPC, which could turn
      ubifs to read-only mode in do_writepage() process.
      Fix it by adding space budget for ubifs_xrename().
      
      Fetch a reproducer in [Link].
      
      Link: https://bugzilla.kernel.org/show_bug.cgi?id=216569
      Fixes: 9ec64962
      
       ("ubifs: Implement RENAME_EXCHANGE")
      Signed-off-by: default avatarZhihao Cheng <chengzhihao1@huawei.com>
      Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      f29168fb
    • Zhihao Cheng's avatar
      ubifs: Rectify space budget for ubifs_symlink() if symlink is encrypted · 86660306
      Zhihao Cheng authored
      [ Upstream commit c2c36cc6 ]
      
      Fix bad space budget when symlink file is encrypted. Bad space budget
      may let make_reservation() return with -ENOSPC, which could turn ubifs
      to read-only mode in do_writepage() process.
      
      Fetch a reproducer in [Link].
      
      Link: https://bugzilla.kernel.org/show_bug.cgi?id=216490
      Fixes: ca7f85be
      
       ("ubifs: Add support for encrypted symlinks")
      Signed-off-by: default avatarZhihao Cheng <chengzhihao1@huawei.com>
      Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      86660306
    • Li Hua's avatar
      ubifs: Fix build errors as symbol undefined · 4ca0d746
      Li Hua authored
      [ Upstream commit aa6d148e ]
      
      With CONFIG_UBIFS_FS_AUTHENTICATION not set, the compiler can assume that
      ubifs_node_check_hash() is never true and drops the call to ubifs_bad_hash().
      Is CONFIG_CC_OPTIMIZE_FOR_SIZE enabled this optimization does not happen anymore.
      
      So When CONFIG_UBIFS_FS and CONFIG_CC_OPTIMIZE_FOR_SIZE is enabled but
      CONFIG_UBIFS_FS_AUTHENTICATION is not set, the build errors is as followd:
          ERROR: modpost: "ubifs_bad_hash" [fs/ubifs/ubifs.ko] undefined!
      
      Fix it by add no-op ubifs_bad_hash() for the CONFIG_UBIFS_FS_AUTHENTICATION=n case.
      
      Fixes: 16a26b20
      
       ("ubifs: authentication: Add hashes to index nodes")
      Signed-off-by: default avatarLi Hua <hucool.lihua@huawei.com>
      Reviewed-by: default avatarSascha Hauer <s.hauer@pengutronix.de>
      Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      4ca0d746
    • George Kennedy's avatar
      ubi: ensure that VID header offset + VID header size <= alloc, size · f7adb740
      George Kennedy authored
      [ Upstream commit 1b42b1a3 ]
      
      Ensure that the VID header offset + VID header size does not exceed
      the allocated area to avoid slab OOB.
      
      BUG: KASAN: slab-out-of-bounds in crc32_body lib/crc32.c:111 [inline]
      BUG: KASAN: slab-out-of-bounds in crc32_le_generic lib/crc32.c:179 [inline]
      BUG: KASAN: slab-out-of-bounds in crc32_le_base+0x58c/0x626 lib/crc32.c:197
      Read of size 4 at addr ffff88802bb36f00 by task syz-executor136/1555
      
      CPU: 2 PID: 1555 Comm: syz-executor136 Tainted: G        W
      6.0.0-1868 #1
      Hardware name: Red Hat KVM, BIOS 1.13.0-2.module+el8.3.0+7860+a7792d29
      04/01/2014
      Call Trace:
        <TASK>
        __dump_stack lib/dump_stack.c:88 [inline]
        dump_stack_lvl+0x85/0xad lib/dump_stack.c:106
        print_address_description mm/kasan/report.c:317 [inline]
        print_report.cold.13+0xb6/0x6bb mm/kasan/report.c:433
        kasan_report+0xa7/0x11b mm/kasan/report.c:495
        crc32_body lib/crc32.c:111 [inline]
        crc32_le_generic lib/crc32.c:179 [inline]
        crc32_le_base+0x58c/0x626 lib/crc32.c:197
        ubi_io_write_vid_hdr+0x1b7/0x472 drivers/mtd/ubi/io.c:1067
        create_vtbl+0x4d5/0x9c4 drivers/mtd/ubi/vtbl.c:317
        create_empty_lvol drivers/mtd/ubi/vtbl.c:500 [inline]
        ubi_read_volume_table+0x67b/0x288a drivers/mtd/ubi/vtbl.c:812
        ubi_attach+0xf34/0x1603 drivers/mtd/ubi/attach.c:1601
        ubi_attach_mtd_dev+0x6f3/0x185e drivers/mtd/ubi/build.c:965
        ctrl_cdev_ioctl+0x2db/0x347 drivers/mtd/ubi/cdev.c:1043
        vfs_ioctl fs/ioctl.c:51 [inline]
        __do_sys_ioctl fs/ioctl.c:870 [inline]
        __se_sys_ioctl fs/ioctl.c:856 [inline]
        __x64_sys_ioctl+0x193/0x213 fs/ioctl.c:856
        do_syscall_x64 arch/x86/entry/common.c:50 [inline]
        do_syscall_64+0x3e/0x86 arch/x86/entry/common.c:80
        entry_SYSCALL_64_after_hwframe+0x63/0x0
      RIP: 0033:0x7f96d5cf753d
      Code:
      RSP: 002b:00007fffd72206f8 EFLAGS: 00000246 ORIG_RAX: 0000000000000010
      RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007f96d5cf753d
      RDX: 0000000020000080 RSI: 0000000040186f40 RDI: 0000000000000003
      RBP: 0000000000400cd0 R08: 0000000000000000 R09: 0000000000000000
      R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000400be0
      R13: 00007fffd72207e0 R14: 0000000000000000 R15: 0000000000000000
        </TASK>
      
      Allocated by task 1555:
        kasan_save_stack+0x20/0x3d mm/kasan/common.c:38
        kasan_set_track mm/kasan/common.c:45 [inline]
        set_alloc_info mm/kasan/common.c:437 [inline]
        ____kasan_kmalloc mm/kasan/common.c:516 [inline]
        __kasan_kmalloc+0x88/0xa3 mm/kasan/common.c:525
        kasan_kmalloc include/linux/kasan.h:234 [inline]
        __kmalloc+0x138/0x257 mm/slub.c:4429
        kmalloc include/linux/slab.h:605 [inline]
        ubi_alloc_vid_buf drivers/mtd/ubi/ubi.h:1093 [inline]
        create_vtbl+0xcc/0x9c4 drivers/mtd/ubi/vtbl.c:295
        create_empty_lvol drivers/mtd/ubi/vtbl.c:500 [inline]
        ubi_read_volume_table+0x67b/0x288a drivers/mtd/ubi/vtbl.c:812
        ubi_attach+0xf34/0x1603 drivers/mtd/ubi/attach.c:1601
        ubi_attach_mtd_dev+0x6f3/0x185e drivers/mtd/ubi/build.c:965
        ctrl_cdev_ioctl+0x2db/0x347 drivers/mtd/ubi/cdev.c:1043
        vfs_ioctl fs/ioctl.c:51 [inline]
        __do_sys_ioctl fs/ioctl.c:870 [inline]
        __se_sys_ioctl fs/ioctl.c:856 [inline]
        __x64_sys_ioctl+0x193/0x213 fs/ioctl.c:856
        do_syscall_x64 arch/x86/entry/common.c:50 [inline]
        do_syscall_64+0x3e/0x86 arch/x86/entry/common.c:80
        entry_SYSCALL_64_after_hwframe+0x63/0x0
      
      The buggy address belongs to the object at ffff88802bb36e00
        which belongs to the cache kmalloc-256 of size 256
      The buggy address is located 0 bytes to the right of
        256-byte region [ffff88802bb36e00, ffff88802bb36f00)
      
      The buggy address belongs to the physical page:
      page:00000000ea4d1263 refcount:1 mapcount:0 mapping:0000000000000000
      index:0x0 pfn:0x2bb36
      head:00000000ea4d1263 order:1 compound_mapcount:0 compound_pincount:0
      flags: 0xfffffc0010200(slab|head|node=0|zone=1|lastcpupid=0x1fffff)
      raw: 000fffffc0010200 ffffea000066c300 dead000000000003 ffff888100042b40
      raw: 0000000000000000 0000000000100010 00000001ffffffff 0000000000000000
      page dumped because: kasan: bad access detected
      
      Memory state around the buggy address:
        ffff88802bb36e00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
        ffff88802bb36e80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
      >ffff88802bb36f00: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
                          ^
        ffff88802bb36f80: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
        ffff88802bb37000: fa fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
      ==================================================================
      
      Fixes: 801c135c
      
       ("UBI: Unsorted Block Images")
      Reported-by: default avatarsyzkaller <syzkaller@googlegroups.com>
      Signed-off-by: default avatarGeorge Kennedy <george.kennedy@oracle.com>
      Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      f7adb740
    • Xiang Yang's avatar
      um: vector: Fix memory leak in vector_config · 6480c3a1
      Xiang Yang authored
      [ Upstream commit 8f88c73a ]
      
      If the return value of the uml_parse_vector_ifspec function is NULL,
      we should call kfree(params) to prevent memory leak.
      
      Fixes: 49da7e64
      
       ("High Performance UML Vector Network Driver")
      Signed-off-by: default avatarXiang Yang <xiangyang3@huawei.com>
      Acked-By: default avatarAnton Ivanov <anton.ivanov@kot-begemot.co.uk>
      Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      6480c3a1
    • Alexander Potapenko's avatar
      fs: f2fs: initialize fsdata in pagecache_write() · 01c92f03
      Alexander Potapenko authored
      [ Upstream commit b1b98967
      
       ]
      
      When aops->write_begin() does not initialize fsdata, KMSAN may report
      an error passing the latter to aops->write_end().
      
      Fix this by unconditionally initializing fsdata.
      
      Suggested-by: default avatarEric Biggers <ebiggers@kernel.org>
      Fixes: 95ae251f
      
       ("f2fs: add fs-verity support")
      Signed-off-by: default avatarAlexander Potapenko <glider@google.com>
      Reviewed-by: default avatarEric Biggers <ebiggers@google.com>
      Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      01c92f03
    • Eric Biggers's avatar
      f2fs: use memcpy_{to,from}_page() where possible · c4a89ebe
      Eric Biggers authored
      [ Upstream commit b87846bd
      
       ]
      
      This is simpler, and as a side effect it replaces several uses of
      kmap_atomic() with its recommended replacement kmap_local_page().
      
      Signed-off-by: default avatarEric Biggers <ebiggers@google.com>
      Reviewed-by: default avatarFabio M. De Francesco <fmdefrancesco@gmail.com>
      Reviewed-by: default avatarChao Yu <chao@kernel.org>
      Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
      Stable-dep-of: b1b98967
      
       ("fs: f2fs: initialize fsdata in pagecache_write()")
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      c4a89ebe
    • Fabrice Gasnier's avatar
      pwm: stm32-lp: fix the check on arr and cmp registers update · b915fac0
      Fabrice Gasnier authored
      [ Upstream commit 3066bc2d ]
      
      The ARR (auto reload register) and CMP (compare) registers are
      successively written. The status bits to check the update of these
      registers are polled together with regmap_read_poll_timeout().
      The condition to end the loop may become true, even if one of the
      register isn't correctly updated.
      So ensure both status bits are set before clearing them.
      
      Fixes: e70a540b
      
       ("pwm: Add STM32 LPTimer PWM driver")
      Signed-off-by: default avatarFabrice Gasnier <fabrice.gasnier@foss.st.com>
      Acked-by: default avatarUwe Kleine-König <u.kleine-koenig@pengutronix.de>
      Signed-off-by: default avatarThierry Reding <thierry.reding@gmail.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      b915fac0
    • Emil Renner Berthing's avatar
      pwm: sifive: Always let the first pwm_apply_state succeed · 1abd3858
      Emil Renner Berthing authored
      [ Upstream commit 334c7b13 ]
      
      Commit 2cfe9bbe added support for the
      RGB and green PWM controlled LEDs on the HiFive Unmatched board
      managed by the leds-pwm-multicolor and leds-pwm drivers respectively.
      All three colours of the RGB LED and the green LED run from different
      lines of the same PWM, but with the same period so this works fine when
      the LED drivers are loaded one after the other.
      
      Unfortunately it does expose a race in the PWM driver when both LED
      drivers are loaded at roughly the same time. Here is an example:
      
        |          Thread A           |          Thread B           |
        |  led_pwm_mc_probe           |  led_pwm_probe              |
        |    devm_fwnode_pwm_get      |                             |
        |      pwm_sifive_request     |                             |
        |        ddata->user_count++  |                             |
        |                             |    devm_fwnode_pwm_get      |
        |                             |      pwm_sifive_request     |
        |                             |        ddata->user_count++  |
        |         ...                 |          ...                |
        |    pwm_state_apply          |    pwm_state_apply          |
        |      pwm_sifive_apply       |      pwm_sifive_apply       |
      
      Now both calls to pwm_sifive_apply will see that ddata->approx_period,
      initially 0, is different from the requested period and the clock needs
      to be updated. But since ddata->user_count >= 2 both calls will fail
      with -EBUSY, which will then cause both LED drivers to fail to probe.
      
      Fix it by letting the first call to pwm_sifive_apply update the clock
      even when ddata->user_count != 1.
      
      Fixes: 9e37a53e
      
       ("pwm: sifive: Add a driver for SiFive SoC PWM")
      Signed-off-by: default avatarEmil Renner Berthing <emil.renner.berthing@canonical.com>
      Signed-off-by: default avatarThierry Reding <thierry.reding@gmail.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      1abd3858
    • Uwe Kleine-König's avatar
      pwm: sifive: Reduce time the controller lock is held · 30a3636f
      Uwe Kleine-König authored
      [ Upstream commit 0f02f491
      
       ]
      
      The lock is only to serialize access and update to user_count and
      approx_period between different PWMs served by the same pwm_chip.
      So the lock needs only to be taken during the check if the (chip global)
      period can and/or needs to be changed.
      
      Signed-off-by: default avatarUwe Kleine-König <u.kleine-koenig@pengutronix.de>
      Tested-by: default avatarEmil Renner Berthing <emil.renner.berthing@canonical.com>
      Signed-off-by: default avatarThierry Reding <thierry.reding@gmail.com>
      Stable-dep-of: 334c7b13
      
       ("pwm: sifive: Always let the first pwm_apply_state succeed")
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      30a3636f
    • Liu Shixin via Jfs-discussion's avatar
      fs/jfs: fix shift exponent db_agl2size negative · 62462a5b
      Liu Shixin via Jfs-discussion authored
      [ Upstream commit fad376fc
      
       ]
      
      As a shift exponent, db_agl2size can not be less than 0. Add the missing
      check to fix the shift-out-of-bounds bug reported by syzkaller:
      
       UBSAN: shift-out-of-bounds in fs/jfs/jfs_dmap.c:2227:15
       shift exponent -744642816 is negative
      
      Reported-by: default avatar <syzbot+0be96567042453c0c820@syzkaller.appspotmail.com>
      Fixes: 1da177e4
      
       ("Linux-2.6.12-rc2")
      Signed-off-by: default avatarLiu Shixin <liushixin2@huawei.com>
      Signed-off-by: default avatarDave Kleikamp <dave.kleikamp@oracle.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      62462a5b
    • Jamal Hadi Salim's avatar
      net/sched: Retire tcindex classifier · 7a6fb69b
      Jamal Hadi Salim authored
      commit 8c710f75
      
       upstream.
      
      The tcindex classifier has served us well for about a quarter of a century
      but has not been getting much TLC due to lack of known users. Most recently
      it has become easy prey to syzkaller. For this reason, we are retiring it.
      
      Signed-off-by: default avatarJamal Hadi Salim <jhs@mojatatu.com>
      Acked-by: default avatarJiri Pirko <jiri@nvidia.com>
      Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      7a6fb69b
    • Dmitry Goncharov's avatar
      kbuild: Port silent mode detection to future gnu make. · b3d346ec
      Dmitry Goncharov authored
      commit 4bf73588
      
       upstream.
      
      Port silent mode detection to the future (post make-4.4) versions of gnu make.
      
      Makefile contains the following piece of make code to detect if option -s is
      specified on the command line.
      
      ifneq ($(findstring s,$(filter-out --%,$(MAKEFLAGS))),)
      
      This code is executed by make at parse time and assumes that MAKEFLAGS
      does not contain command line variable definitions.
      Currently if the user defines a=s on the command line, then at build only
      time MAKEFLAGS contains " -- a=s".
      However, starting with commit dc2d963989b96161472b2cd38cef5d1f4851ea34
      MAKEFLAGS contains command line definitions at both parse time and
      build time.
      
      This '-s' detection code then confuses a command line variable
      definition which contains letter 's' with option -s.
      
      $ # old make
      $ make net/wireless/ocb.o a=s
        CALL    scripts/checksyscalls.sh
        DESCEND objtool
      $ # this a new make which defines makeflags at parse time
      $ ~/src/gmake/make/l64/make net/wireless/ocb.o a=s
      $
      
      We can see here that the letter 's' from 'a=s' was confused with -s.
      
      This patch checks for presence of -s using a method recommended by the
      make manual here
      https://www.gnu.org/software/make/manual/make.html#Testing-Flags.
      
      Link: https://lists.gnu.org/archive/html/bug-make/2022-11/msg00190.html
      Reported-by: default avatarJan Palus <jpalus+gnu@fastmail.com>
      Signed-off-by: default avatarDmitry Goncharov <dgoncharov@users.sf.net>
      Signed-off-by: default avatarMasahiro Yamada <masahiroy@kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      b3d346ec
    • Arnd Bergmann's avatar
      wifi: ath9k: use proper statements in conditionals · 68b0cdcf
      Arnd Bergmann authored
      commit b7dc753f upstream.
      
      A previous cleanup patch accidentally broke some conditional
      expressions by replacing the safe "do {} while (0)" constructs
      with empty macros. gcc points this out when extra warnings
      are enabled:
      
      drivers/net/wireless/ath/ath9k/hif_usb.c: In function 'ath9k_skb_queue_complete':
      drivers/net/wireless/ath/ath9k/hif_usb.c:251:57: error: suggest braces around empty body in an 'else' statement [-Werror=empty-body]
        251 |                         TX_STAT_INC(hif_dev, skb_failed);
      
      Make both sets of macros proper expressions again.
      
      Fixes: d7fc7603
      
       ("ath9k: htc: clean up statistics macros")
      Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
      Acked-by: default avatarToke Høiland-Jørgensen <toke@toke.dk>
      Signed-off-by: default avatarKalle Valo <kvalo@kernel.org>
      Link: https://lore.kernel.org/r/20221215165553.1950307-1-arnd@kernel.org
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      68b0cdcf
    • Mark Hawrylak's avatar
      drm/radeon: Fix eDP for single-display iMac11,2 · 96a8424a
      Mark Hawrylak authored
      commit 05eacc19 upstream.
      
      Apple iMac11,2 (mid 2010) also with Radeon HD-4670 that has the same
      issue as iMac10,1 (late 2009) where the internal eDP panel stays dark on
      driver load.  This patch treats iMac11,2 the same as iMac10,1,
      so the eDP panel stays active.
      
      Additional steps:
      Kernel boot parameter radeon.nomodeset=0 required to keep the eDP
      panel active.
      
      This patch is an extension of
      commit 564d8a2c
      
       ("drm/radeon: Fix eDP for single-display iMac10,1 (v2)")
      Link: https://lore.kernel.org/all/lsq.1507553064.833262317@decadent.org.uk/
      Signed-off-by: default avatarMark Hawrylak <mark.hawrylak@gmail.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>
      96a8424a
    • Mavroudis Chatzilaridis's avatar
      drm/i915/quirks: Add inverted backlight quirk for HP 14-r206nv · 6e617388
      Mavroudis Chatzilaridis authored
      commit 5e438bf7
      
       upstream.
      
      This laptop uses inverted backlight PWM. Thus, without this quirk,
      backlight brightness decreases as the brightness value increases and
      vice versa.
      
      Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/8013
      Cc: stable@vger.kernel.org
      Signed-off-by: default avatarMavroudis Chatzilaridis <mavchatz@protonmail.com>
      Reviewed-by: default avatarJani Nikula <jani.nikula@intel.com>
      Signed-off-by: default avatarJani Nikula <jani.nikula@intel.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20230201184947.8835-1-mavchatz@protonmail.com
      (cherry picked from commit 83e7d6fd
      
      )
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      6e617388
    • Damien Le Moal's avatar
      PCI: Avoid FLR for AMD FCH AHCI adapters · efc72cce
      Damien Le Moal authored
      commit 63ba51db
      
       upstream.
      
      PCI passthrough to VMs does not work with AMD FCH AHCI adapters: the guest
      OS fails to correctly probe devices attached to the controller due to FIS
      communication failures:
      
        ata4: softreset failed (1st FIS failed)
        ...
        ata4.00: qc timeout after 5000 msecs (cmd 0xec)
        ata4.00: failed to IDENTIFY (I/O error, err_mask=0x4)
      
      Forcing the "bus" reset method before unbinding & binding the adapter to
      the vfio-pci driver solves this issue, e.g.:
      
        echo "bus" > /sys/bus/pci/devices/<ID>/reset_method
      
      gives a working guest OS, indicating that the default FLR reset method
      doesn't work correctly.
      
      Apply quirk_no_flr() to AMD FCH AHCI devices to work around this issue.
      
      Link: https://lore.kernel.org/r/20230128013951.523247-1-damien.lemoal@opensource.wdc.com
      Reported-by: default avatarNiklas Cassel <niklas.cassel@wdc.com>
      Signed-off-by: default avatarDamien Le Moal <damien.lemoal@opensource.wdc.com>
      Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
      Cc: stable@vger.kernel.org
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      efc72cce
    • Lukas Wunner's avatar
      PCI: hotplug: Allow marking devices as disconnected during bind/unbind · bcc1bafb
      Lukas Wunner authored
      commit 74ff8864 upstream.
      
      On surprise removal, pciehp_unconfigure_device() and acpiphp's
      trim_stale_devices() call pci_dev_set_disconnected() to mark removed
      devices as permanently offline.  Thereby, the PCI core and drivers know
      to skip device accesses.
      
      However pci_dev_set_disconnected() takes the device_lock and thus waits for
      a concurrent driver bind or unbind to complete.  As a result, the driver's
      ->probe and ->remove hooks have no chance to learn that the device is gone.
      
      That doesn't make any sense, so drop the device_lock and instead use atomic
      xchg() and cmpxchg() operations to update the device state.
      
      As a byproduct, an AB-BA deadlock reported by Anatoli is fixed which occurs
      on surprise removal with AER concurrently performing a bus reset.
      
      AER bus reset:
      
        INFO: task irq/26-aerdrv:95 blocked for more than 120 seconds.
        Tainted: G        W          6.2.0-rc3-custom-norework-jan11+
        schedule
        rwsem_down_write_slowpath
        down_write_nested
        pciehp_reset_slot                      # acquires reset_lock
        pci_reset_hotplug_slot
        pci_slot_reset                         # acquires device_lock
        pci_bus_error_reset
        aer_root_reset
        pcie_do_recovery
        aer_process_err_devices
        aer_isr
      
      pciehp surprise removal:
      
        INFO: task irq/26-pciehp:96 blocked for more than 120 seconds.
        Tainted: G        W          6.2.0-rc3-custom-norework-jan11+
        schedule_preempt_disabled
        __mutex_lock
        mutex_lock_nested
        pci_dev_set_disconnected               # acquires device_lock
        pci_walk_bus
        pciehp_unconfigure_device
        pciehp_disable_slot
        pciehp_handle_presence_or_link_change
        pciehp_ist                             # acquires reset_lock
      
      Link: https://bugzilla.kernel.org/show_bug.cgi?id=215590
      Fixes: a6bd101b
      
       ("PCI: Unify device inaccessible")
      Link: https://lore.kernel.org/r/3dc88ea82bdc0e37d9000e413d5ebce481cbd629.1674205689.git.lukas@wunner.de
      Reported-by: default avatarAnatoli Antonovitch <anatoli.antonovitch@amd.com>
      Signed-off-by: default avatarLukas Wunner <lukas@wunner.de>
      Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
      Cc: stable@vger.kernel.org # v4.20+
      Cc: Keith Busch <kbusch@kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      bcc1bafb
    • Lukas Wunner's avatar
      PCI/PM: Observe reset delay irrespective of bridge_d3 · 2a505831
      Lukas Wunner authored
      commit 8ef02172 upstream.
      
      If a PCI bridge is suspended to D3cold upon entering system sleep,
      resuming it entails a Fundamental Reset per PCIe r6.0 sec 5.8.
      
      The delay prescribed after a Fundamental Reset in PCIe r6.0 sec 6.6.1
      is sought to be observed by:
      
        pci_pm_resume_noirq()
          pci_pm_bridge_power_up_actions()
            pci_bridge_wait_for_secondary_bus()
      
      However, pci_bridge_wait_for_secondary_bus() bails out if the bridge_d3
      flag is not set.  That flag indicates whether a bridge is allowed to
      suspend to D3cold at *runtime*.
      
      Hence *no* delay is observed on resume from system sleep if runtime
      D3cold is forbidden.  That doesn't make any sense, so drop the bridge_d3
      check from pci_bridge_wait_for_secondary_bus().
      
      The purpose of the bridge_d3 check was probably to avoid delays if a
      bridge remained in D0 during suspend.  However the sole caller of
      pci_bridge_wait_for_secondary_bus(), pci_pm_bridge_power_up_actions(),
      is only invoked if the previous power state was D3cold.  Hence the
      additional bridge_d3 check seems superfluous.
      
      Fixes: ad9001f2
      
       ("PCI/PM: Add missing link delays required by the PCIe spec")
      Link: https://lore.kernel.org/r/eb37fa345285ec8bacabbf06b020b803f77bdd3d.1673769517.git.lukas@wunner.de
      Tested-by: default avatarRavi Kishore Koppuravuri <ravi.kishore.koppuravuri@intel.com>
      Signed-off-by: default avatarLukas Wunner <lukas@wunner.de>
      Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
      Reviewed-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
      Reviewed-by: default avatarKuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
      Cc: stable@vger.kernel.org # v5.5+
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      2a505831
    • Tomas Henzl's avatar
      scsi: ses: Fix slab-out-of-bounds in ses_intf_remove() · 40af9a6d
      Tomas Henzl authored
      commit 578797f0
      
       upstream.
      
      A fix for:
      
      BUG: KASAN: slab-out-of-bounds in ses_intf_remove+0x23f/0x270 [ses]
      Read of size 8 at addr ffff88a10d32e5d8 by task rmmod/12013
      
      When edev->components is zero, accessing edev->component[0] members is
      wrong.
      
      Link: https://lore.kernel.org/r/20230202162451.15346-5-thenzl@redhat.com
      Cc: stable@vger.kernel.org
      Signed-off-by: default avatarTomas Henzl <thenzl@redhat.com>
      Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      40af9a6d
    • Tomas Henzl's avatar
      scsi: ses: Fix possible desc_ptr out-of-bounds accesses · 79ec5dd5
      Tomas Henzl authored
      commit 801ab13d
      
       upstream.
      
      Sanitize possible desc_ptr out-of-bounds accesses in
      ses_enclosure_data_process().
      
      Link: https://lore.kernel.org/r/20230202162451.15346-4-thenzl@redhat.com
      Cc: stable@vger.kernel.org
      Signed-off-by: default avatarTomas Henzl <thenzl@redhat.com>
      Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      79ec5dd5