Skip to content
  1. May 15, 2021
    • Hugh Dickins's avatar
      ksm: revert "use GET_KSM_PAGE_NOLOCK to get ksm page in remove_rmap_item_from_tree()" · 62862290
      Hugh Dickins authored
      This reverts commit 3e96b6a2.  General
      Protection Fault in rmap_walk_ksm() under memory pressure:
      remove_rmap_item_from_tree() needs to take page lock, of course.
      
      Link: https://lkml.kernel.org/r/alpine.LSU.2.11.2105092253500.1127@eggly.anvils
      
      
      Signed-off-by: default avatarHugh Dickins <hughd@google.com>
      Cc: Miaohe Lin <linmiaohe@huawei.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      62862290
    • Axel Rasmussen's avatar
      userfaultfd: release page in error path to avoid BUG_ON · 7ed9d238
      Axel Rasmussen authored
      Consider the following sequence of events:
      
      1. Userspace issues a UFFD ioctl, which ends up calling into
         shmem_mfill_atomic_pte(). We successfully account the blocks, we
         shmem_alloc_page(), but then the copy_from_user() fails. We return
         -ENOENT. We don't release the page we allocated.
      2. Our caller detects this error code, tries the copy_from_user() after
         dropping the mmap_lock, and retries, calling back into
         shmem_mfill_atomic_pte().
      3. Meanwhile, let's say another process filled up the tmpfs being used.
      4. So shmem_mfill_atomic_pte() fails to account blocks this time, and
         immediately returns - without releasing the page.
      
      This triggers a BUG_ON in our caller, which asserts that the page
      should always be consumed, unless -ENOENT is returned.
      
      To fix this, detect if we have such a "dangling" page when accounting
      fails, and if so, release it before returning.
      
      Link: https://lkml.kernel.org/r/20210428230858.348400-1-axelrasmussen@goog...
      7ed9d238
    • Phillip Lougher's avatar
      squashfs: fix divide error in calculate_skip() · d6e621de
      Phillip Lougher authored
      Sysbot has reported a "divide error" which has been identified as being
      caused by a corrupted file_size value within the file inode.  This value
      has been corrupted to a much larger value than expected.
      
      Calculate_skip() is passed i_size_read(inode) >> msblk->block_log.  Due to
      the file_size value corruption this overflows the int argument/variable in
      that function, leading to the divide error.
      
      This patch changes the function to use u64.  This will accommodate any
      unexpectedly large values due to corruption.
      
      The value returned from calculate_skip() is clamped to be never more than
      SQUASHFS_CACHED_BLKS - 1, or 7.  So file_size corruption does not lead to
      an unexpectedly large return result here.
      
      Link: https://lkml.kernel.org/r/20210507152618.9447-1-phillip@squashfs.org.uk
      
      
      Signed-off-by: default avatarPhillip Lougher <phillip@squashfs.org.uk>
      Reported-by: default avatar <syzbot+e8f781243ce16ac2f962@syzkaller.appspotmail.com>
      Reported-by: default avatar <syzbot+7b98870d4fec9447b951@syzkaller.appspotmail...>
      d6e621de
    • Alistair Popple's avatar
      kernel/resource: fix return code check in __request_free_mem_region · eb1f065f
      Alistair Popple authored
      Splitting an earlier version of a patch that allowed calling
      __request_region() while holding the resource lock into a series of
      patches required changing the return code for the newly introduced
      __request_region_locked().
      
      Unfortunately this change was not carried through to a subsequent commit
      56fd9491 ("kernel/resource: fix locking in request_free_mem_region")
      in the series.  This resulted in a use-after-free due to freeing the
      struct resource without properly releasing it.  Fix this by correcting the
      return code check so that the struct is not freed if the request to add it
      was successful.
      
      Link: https://lkml.kernel.org/r/20210512073528.22334-1-apopple@nvidia.com
      Fixes: 56fd9491
      
       ("kernel/resource: fix locking in request_free_mem_region")
      Signed-off-by: default avatarAlistair Popple <apopple@nvidia.com>
      Reported-by: default avatarkernel test robot <oliver.sang@intel.com>
      Reviewed-by: default avatarDavid Hildenbrand <david@redhat.com>
      Cc: Balbir Singh <bsingharora@gmail.com>
      Cc: Dan Williams <dan.j.williams@intel.com>
      Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
      Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
      Cc: Jerome Glisse <jglisse@redhat.com>
      Cc: John Hubbard <jhubbard@nvidia.com>
      Cc: Muchun Song <smuchun@gmail.com>
      Cc: Oliver Sang <oliver.sang@intel.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      eb1f065f
    • Vlastimil Babka's avatar
      mm, slub: move slub_debug static key enabling outside slab_mutex · afe0c26d
      Vlastimil Babka authored
      Paul E.  McKenney reported [1] that commit 1f0723a4 ("mm, slub: enable
      slub_debug static key when creating cache with explicit debug flags")
      results in the lockdep complaint:
      
       ======================================================
       WARNING: possible circular locking dependency detected
       5.12.0+ #15 Not tainted
       ------------------------------------------------------
       rcu_torture_sta/109 is trying to acquire lock:
       ffffffff96063cd0 (cpu_hotplug_lock){++++}-{0:0}, at: static_key_enable+0x9/0x20
      
       but task is already holding lock:
       ffffffff96173c28 (slab_mutex){+.+.}-{3:3}, at: kmem_cache_create_usercopy+0x2d/0x250
      
       which lock already depends on the new lock.
      
       the existing dependency chain (in reverse order) is:
      
       -> #1 (slab_mutex){+.+.}-{3:3}:
              lock_acquire+0xb9/0x3a0
              __mutex_lock+0x8d/0x920
              slub_cpu_dead+0x15/0xf0
              cpuhp_invoke_callback+0x17a/0x7c0
              cpuhp_invoke_callback_range+0x3b/0x80
              _cpu_down+0xdf/0x2a0
              cpu_down+0x2c/0x50
              device_offline+0x82/0xb0
              remove_cpu+0x1a/0x30
              torture_offline+0x80/0x140
              torture_onoff+0x147/0x260
              kthread+0x10a/0x140
              ret_from_fork+0x22/0x30
      
       -> #0 (cpu_hotplug_lock){++++}-{0:0}:
              check_prev_add+0x8f/0xbf0
              __lock_acquire+0x13f0/0x1d80
              lock_acquire+0xb9/0x3a0
              cpus_read_lock+0x21/0xa0
              static_key_enable+0x9/0x20
              __kmem_cache_create+0x38d/0x430
              kmem_cache_create_usercopy+0x146/0x250
              kmem_cache_create+0xd/0x10
              rcu_torture_stats+0x79/0x280
              kthread+0x10a/0x140
              ret_from_fork+0x22/0x30
      
       other info that might help us debug this:
      
        Possible unsafe locking scenario:
      
              CPU0                    CPU1
              ----                    ----
         lock(slab_mutex);
                                      lock(cpu_hotplug_lock);
                                      lock(slab_mutex);
         lock(cpu_hotplug_lock);
      
        *** DEADLOCK ***
      
       1 lock held by rcu_torture_sta/109:
        #0: ffffffff96173c28 (slab_mutex){+.+.}-{3:3}, at: kmem_cache_create_usercopy+0x2d/0x250
      
       stack backtrace:
       CPU: 3 PID: 109 Comm: rcu_torture_sta Not tainted 5.12.0+ #15
       Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.13.0-1ubuntu1.1 04/01/2014
       Call Trace:
        dump_stack+0x6d/0x89
        check_noncircular+0xfe/0x110
        ? lock_is_held_type+0x98/0x110
        check_prev_add+0x8f/0xbf0
        __lock_acquire+0x13f0/0x1d80
        lock_acquire+0xb9/0x3a0
        ? static_key_enable+0x9/0x20
        ? mark_held_locks+0x49/0x70
        cpus_read_lock+0x21/0xa0
        ? static_key_enable+0x9/0x20
        static_key_enable+0x9/0x20
        __kmem_cache_create+0x38d/0x430
        kmem_cache_create_usercopy+0x146/0x250
        ? rcu_torture_stats_print+0xd0/0xd0
        kmem_cache_create+0xd/0x10
        rcu_torture_stats+0x79/0x280
        ? rcu_torture_stats_print+0xd0/0xd0
        kthread+0x10a/0x140
        ? kthread_park+0x80/0x80
        ret_from_fork+0x22/0x30
      
      This is because there's one order of locking from the hotplug callbacks:
      
      lock(cpu_hotplug_lock); // from hotplug machinery itself
      lock(slab_mutex); // in e.g. slab_mem_going_offline_callback()
      
      And commit 1f0723a4 made the reverse sequence possible:
      lock(slab_mutex); // in kmem_cache_create_usercopy()
      lock(cpu_hotplug_lock); // kmem_cache_open() -> static_key_enable()
      
      The simplest fix is to move static_key_enable() to a place before slab_mutex is
      taken. That means kmem_cache_create_usercopy() in mm/slab_common.c which is not
      ideal for SLUB-specific code, but the #ifdef CONFIG_SLUB_DEBUG makes it
      at least self-contained and obvious.
      
      [1] https://lore.kernel.org/lkml/20210502171827.GA3670492@paulmck-ThinkPad-P17-Gen-1/
      
      Link: https://lkml.kernel.org/r/20210504120019.26791-1-vbabka@suse.cz
      Fixes: 1f0723a4
      
       ("mm, slub: enable slub_debug static key when creating cache with explicit debug flags")
      Signed-off-by: default avatarVlastimil Babka <vbabka@suse.cz>
      Reported-by: default avatarPaul E. McKenney <paulmck@kernel.org>
      Tested-by: default avatarPaul E. McKenney <paulmck@kernel.org>
      Acked-by: default avatarDavid Rientjes <rientjes@google.com>
      Cc: Christoph Lameter <cl@linux.com>
      Cc: Pekka Enberg <penberg@kernel.org>
      Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      afe0c26d
    • Peter Xu's avatar
      mm/hugetlb: fix cow where page writtable in child · 84894e1c
      Peter Xu authored
      When rework early cow of pinned hugetlb pages, we moved huge_ptep_get()
      upper but overlooked a side effect that the huge_ptep_get() will fetch the
      pte after wr-protection.  After moving it upwards, we need explicit
      wr-protect of child pte or we will keep the write bit set in the child
      process, which could cause data corrution where the child can write to the
      original page directly.
      
      This issue can also be exposed by "memfd_test hugetlbfs" kselftest.
      
      Link: https://lkml.kernel.org/r/20210503234356.9097-3-peterx@redhat.com
      Fixes: 4eae4efa
      
       ("hugetlb: do early cow when page pinned on src mm")
      Signed-off-by: default avatarPeter Xu <peterx@redhat.com>
      Reviewed-by: default avatarMike Kravetz <mike.kravetz@oracle.com>
      Cc: Hugh Dickins <hughd@google.com>
      Cc: Joel Fernandes (Google) <joel@joelfernandes.org>
      Cc: <stable@vger.kernel.org>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      84894e1c
    • Peter Xu's avatar
      mm/hugetlb: fix F_SEAL_FUTURE_WRITE · 22247efd
      Peter Xu authored
      Patch series "mm/hugetlb: Fix issues on file sealing and fork", v2.
      
      Hugh reported issue with F_SEAL_FUTURE_WRITE not applied correctly to
      hugetlbfs, which I can easily verify using the memfd_test program, which
      seems that the program is hardly run with hugetlbfs pages (as by default
      shmem).
      
      Meanwhile I found another probably even more severe issue on that hugetlb
      fork won't wr-protect child cow pages, so child can potentially write to
      parent private pages.  Patch 2 addresses that.
      
      After this series applied, "memfd_test hugetlbfs" should start to pass.
      
      This patch (of 2):
      
      F_SEAL_FUTURE_WRITE is missing for hugetlb starting from the first day.
      There is a test program for that and it fails constantly.
      
      $ ./memfd_test hugetlbfs
      memfd-hugetlb: CREATE
      memfd-hugetlb: BASIC
      memfd-hugetlb: SEAL-WRITE
      memfd-hugetlb: SEAL-FUTURE-WRITE
      mmap() didn't fail as expected
      Aborted (core dumped)
      
      I think it's probably because no one is really running the hugetlbfs test.
      
      Fix it by checking FUTURE_WRITE also in hugetlbfs_file_mmap() as what we
      do in shmem_mmap().  Generalize a helper for that.
      
      Link: https://lkml.kernel.org/r/20210503234356.9097-1-peterx@redhat.com
      Link: https://lkml.kernel.org/r/20210503234356.9097-2-peterx@redhat.com
      Fixes: ab3948f5
      
       ("mm/memfd: add an F_SEAL_FUTURE_WRITE seal to memfd")
      Signed-off-by: default avatarPeter Xu <peterx@redhat.com>
      Reported-by: default avatarHugh Dickins <hughd@google.com>
      Reviewed-by: default avatarMike Kravetz <mike.kravetz@oracle.com>
      Cc: Joel Fernandes (Google) <joel@joelfernandes.org>
      Cc: <stable@vger.kernel.org>
      Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      22247efd
    • Linus Torvalds's avatar
      Merge tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux · bd3c9cdb
      Linus Torvalds authored
      Pull arm64 fixes from Catalin Marinas:
       "Fixes and cpucaps.h automatic generation:
      
         - Generate cpucaps.h at build time rather than carrying lots of
           #defines. Merged at -rc1 to avoid some conflicts during the merge
           window.
      
         - Initialise RGSR_EL1.SEED in __cpu_setup() as it may be left as 0
           out of reset and the IRG instruction would not function as expected
           if only the architected pseudorandom number generator is
           implemented.
      
         - Fix potential race condition in __sync_icache_dcache() where the
           PG_dcache_clean page flag is set before the actual cache
           maintenance.
      
         - Fix header include in BTI kselftests"
      
      * tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux:
        arm64: Fix race condition on PG_dcache_clean in __sync_icache_dcache()
        arm64: tools: Add __ASM_CPUCAPS_H to the endif in cpucaps.h
        arm64: mte: initialize RGSR_EL1.SEED in __cpu_setup
        kselftest/arm64: Add missing stddef.h include to BTI tests
        arm64: Generate cpucaps.h
      bd3c9cdb
    • Linus Torvalds's avatar
      Merge tag 'f2fs-5.13-rc1-fix' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs · ac524ece
      Linus Torvalds authored
      Pull f2fs fixes from Jaegeuk Kim:
       "This fixes some critical bugs such as memory leak in compression
        flows, kernel panic when handling errors, and swapon failure due to
        newly added condition check"
      
      * tag 'f2fs-5.13-rc1-fix' of git://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs:
        f2fs: return EINVAL for hole cases in swap file
        f2fs: avoid swapon failure by giving a warning first
        f2fs: compress: fix to assign cc.cluster_idx correctly
        f2fs: compress: fix race condition of overwrite vs truncate
        f2fs: compress: fix to free compress page correctly
        f2fs: support iflag change given the mask
        f2fs: avoid null pointer access when handling IPU error
      ac524ece
    • Linus Torvalds's avatar
      Merge tag 'drm-fixes-2021-05-14' of git://anongit.freedesktop.org/drm/drm · b5304a4f
      Linus Torvalds authored
      Pull drm fixes from Dave Airlie:
       "Not much here, mostly amdgpu fixes, with a couple of radeon, and a
        cosmetic vc4.
      
        Two MAINTAINERS file updates also.
      
        amdgpu:
         - Fixes for flexible array conversions
         - Fix sysfs attribute init
         - Harvesting fixes
         - VCN CG/PG fixes for Picasso
      
        radeon:
         - Fixes for flexible array conversions
         - Fix for flickering on Oland with multiple 4K displays
      
        vc4:
         - drop unused function"
      
      * tag 'drm-fixes-2021-05-14' of git://anongit.freedesktop.org/drm/drm:
        drm/amdgpu: update vcn1.0 Non-DPG suspend sequence
        drm/amdgpu: set vcn mgcg flag for picasso
        drm/radeon/dpm: Disable sclk switching on Oland when two 4K 60Hz monitors are connected
        drm/amdgpu: update the method for harvest IP for specific SKU
        drm/amdgpu: add judgement when add ip blocks (v2)
        drm/amd/display: Initialize attribute for hdcp_srm sysfs file
        drm/amd/pm: Fix out-of-bounds bug
        drm/radeon/si_dpm: Fix SMU power state load
        drm/radeon/ni_dpm: Fix booting bug
        MAINTAINERS: Update address for Emma Anholt
        MAINTAINERS: Update my e-mail
        drm/vc4: remove unused function
        drm/ttm: Do not add non-system domain BO into swap list
      b5304a4f
    • Catalin Marinas's avatar
      arm64: Fix race condition on PG_dcache_clean in __sync_icache_dcache() · 588a513d
      Catalin Marinas authored
      
      
      To ensure that instructions are observable in a new mapping, the arm64
      set_pte_at() implementation cleans the D-cache and invalidates the
      I-cache to the PoU. As an optimisation, this is only done on executable
      mappings and the PG_dcache_clean page flag is set to avoid future cache
      maintenance on the same page.
      
      When two different processes map the same page (e.g. private executable
      file or shared mapping) there's a potential race on checking and setting
      PG_dcache_clean via set_pte_at() -> __sync_icache_dcache(). While on the
      fault paths the page is locked (PG_locked), mprotect() does not take the
      page lock. The result is that one process may see the PG_dcache_clean
      flag set but the I/D cache maintenance not yet performed.
      
      Avoid test_and_set_bit(PG_dcache_clean) in favour of separate test_bit()
      and set_bit(). In the rare event of a race, the cache maintenance is
      done twice.
      
      Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
      Cc: <stable@vger.kernel.org>
      Cc: Will Deacon <will@kernel.org>
      Cc: Steven Price <steven.price@arm.com>
      Reviewed-by: default avatarSteven Price <steven.price@arm.com>
      Acked-by: default avatarWill Deacon <will@kernel.org>
      Link: https://lore.kernel.org/r/20210514095001.13236-1-catalin.marinas@arm.com
      
      
      Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
      588a513d
  2. May 14, 2021
    • Dave Airlie's avatar
      Merge tag 'amd-drm-fixes-5.13-2021-05-13' of... · 08f0cfbf
      Dave Airlie authored
      Merge tag 'amd-drm-fixes-5.13-2021-05-13' of https://gitlab.freedesktop.org/agd5f/linux
      
       into drm-fixes
      
      amd-drm-fixes-5.13-2021-05-13:
      
      amdgpu:
      - Fixes for flexible array conversions
      - Fix sysfs attribute init
      - Harvesting fixes
      - VCN CG/PG fixes for Picasso
      
      radeon:
      - Fixes for flexible array conversions
      - Fix for flickering on Oland with multiple 4K displays
      
      Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
      From: Alex Deucher <alexander.deucher@amd.com>
      Link: https://patchwork.freedesktop.org/patch/msgid/20210513163228.3963-1-alexander.deucher@amd.com
      08f0cfbf
    • Dave Airlie's avatar
      Merge tag 'drm-misc-fixes-2021-05-13' of git://anongit.freedesktop.org/drm/drm-misc into drm-fixes · 1db7aa26
      Dave Airlie authored
      
      
      Remove an unused function and a MAINTAINERS update.
      
      Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
      
      From: Maxime Ripard <maxime@cerno.tech>
      Link: https://patchwork.freedesktop.org/patch/msgid/20210513133617.xq77wwrehpuh7yn2@hendrix
      1db7aa26
    • Linus Torvalds's avatar
      Merge tag 'pm-5.13-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm · 315d9931
      Linus Torvalds authored
      Pull power management fixes from Rafael Wysocki:
       "These close a coverage gap in the intel_pstate driver and fix runtime
        PM child count imbalance related to interactions with system-wide
        suspend.
      
        Specifics:
      
         - Make intel_pstate work as expected on systems where the platform
           firmware enables HWP even though the HWP EPP support is not
           advertised (Rafael Wysocki).
      
         - Fix possible runtime PM child count imbalance that may occur if
           other runtime PM functions are called after invoking
           pm_runtime_force_suspend() and before pm_runtime_force_resume()
           is called (Tony Lindgren)"
      
      * tag 'pm-5.13-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
        PM: runtime: Fix unpaired parent child_count for force_resume
        cpufreq: intel_pstate: Use HWP if enabled by platform firmware
      315d9931
    • Linus Torvalds's avatar
      Merge tag 'acpi-5.13-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm · 2df38a8e
      Linus Torvalds authored
      Pull ACPI fixes from Rafael Wysocki:
       "These revert an unnecessary revert of an ACPI power management commit,
        add a missing device ID to one of the lists and fix a possible memory
        leak in an error path.
      
        Specifics:
      
         - Revert a revert of a recent ACPI power management change that does
           not need to be reverted after all (Rafael Wysocki).
      
         - Add missing fan device ID to the list of device IDs for which the
           devices should not be put into the ACPI PM domain (Sumeet
           Pawnikar).
      
         - Fix possible memory leak in an error path in the ACPI device
           enumeration code (Christophe JAILLET)"
      
      * tag 'acpi-5.13-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
        ACPI: PM: Add ACPI ID of Alder Lake Fan
        ACPI: scan: Fix a memory leak in an error handling path
        Revert "Revert "ACPI: scan: Turn off unused power resources during initialization""
      2df38a8e
    • Rafael J. Wysocki's avatar
      Merge branch 'acpi-pm' · fd386517
      Rafael J. Wysocki authored
      * acpi-pm:
        ACPI: PM: Add ACPI ID of Alder Lake Fan
        Revert "Revert "ACPI: scan: Turn off unused power resources during initialization""
      fd386517
    • Rafael J. Wysocki's avatar
      Merge branch 'pm-core' · 78a6948b
      Rafael J. Wysocki authored
      * pm-core:
        PM: runtime: Fix unpaired parent child_count for force_resume
      78a6948b
    • Linus Torvalds's avatar
      Merge branch 'resizex' (patches from Maciej) · adc12a74
      Linus Torvalds authored
      Merge VT_RESIZEX fixes from Maciej Rozycki:
       "I got to the bottom of the issue with VT_RESIZEX recently discussed
        and came up with this small patch series, fixing an additional issue
        that I originally thought might be broken VGA hardware emulation with
        my laptop, which however turned out to be intertwined with the
        original problem and also a regression introduced somewhat later.
      
        The fix for that because the first patch, and then to make backporting
        feasible I had to put a revert of the offending change from last
        September next, followed by a proper fix for the framebuffer issue
        that change had tried to address.
      
        See individual change descriptions for details.
      
        These have been verified with true VGA hardware (a Trident TVGA8900
        ISA video adapter) using various combinations of `svgatextmode' and
        `setfont' command invocations to change both the VT size and the font
        size, and also switching between the text console and X11, both by
        starting/stopping the X server and by switching between VTs.
      
        All this to ensure bringing the behaviour of VGA text console back to
        correct operation as it used to be with Linux 2.6.18"
      
      * emailed patches from Maciej W. Rozycki <macro@orcam.me.uk>:
        vt: Fix character height handling with VT_RESIZEX
        vt_ioctl: Revert VT_RESIZEX parameter handling removal
        vgacon: Record video mode changes with VT_RESIZEX
      adc12a74
    • Maciej W. Rozycki's avatar
      vt: Fix character height handling with VT_RESIZEX · 860dafa9
      Maciej W. Rozycki authored
      Restore the original intent of the VT_RESIZEX ioctl's `v_clin' parameter
      which is the number of pixel rows per character (cell) rather than the
      height of the font used.
      
      For framebuffer devices the two values are always the same, because the
      former is inferred from the latter one.  For VGA used as a true text
      mode device these two parameters are independent from each other: the
      number of pixel rows per character is set in the CRT controller, while
      font height is in fact hardwired to 32 pixel rows and fonts of heights
      below that value are handled by padding their data with blanks when
      loaded to hardware for use by the character generator.  One can change
      the setting in the CRT controller and it will update the screen contents
      accordingly regardless of the font loaded.
      
      The `v_clin' parameter is used by the `vgacon' driver to set the height
      of the character cell and then the cursor position within.  Make the
      parameter explicit then, by defining a new `vc_cell_height' struct
      member of `vc_data', set it instead of `vc_font.height' from `v_clin' in
      the VT_RESIZEX ioctl, and then use it throughout the `vgacon' driver
      except where actual font data is accessed which as noted above is
      independent from the CRTC setting.
      
      This way the framebuffer console driver is free to ignore the `v_clin'
      parameter as irrelevant, as it always should have, avoiding any issues
      attempts to give the parameter a meaning there could have caused, such
      as one that has led to commit 988d0763 ("vt_ioctl: make VT_RESIZEX
      behave like VT_RESIZE"):
      
       "syzbot is reporting UAF/OOB read at bit_putcs()/soft_cursor() [1][2],
        for vt_resizex() from ioctl(VT_RESIZEX) allows setting font height
        larger than actual font height calculated by con_font_set() from
        ioctl(PIO_FONT). Since fbcon_set_font() from con_font_set() allocates
        minimal amount of memory based on actual font height calculated by
        con_font_set(), use of vt_resizex() can cause UAF/OOB read for font
        data."
      
      The problem first appeared around Linux 2.5.66 which predates our repo
      history, but the origin could be identified with the old MIPS/Linux repo
      also at: <git://git.kernel.org/pub/scm/linux/kernel/git/ralf/linux.git>
      as commit 9736a3546de7 ("Merge with Linux 2.5.66."), where VT_RESIZEX
      code in `vt_ioctl' was updated as follows:
      
       		if (clin)
      -			video_font_height = clin;
      +			vc->vc_font.height = clin;
      
      making the parameter apply to framebuffer devices as well, perhaps due
      to the use of "font" in the name of the original `video_font_height'
      variable.  Use "cell" in the new struct member then to avoid ambiguity.
      
      References:
      
      [1] https://syzkaller.appspot.com/bug?id=32577e96d88447ded2d3b76d71254fb855245837
      [2] https://syzkaller.appspot.com/bug?id=6b8355d27b2b94fb5cedf4655e3a59162d9e48e3
      
      
      
      Signed-off-by: default avatarMaciej W. Rozycki <macro@orcam.me.uk>
      Fixes: 1da177e4
      
       ("Linux-2.6.12-rc2")
      Cc: stable@vger.kernel.org # v2.6.12+
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      860dafa9
    • Maciej W. Rozycki's avatar
      vt_ioctl: Revert VT_RESIZEX parameter handling removal · a90c275e
      Maciej W. Rozycki authored
      
      
      Revert the removal of code handling extra VT_RESIZEX ioctl's parameters
      beyond those that VT_RESIZE supports, fixing a functional regression
      causing `svgatextmode' not to resize the VT anymore.
      
      As a consequence of the reverted change when the video adapter is
      reprogrammed from the original say 80x25 text mode using a 9x16
      character cell (720x400 pixel resolution) to say 80x37 text mode and the
      same character cell (720x592 pixel resolution), the VT geometry does not
      get updated and only upper two thirds of the screen are used for the VT,
      and the lower part remains blank.  The proportions change according to
      text mode geometries chosen.
      
      Revert the change verbatim then, bringing back previous VT resizing.
      
      Signed-off-by: default avatarMaciej W. Rozycki <macro@orcam.me.uk>
      Fixes: 988d0763
      
       ("vt_ioctl: make VT_RESIZEX behave like VT_RESIZE")
      Cc: stable@vger.kernel.org # v5.10+
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      a90c275e
    • Maciej W. Rozycki's avatar
      vgacon: Record video mode changes with VT_RESIZEX · d4d0ad57
      Maciej W. Rozycki authored
      
      
      Fix an issue with VGA console font size changes made after the initial
      video text mode has been changed with a user tool like `svgatextmode'
      calling the VT_RESIZEX ioctl.  As it stands in that case the original
      screen geometry continues being used to validate further VT resizing.
      
      Consequently when the video adapter is firstly reprogrammed from the
      original say 80x25 text mode using a 9x16 character cell (720x400 pixel
      resolution) to say 80x37 text mode and the same character cell (720x592
      pixel resolution), and secondly the CRTC character cell updated to 9x8
      (by loading a suitable font with the KD_FONT_OP_SET request of the
      KDFONTOP ioctl), the VT geometry does not get further updated from 80x37
      and only upper half of the screen is used for the VT, with the lower
      half showing rubbish corresponding to whatever happens to be there in
      the video memory that maps to that part of the screen.  Of course the
      proportions change according to text mode geometries and font sizes
      chosen.
      
      Address the problem then, by updating the text mode geometry defaults
      rather than checking against them whenever the VT is resized via a user
      ioctl.
      
      Signed-off-by: default avatarMaciej W. Rozycki <macro@orcam.me.uk>
      Fixes: e400b6ec
      
       ("vt/vgacon: Check if screen resize request comes from userspace")
      Cc: stable@vger.kernel.org # v2.6.24+
      Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
      d4d0ad57
    • Linus Torvalds's avatar
      Merge tag 'hwmon-for-v5.13-rc2' of... · d1e7c13a
      Linus Torvalds authored
      Merge tag 'hwmon-for-v5.13-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging
      
      Pull hwmon fixes from Guenter Roeck:
       "Fix bugs/regressions in adm9240, ltc2992, pmbus/fsp-3y, and occ
        drivers, plus a minor cleanup in the corsair-psu driver"
      
      * tag 'hwmon-for-v5.13-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging:
        hwmon: (adm9240) Fix writes into inX_max attributes
        hwmon: (ltc2992) Put fwnode in error case during ->probe()
        hwmon: (pmbus/fsp-3y) Fix FSP-3Y YH-5151E non-compliant vout encoding
        hwmon: (occ) Fix poll rate limiting
        hwmon: (corsair-psu) Remove unneeded semicolons
      d1e7c13a
    • Mark Brown's avatar
  3. May 13, 2021