Skip to content

Commit d3baa34

Browse files
Agalakov Daniilanguy11
authored andcommitted
e1000: check return value of e1000_read_eeprom
[Why] e1000_set_eeprom() performs a read-modify-write operation when the write range is not word-aligned. This requires reading the first and last words of the range from the EEPROM to preserve the unmodified bytes. However, the code does not check the return value of e1000_read_eeprom(). If the read fails, the operation continues using uninitialized data from eeprom_buff. This results in corrupted data being written back to the EEPROM for the boundary words. Add the missing error checks and abort the operation if reading fails. Found by Linux Verification Center (linuxtesting.org) with SVACE. Fixes: 1da177e ("Linux-2.6.12-rc2") Co-developed-by: Iskhakov Daniil <dish@amicon.ru> Signed-off-by: Iskhakov Daniil <dish@amicon.ru> Signed-off-by: Agalakov Daniil <ade@amicon.ru> Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com> Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
1 parent b1e0672 commit d3baa34

1 file changed

Lines changed: 7 additions & 1 deletion

File tree

drivers/net/ethernet/intel/e1000/e1000_ethtool.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -496,14 +496,19 @@ static int e1000_set_eeprom(struct net_device *netdev,
496496
*/
497497
ret_val = e1000_read_eeprom(hw, first_word, 1,
498498
&eeprom_buff[0]);
499+
if (ret_val)
500+
goto out;
501+
499502
ptr++;
500503
}
501-
if (((eeprom->offset + eeprom->len) & 1) && (ret_val == 0)) {
504+
if ((eeprom->offset + eeprom->len) & 1) {
502505
/* need read/modify/write of last changed EEPROM word
503506
* only the first byte of the word is being modified
504507
*/
505508
ret_val = e1000_read_eeprom(hw, last_word, 1,
506509
&eeprom_buff[last_word - first_word]);
510+
if (ret_val)
511+
goto out;
507512
}
508513

509514
/* Device's eeprom is always little-endian, word addressable */
@@ -522,6 +527,7 @@ static int e1000_set_eeprom(struct net_device *netdev,
522527
if ((ret_val == 0) && (first_word <= EEPROM_CHECKSUM_REG))
523528
e1000_update_eeprom_checksum(hw);
524529

530+
out:
525531
kfree(eeprom_buff);
526532
return ret_val;
527533
}

0 commit comments

Comments
 (0)