From 98e4af96b65564b161e1fd66f31323121f56b302 Mon Sep 17 00:00:00 2001 From: Philo <135693886+philo-micas@users.noreply.github.com> Date: Tue, 16 Jul 2024 23:28:09 +0800 Subject: [PATCH] Fix os crash caused by optoe when class switch (#413) Why: When the device is initially set to optoe2, there is an option ->client [1]. If echo 3>dev_class is manually set at this time, as for optoe3, option ->client [1] is meaningless but the content is still the address data of optoe2, accessing an illegal address will occur, causing the device to crash. How: Set option->client[1] to NULL when unregistering device Closes: #412 Signed-off-by: philo Co-authored-by: Saikrishna Arcot --- ...sh-caused-by-optoe-when-class-switch.patch | 40 +++++++++++++++++++ patch/series | 3 ++ 2 files changed, 43 insertions(+) create mode 100644 patch/0001-fix-os-crash-caused-by-optoe-when-class-switch.patch diff --git a/patch/0001-fix-os-crash-caused-by-optoe-when-class-switch.patch b/patch/0001-fix-os-crash-caused-by-optoe-when-class-switch.patch new file mode 100644 index 000000000..946ae4c3b --- /dev/null +++ b/patch/0001-fix-os-crash-caused-by-optoe-when-class-switch.patch @@ -0,0 +1,40 @@ +From 846abadb7505c10e85a3450a7343d6a89b5ecd96 Mon Sep 17 00:00:00 2001 +From: philo +Date: Fri, 12 Jul 2024 11:12:58 +0800 +Subject: [PATCH] fix os crash caused by optoe when class switch + +--- + drivers/misc/eeprom/optoe.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +diff --git a/drivers/misc/eeprom/optoe.c b/drivers/misc/eeprom/optoe.c +index 9129312a1..63bb8c46a 100644 +--- a/drivers/misc/eeprom/optoe.c ++++ b/drivers/misc/eeprom/optoe.c +@@ -941,8 +941,10 @@ static ssize_t set_dev_class(struct device *dev, + } else { + /* one-address (eg QSFP) and CMIS family */ + /* if it exists, remove 0x51 i2c address */ +- if (optoe->client[1]) ++ if (optoe->client[1]) { + i2c_unregister_device(optoe->client[1]); ++ optoe->client[1] = NULL; ++ } + optoe->bin.size = ONE_ADDR_EEPROM_SIZE; + optoe->num_addresses = 1; + } +@@ -1224,8 +1226,10 @@ static int optoe_probe(struct i2c_client *client, + + err_struct: + if (num_addresses == 2) { +- if (optoe->client[1]) ++ if (optoe->client[1]) { + i2c_unregister_device(optoe->client[1]); ++ optoe->client[1] = NULL; ++ } + } + + kfree(optoe->writebuf); +-- +2.25.1 + diff --git a/patch/series b/patch/series index 443b5d316..4c1f48300 100755 --- a/patch/series +++ b/patch/series @@ -214,6 +214,9 @@ cisco-npu-disable-other-bars.patch # Security patch 0001-Change-the-system.map-file-permission-only-readable-.patch +# Micas patches +0001-fix-os-crash-caused-by-optoe-when-class-switch.patch + # # ############################################################