Skip to content
  1. Mar 11, 2023
    • Xin Long's avatar
      sctp: add a refcnt in sctp_stream_priorities to avoid a nested loop · 8ee401f8
      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>
      8ee401f8
    • Lu Wei's avatar
      ipv6: Add lwtunnel encap size of all siblings in nexthop calculation · da263693
      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>
      da263693
    • Florian Westphal's avatar
      netfilter: ebtables: fix table blob use-after-free · 9060abce
      Florian Westphal authored
      [ Upstream commit e58a171d ]
      
      We are not allowed to return an error at this point.
      Looking at the code it looks like ret is always 0 at this
      point, but its not.
      
      t = find_table_lock(net, repl->name, &ret, &ebt_mutex);
      
      ... this can return a valid table, with ret != 0.
      
      This bug causes update of table->private with the new
      blob, but then frees the blob right away in the caller.
      
      Syzbot report:
      
      BUG: KASAN: vmalloc-out-of-bounds in __ebt_unregister_table+0xc00/0xcd0 net/bridge/netfilter/ebtables.c:1168
      Read of size 4 at addr ffffc90005425000 by task kworker/u4:4/74
      Workqueue: netns cleanup_net
      Call Trace:
       kasan_report+0xbf/0x1f0 mm/kasan/report.c:517
       __ebt_unregister_table+0xc00/0xcd0 net/bridge/netfilter/ebtables.c:1168
       ebt_unregister_table+0x35/0x40 net/bridge/netfilter/ebtables.c:1372
       ops_exit_list+0xb0/0x170 net/core/net_namespace.c:169
       cleanup_net+0x4ee/0xb10 net/core/net_namespace.c:613
      ...
      
      ip(6)tables appears to be ok (ret should be 0 at this point) but make
      this more obvious.
      
      Fixes: c58dd2dd
      
       ("netfilter: Can't fail and free after table replacement")
      Reported-by: default avatar <syzbot+f61594de72d6705aea03@syzkaller.appspotmail.com>
      Signed-off-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>
      9060abce
    • Hangyu Hua's avatar
      netfilter: ctnetlink: fix possible refcount leak in ctnetlink_create_conntrack() · 1ff0b87d
      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>
      1ff0b87d
    • Li Hua's avatar
      watchdog: pcwd_usb: Fix attempting to access uninitialized memory · 9f7abdd5
      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>
      9f7abdd5
    • Chen Jun's avatar
      watchdog: Fix kmemleak in watchdog_cdev_register · c5a21a55
      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>
      c5a21a55
    • ruanjinjie's avatar
      watchdog: at91sam9_wdt: use devm_request_irq to avoid missing free_irq() in error path · 273559f5
      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>
      273559f5
    • Ammar Faizi's avatar
      x86: um: vdso: Add '%rcx' and '%r11' to the syscall clobber list · 7cb46fa1
      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>
      7cb46fa1
    • Zhihao Cheng's avatar
      ubi: ubi_wl_put_peb: Fix infinite loop when wear-leveling work failed · 8a18856e
      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>
      8a18856e
    • Zhihao Cheng's avatar
      ubi: Fix UAF wear-leveling entry in eraseblk_count_seq_show() · 9d448dd6
      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>
      9d448dd6
    • Zhihao Cheng's avatar
      ubi: fastmap: Fix missed fm_anchor PEB in wear-leveling after disabling fastmap · 0aa0253f
      Zhihao Cheng authored
      [ Upstream commit 76f9476e ]
      
      After disabling fastmap(ubi->fm_disabled = 1), fastmap won't be updated,
      fm_anchor PEB is missed being scheduled for erasing. Besides, fm_anchor
      PEB may have smallest erase count, it doesn't participate wear-leveling.
      The difference of erase count between fm_anchor PEB and other PEBs will
      be larger and larger later on.
      
      In which situation fastmap can be disabled? Initially, we have an UBI
      image with fastmap. Then the image will be atttached without module
      parameter 'fm_autoconvert', ubi turns to full scanning mode in one
      random attaching process(eg. bad fastmap caused by powercut), ubi
      fastmap is disabled since then.
      
      Fix it by not getting fm_anchor if fastmap is disabled in
      ubi_refill_pools().
      
      Fetch a reproducer in [Link].
      
      Link: https://bugzilla.kernel.org/show_bug.cgi?id=216341
      Fixes: 4b68bf9a
      
       ("ubi: Select fastmap anchor PEBs considering ...")
      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>
      0aa0253f
    • Zhihao Cheng's avatar
      ubifs: ubifs_writepage: Mark page dirty after writing inode failed · f09a8454
      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>
      f09a8454
    • Zhihao Cheng's avatar
      ubifs: dirty_cow_znode: Fix memleak in error handling path · 9d476852
      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>
      9d476852
    • Zhihao Cheng's avatar
      ubifs: Re-statistic cleaned znode count if commit failed · 343d273d
      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>
      343d273d
    • Yang Yingliang's avatar
      ubi: Fix possible null-ptr-deref in ubi_free_volume() · fcbc795a
      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>
      fcbc795a
    • Li Zetao's avatar
      ubifs: Fix memory leak in alloc_wbufs() · bf502294
      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>
      bf502294
    • Li Zetao's avatar
      ubi: Fix unreferenced object reported by kmemleak in ubi_resize_volume() · 31d60afe
      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>
      31d60afe
    • Li Zetao's avatar
      ubi: Fix use-after-free when volume resizing failed · 35f8d406
      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>
      35f8d406
    • Zhihao Cheng's avatar
      ubifs: Reserve one leb for each journal head while doing budget · 38fd7acd
      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>
      38fd7acd
    • Zhihao Cheng's avatar
      ubifs: do_rename: Fix wrong space budget when target inode's nlink > 1 · 38a097dc
      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>
      38a097dc
    • Zhihao Cheng's avatar
      ubifs: Fix wrong dirty space budget for dirty inode · 495ea59a
      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>
      495ea59a
    • Zhihao Cheng's avatar
      ubifs: Rectify space budget for ubifs_xrename() · 9e07ee28
      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>
      9e07ee28
    • Zhihao Cheng's avatar
      ubifs: Rectify space budget for ubifs_symlink() if symlink is encrypted · ffebd804
      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>
      ffebd804
    • Li Hua's avatar
      ubifs: Fix build errors as symbol undefined · 93e748ba
      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>
      93e748ba
    • George Kennedy's avatar
      ubi: ensure that VID header offset + VID header size <= alloc, size · 846bfba3
      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>
      846bfba3
    • Xiang Yang's avatar
      um: vector: Fix memory leak in vector_config · f2b9c454
      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>
      f2b9c454
    • Alexander Potapenko's avatar
      fs: f2fs: initialize fsdata in pagecache_write() · 6be349d7
      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>
      6be349d7
    • Eric Biggers's avatar
      f2fs: use memcpy_{to,from}_page() where possible · 33909b1a
      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>
      33909b1a
    • Fabrice Gasnier's avatar
      pwm: stm32-lp: fix the check on arr and cmp registers update · 9d4a4a9e
      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>
      9d4a4a9e
    • Emil Renner Berthing's avatar
      pwm: sifive: Always let the first pwm_apply_state succeed · c2677c49
      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>
      c2677c49
    • Uwe Kleine-König's avatar
      pwm: sifive: Reduce time the controller lock is held · 8b98e7a4
      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>
      8b98e7a4
    • Miaoqian Lin's avatar
      objtool: Fix memory leak in create_static_call_sections() · a1368eae
      Miaoqian Lin authored
      [ Upstream commit 3da73f10 ]
      
      strdup() allocates memory for key_name. We need to release the memory in
      the following error paths. Add free() to avoid memory leak.
      
      Fixes: 1e7e4788
      
       ("x86/static_call: Add inline static call implementation for x86-64")
      Signed-off-by: default avatarMiaoqian Lin <linmq006@gmail.com>
      Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
      Link: https://lore.kernel.org/r/20221205080642.558583-1-linmq006@gmail.com
      Cc: Josh Poimboeuf <jpoimboe@redhat.com>
      Cc: Peter Zijlstra <peterz@infradead.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      a1368eae
    • Liu Shixin via Jfs-discussion's avatar
      fs/jfs: fix shift exponent db_agl2size negative · 5d03a19a
      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>
      5d03a19a
    • Jamal Hadi Salim's avatar
      net/sched: Retire tcindex classifier · 18c3fa7a
      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>
      18c3fa7a
    • Dmitry Goncharov's avatar
      kbuild: Port silent mode detection to future gnu make. · 322df540
      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>
      322df540
    • Jonas Karlman's avatar
      pinctrl: rockchip: fix reading pull type on rk3568 · f8ac5467
      Jonas Karlman authored
      commit 31b62a98 upstream.
      
      When reading pinconf-pins from debugfs it fails to get the configured pull
      type on RK3568, "unsupported pinctrl type" error messages is also reported.
      
      Fix this by adding support for RK3568 in rockchip_get_pull, including a
      reverse of the pull-up value swap applied in rockchip_set_pull so that
      pull-up is correctly reported in pinconf-pins.
      Also update the workaround comment to reflect affected pins, GPIO0_D3-D6.
      
      Fixes: c0dadc0e
      
       ("pinctrl: rockchip: add support for rk3568")
      Signed-off-by: default avatarJonas Karlman <jonas@kwiboo.se>
      Reviewed-by: default avatarHeiko Stuebner <heiko@sntech.de>
      Reviewed-by: default avatarJianqun Xu <jay.xu@rock-chips.com>
      Link: https://lore.kernel.org/r/20230110172955.1258840-1-jonas@kwiboo.se
      Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      f8ac5467
    • Jonas Karlman's avatar
      pinctrl: rockchip: fix mux route data for rk3568 · 50afcd53
      Jonas Karlman authored
      commit 431d1531 upstream.
      
      IO mux selection is configured in PMU_GRF_SOC_CON4 and GRF_IOFUNC_SEL0-5
      regs on RK3568. pwm0-2 is configured in PMU_GRF reg and the rest is
      configured in GRF_IOFUNC regs according to TRM [1].
      
      Update mux route data to reflect this and use proper detection pin for
      UART1 IO mux M1.
      
      This fixes HDMITX IO mux M1 selection and makes it possible to enable
      HDMI CEC on my Radxa ROCK 3 Model A v1.31 board.
      
      [1] http://opensource.rock-chips.com/images/2/26/Rockchip_RK3568_TRM_Part1_V1.3-20220930P.PDF
      
      Fixes: c0dadc0e
      
       ("pinctrl: rockchip: add support for rk3568")
      Signed-off-by: default avatarJonas Karlman <jonas@kwiboo.se>
      Link: https://lore.kernel.org/r/20230110084636.1141740-1-jonas@kwiboo.se
      Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      50afcd53
    • Arnd Bergmann's avatar
      wifi: ath9k: use proper statements in conditionals · 844da390
      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>
      844da390
    • Robert Marko's avatar
      arm64: dts: qcom: ipq8074: fix Gen2 PCIe QMP PHY · a2a1e3f4
      Robert Marko authored
      commit 100d9c94 upstream.
      
      Serdes register space sizes are incorrect, update them to match the
      actual sizes from downstream QCA 5.4 kernel.
      
      Fixes: 942bcd33
      
       ("arm64: dts: qcom: Fix IPQ8074 PCIe PHY nodes")
      Signed-off-by: default avatarRobert Marko <robimarko@gmail.com>
      Signed-off-by: default avatarBjorn Andersson <andersson@kernel.org>
      Link: https://lore.kernel.org/r/20230113164449.906002-1-robimarko@gmail.com
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      a2a1e3f4
    • Jani Nikula's avatar
      drm/edid: fix AVI infoframe aspect ratio handling · 64a99c0a
      Jani Nikula authored
      commit 1cbc1f0d
      
       upstream.
      
      We try to avoid sending VICs defined in the later specs in AVI
      infoframes to sinks that conform to the earlier specs, to not upset
      them, and use 0 for the VIC instead. However, we do this detection and
      conversion to 0 too early, as we'll need the actual VIC to figure out
      the aspect ratio.
      
      In particular, for a mode with 64:27 aspect ratio, 0 for VIC fails the
      AVI infoframe generation altogether with -EINVAL.
      
      Separate the VIC lookup from the "filtering", and postpone the
      filtering, to use the proper VIC for aspect ratio handling, and the 0
      VIC for the infoframe video code as needed.
      
      Reported-by: default avatarWilliam Tseng <william.tseng@intel.com>
      Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/6153
      References: https://lore.kernel.org/r/20220920062316.43162-1-william.tseng@intel.com
      Cc: <stable@vger.kernel.org>
      Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
      Signed-off-by: default avatarJani Nikula <jani.nikula@intel.com>
      Reviewed-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/c3e78cc6d01ed237f71ad0038826b08d83d75eef.1672826282.git.jani.nikula@intel.com
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      64a99c0a