Patch "x86/lib: Fix overflow when counting digits" has been added to the 5.15-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    x86/lib: Fix overflow when counting digits

to the 5.15-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     x86-lib-fix-overflow-when-counting-digits.patch
and it can be found in the queue-5.15 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 27fb247add7db5a51ba8bfa1d6d47e7d565d472d
Author: Colin Ian King <colin.i.king@xxxxxxxxx>
Date:   Thu Nov 2 17:49:01 2023 +0000

    x86/lib: Fix overflow when counting digits
    
    [ Upstream commit a24d61c609813963aacc9f6ec8343f4fcaac7243 ]
    
    tl;dr: The num_digits() function has a theoretical overflow issue.
    But it doesn't affect any actual in-tree users.  Fix it by using
    a larger type for one of the local variables.
    
    Long version:
    
    There is an overflow in variable m in function num_digits when val
    is >= 1410065408 which leads to the digit calculation loop to
    iterate more times than required. This results in either more
    digits being counted or in some cases (for example where val is
    1932683193) the value of m eventually overflows to zero and the
    while loop spins forever).
    
    Currently the function num_digits is currently only being used for
    small values of val in the SMP boot stage for digit counting on the
    number of cpus and NUMA nodes, so the overflow is never encountered.
    However it is useful to fix the overflow issue in case the function
    is used for other purposes in the future. (The issue was discovered
    while investigating the digit counting performance in various
    kernel helper functions rather than any real-world use-case).
    
    The simplest fix is to make m a long long, the overhead in
    multiplication speed for a long long is very minor for small values
    of val less than 10000 on modern processors. The alternative
    fix is to replace the multiplication with a constant division
    by 10 loop (this compiles down to an multiplication and shift)
    without needing to make m a long long, but this is slightly slower
    than the fix in this commit when measured on a range of x86
    processors).
    
    [ dhansen: subject and changelog tweaks ]
    
    Fixes: 646e29a1789a ("x86: Improve the printout of the SMP bootup CPU table")
    Signed-off-by: Colin Ian King <colin.i.king@xxxxxxxxx>
    Signed-off-by: Dave Hansen <dave.hansen@xxxxxxxxxxxxxxx>
    Link: https://lore.kernel.org/all/20231102174901.2590325-1-colin.i.king%40gmail.com
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/arch/x86/lib/misc.c b/arch/x86/lib/misc.c
index a018ec4fba53..c97be9a1430a 100644
--- a/arch/x86/lib/misc.c
+++ b/arch/x86/lib/misc.c
@@ -6,7 +6,7 @@
  */
 int num_digits(int val)
 {
-	int m = 10;
+	long long m = 10;
 	int d = 1;
 
 	if (val < 0) {




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux