Patch "HID: nintendo: Prevent divide-by-zero on code" has been added to the 6.1-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

    HID: nintendo: Prevent divide-by-zero on code

to the 6.1-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:
     hid-nintendo-prevent-divide-by-zero-on-code.patch
and it can be found in the queue-6.1 subdirectory.

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



commit b51cfd2a226fef306b59eb54199fe3c8e1301c26
Author: Guilherme G. Piccoli <gpiccoli@xxxxxxxxxx>
Date:   Tue Dec 5 18:15:51 2023 -0300

    HID: nintendo: Prevent divide-by-zero on code
    
    [ Upstream commit 6eb04ca8c52e3f8c8ea7102ade81d642eee87f4a ]
    
    It was reported [0] that adding a generic joycon to the system caused
    a kernel crash on Steam Deck, with the below panic spew:
    
    divide error: 0000 [#1] PREEMPT SMP NOPTI
    [...]
    Hardware name: Valve Jupiter/Jupiter, BIOS F7A0119 10/24/2023
    RIP: 0010:nintendo_hid_event+0x340/0xcc1 [hid_nintendo]
    [...]
    Call Trace:
     [...]
     ? exc_divide_error+0x38/0x50
     ? nintendo_hid_event+0x340/0xcc1 [hid_nintendo]
     ? asm_exc_divide_error+0x1a/0x20
     ? nintendo_hid_event+0x307/0xcc1 [hid_nintendo]
     hid_input_report+0x143/0x160
     hidp_session_run+0x1ce/0x700 [hidp]
    
    Since it's a divide-by-0 error, by tracking the code for potential
    denominator issues, we've spotted 2 places in which this could happen;
    so let's guard against the possibility and log in the kernel if the
    condition happens. This is specially useful since some data that
    fills some denominators are read from the joycon HW in some cases,
    increasing the potential for flaws.
    
    [0] https://github.com/ValveSoftware/SteamOS/issues/1070
    
    Signed-off-by: Guilherme G. Piccoli <gpiccoli@xxxxxxxxxx>
    Tested-by: Sam Lantinga <slouken@xxxxxxxxxx>
    Signed-off-by: Jiri Kosina <jkosina@xxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/hid/hid-nintendo.c b/drivers/hid/hid-nintendo.c
index 907c9b574e3b..df07e3ae0ffb 100644
--- a/drivers/hid/hid-nintendo.c
+++ b/drivers/hid/hid-nintendo.c
@@ -859,14 +859,27 @@ static int joycon_request_calibration(struct joycon_ctlr *ctlr)
  */
 static void joycon_calc_imu_cal_divisors(struct joycon_ctlr *ctlr)
 {
-	int i;
+	int i, divz = 0;
 
 	for (i = 0; i < 3; i++) {
 		ctlr->imu_cal_accel_divisor[i] = ctlr->accel_cal.scale[i] -
 						ctlr->accel_cal.offset[i];
 		ctlr->imu_cal_gyro_divisor[i] = ctlr->gyro_cal.scale[i] -
 						ctlr->gyro_cal.offset[i];
+
+		if (ctlr->imu_cal_accel_divisor[i] == 0) {
+			ctlr->imu_cal_accel_divisor[i] = 1;
+			divz++;
+		}
+
+		if (ctlr->imu_cal_gyro_divisor[i] == 0) {
+			ctlr->imu_cal_gyro_divisor[i] = 1;
+			divz++;
+		}
 	}
+
+	if (divz)
+		hid_warn(ctlr->hdev, "inaccurate IMU divisors (%d)\n", divz);
 }
 
 static const s16 DFLT_ACCEL_OFFSET /*= 0*/;
@@ -1095,16 +1108,16 @@ static void joycon_parse_imu_report(struct joycon_ctlr *ctlr,
 		    JC_IMU_SAMPLES_PER_DELTA_AVG) {
 			ctlr->imu_avg_delta_ms = ctlr->imu_delta_samples_sum /
 						 ctlr->imu_delta_samples_count;
-			/* don't ever want divide by zero shenanigans */
-			if (ctlr->imu_avg_delta_ms == 0) {
-				ctlr->imu_avg_delta_ms = 1;
-				hid_warn(ctlr->hdev,
-					 "calculated avg imu delta of 0\n");
-			}
 			ctlr->imu_delta_samples_count = 0;
 			ctlr->imu_delta_samples_sum = 0;
 		}
 
+		/* don't ever want divide by zero shenanigans */
+		if (ctlr->imu_avg_delta_ms == 0) {
+			ctlr->imu_avg_delta_ms = 1;
+			hid_warn(ctlr->hdev, "calculated avg imu delta of 0\n");
+		}
+
 		/* useful for debugging IMU sample rate */
 		hid_dbg(ctlr->hdev,
 			"imu_report: ms=%u last_ms=%u delta=%u avg_delta=%u\n",




[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