Patch "modpost: fix input MODULE_DEVICE_TABLE() built for 64-bit on 32-bit host" has been added to the 5.10-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

    modpost: fix input MODULE_DEVICE_TABLE() built for 64-bit on 32-bit host

to the 5.10-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:
     modpost-fix-input-module_device_table-built-for-64-b.patch
and it can be found in the queue-5.10 subdirectory.

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



commit be523fd4b1af2ac1682fac157e28c521928e4e39
Author: Masahiro Yamada <masahiroy@xxxxxxxxxx>
Date:   Sun Nov 3 21:52:57 2024 +0900

    modpost: fix input MODULE_DEVICE_TABLE() built for 64-bit on 32-bit host
    
    [ Upstream commit 77dc55a978e69625f9718460012e5ef0172dc4de ]
    
    When building a 64-bit kernel on a 32-bit build host, incorrect
    input MODULE_ALIAS() entries may be generated.
    
    For example, when compiling a 64-bit kernel with CONFIG_INPUT_MOUSEDEV=m
    on a 64-bit build machine, you will get the correct output:
    
      $ grep MODULE_ALIAS drivers/input/mousedev.mod.c
      MODULE_ALIAS("input:b*v*p*e*-e*1,*2,*k*110,*r*0,*1,*a*m*l*s*f*w*");
      MODULE_ALIAS("input:b*v*p*e*-e*1,*2,*k*r*8,*a*m*l*s*f*w*");
      MODULE_ALIAS("input:b*v*p*e*-e*1,*3,*k*14A,*r*a*0,*1,*m*l*s*f*w*");
      MODULE_ALIAS("input:b*v*p*e*-e*1,*3,*k*145,*r*a*0,*1,*18,*1C,*m*l*s*f*w*");
      MODULE_ALIAS("input:b*v*p*e*-e*1,*3,*k*110,*r*a*0,*1,*m*l*s*f*w*");
    
    However, building the same kernel on a 32-bit machine results in
    incorrect output:
    
      $ grep MODULE_ALIAS drivers/input/mousedev.mod.c
      MODULE_ALIAS("input:b*v*p*e*-e*1,*2,*k*110,*130,*r*0,*1,*a*m*l*s*f*w*");
      MODULE_ALIAS("input:b*v*p*e*-e*1,*2,*k*r*8,*a*m*l*s*f*w*");
      MODULE_ALIAS("input:b*v*p*e*-e*1,*3,*k*14A,*16A,*r*a*0,*1,*20,*21,*m*l*s*f*w*");
      MODULE_ALIAS("input:b*v*p*e*-e*1,*3,*k*145,*165,*r*a*0,*1,*18,*1C,*20,*21,*38,*3C,*m*l*s*f*w*");
      MODULE_ALIAS("input:b*v*p*e*-e*1,*3,*k*110,*130,*r*a*0,*1,*20,*21,*m*l*s*f*w*");
    
    A similar issue occurs with CONFIG_INPUT_JOYDEV=m. On a 64-bit build
    machine, the output is:
    
      $ grep MODULE_ALIAS drivers/input/joydev.mod.c
      MODULE_ALIAS("input:b*v*p*e*-e*3,*k*r*a*0,*m*l*s*f*w*");
      MODULE_ALIAS("input:b*v*p*e*-e*3,*k*r*a*2,*m*l*s*f*w*");
      MODULE_ALIAS("input:b*v*p*e*-e*3,*k*r*a*8,*m*l*s*f*w*");
      MODULE_ALIAS("input:b*v*p*e*-e*3,*k*r*a*6,*m*l*s*f*w*");
      MODULE_ALIAS("input:b*v*p*e*-e*1,*k*120,*r*a*m*l*s*f*w*");
      MODULE_ALIAS("input:b*v*p*e*-e*1,*k*130,*r*a*m*l*s*f*w*");
      MODULE_ALIAS("input:b*v*p*e*-e*1,*k*2C0,*r*a*m*l*s*f*w*");
    
    However, on a 32-bit machine, the output is incorrect:
    
      $ grep MODULE_ALIAS drivers/input/joydev.mod.c
      MODULE_ALIAS("input:b*v*p*e*-e*3,*k*r*a*0,*20,*m*l*s*f*w*");
      MODULE_ALIAS("input:b*v*p*e*-e*3,*k*r*a*2,*22,*m*l*s*f*w*");
      MODULE_ALIAS("input:b*v*p*e*-e*3,*k*r*a*8,*28,*m*l*s*f*w*");
      MODULE_ALIAS("input:b*v*p*e*-e*3,*k*r*a*6,*26,*m*l*s*f*w*");
      MODULE_ALIAS("input:b*v*p*e*-e*1,*k*11F,*13F,*r*a*m*l*s*f*w*");
      MODULE_ALIAS("input:b*v*p*e*-e*1,*k*11F,*13F,*r*a*m*l*s*f*w*");
      MODULE_ALIAS("input:b*v*p*e*-e*1,*k*2C0,*2E0,*r*a*m*l*s*f*w*");
    
    When building a 64-bit kernel, BITS_PER_LONG is defined as 64. However,
    on a 32-bit build machine, the constant 1L is a signed 32-bit value.
    Left-shifting it beyond 32 bits causes wraparound, and shifting by 31
    or 63 bits makes it a negative value.
    
    The fix in commit e0e92632715f ("[PATCH] PATCH: 1 line 2.6.18 bugfix:
    modpost-64bit-fix.patch") is incorrect; it only addresses cases where
    a 64-bit kernel is built on a 64-bit build machine, overlooking cases
    on a 32-bit build machine.
    
    Using 1ULL ensures a 64-bit width on both 32-bit and 64-bit machines,
    avoiding the wraparound issue.
    
    Fixes: e0e92632715f ("[PATCH] PATCH: 1 line 2.6.18 bugfix: modpost-64bit-fix.patch")
    Signed-off-by: Masahiro Yamada <masahiroy@xxxxxxxxxx>
    Stable-dep-of: bf36b4bf1b9a ("modpost: fix the missed iteration for the max bit in do_input()")
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c
index 1c9c33f491e6..2febe2b8bedb 100644
--- a/scripts/mod/file2alias.c
+++ b/scripts/mod/file2alias.c
@@ -720,7 +720,7 @@ static void do_input(char *alias,
 	for (i = min / BITS_PER_LONG; i < max / BITS_PER_LONG + 1; i++)
 		arr[i] = TO_NATIVE(arr[i]);
 	for (i = min; i < max; i++)
-		if (arr[i / BITS_PER_LONG] & (1L << (i%BITS_PER_LONG)))
+		if (arr[i / BITS_PER_LONG] & (1ULL << (i%BITS_PER_LONG)))
 			sprintf(alias + strlen(alias), "%X,*", i);
 }
 




[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