[PATCH v1 3/3] drm/amdgpu: Prevent random memory access in FRU code
Russell, Kent
Kent.Russell at amd.com
Fri Feb 4 15:06:41 UTC 2022
One tiny thing to fix before merging
> -----Original Message-----
> From: Kasiviswanathan, Harish <Harish.Kasiviswanathan at amd.com>
> Sent: Friday, February 4, 2022 10:01 AM
> To: Tuikov, Luben <Luben.Tuikov at amd.com>; amd-gfx at lists.freedesktop.org
> Cc: Deucher, Alexander <Alexander.Deucher at amd.com>; Tuikov, Luben
> <Luben.Tuikov at amd.com>; Russell, Kent <Kent.Russell at amd.com>
> Subject: RE: [PATCH v1 3/3] drm/amdgpu: Prevent random memory access in FRU code
>
> [AMD Official Use Only]
>
> This series acked-by: Harish Kasiviswanathan <Harish.Kasiviswanathan at amd.com>
>
> -----Original Message-----
> From: amd-gfx <amd-gfx-bounces at lists.freedesktop.org> On Behalf Of Luben Tuikov
> Sent: Friday, February 4, 2022 12:27 AM
> To: amd-gfx at lists.freedesktop.org
> Cc: Deucher, Alexander <Alexander.Deucher at amd.com>; Tuikov, Luben
> <Luben.Tuikov at amd.com>; Russell, Kent <Kent.Russell at amd.com>
> Subject: [PATCH v1 3/3] drm/amdgpu: Prevent random memory access in FRU code
>
> Prevent random memory access in the FRU EEPROM code by passing the size of
> the destination buffer to the reading routine, and reading no more than the
> size of the buffer.
>
> Cc: Kent Russell <kent.russell at amd.com>
> Cc: Alex Deucher <Alexander.Deucher at amd.com>
> Signed-off-by: Luben Tuikov <luben.tuikov at amd.com>
> ---
> .../gpu/drm/amd/amdgpu/amdgpu_fru_eeprom.c | 21 +++++++++++--------
> 1 file changed, 12 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fru_eeprom.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_fru_eeprom.c
> index 61c4e71e399855..07e045fae83a9a 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fru_eeprom.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fru_eeprom.c
> @@ -77,9 +77,10 @@ static bool is_fru_eeprom_supported(struct amdgpu_device *adev)
> }
>
> static int amdgpu_fru_read_eeprom(struct amdgpu_device *adev, uint32_t addrptr,
> - unsigned char *buf)
> + unsigned char *buf, size_t buf_size)
> {
> - int ret, size;
> + int ret;
> + u8 size;
>
> ret = amdgpu_eeprom_read(adev->pm.fru_eeprom_i2c_bus, addrptr, buf, 1);
> if (ret < 1) {
> @@ -90,9 +91,11 @@ static int amdgpu_fru_read_eeprom(struct amdgpu_device *adev,
> uint32_t addrptr,
> /* The size returned by the i2c requires subtraction of 0xC0 since the
> * size apparently always reports as 0xC0+actual size.
> */
> - size = buf[0] - I2C_PRODUCT_INFO_OFFSET;
You can also remove this definition from the eeprom.h file, since it's no longer needed.
Kent
> + size = buf[0] & 0x3F;
> + size = min_t(size_t, size, buf_size);
>
> - ret = amdgpu_eeprom_read(adev->pm.fru_eeprom_i2c_bus, addrptr + 1, buf, size);
> + ret = amdgpu_eeprom_read(adev->pm.fru_eeprom_i2c_bus, addrptr + 1,
> + buf, size);
> if (ret < 1) {
> DRM_WARN("FRU: Failed to get data field");
> return ret;
> @@ -129,7 +132,7 @@ int amdgpu_fru_get_product_info(struct amdgpu_device *adev)
> * and the language field, so just start from 0xb, manufacturer size
> */
> addrptr = FRU_EEPROM_MADDR + 0xb;
> - size = amdgpu_fru_read_eeprom(adev, addrptr, buf);
> + size = amdgpu_fru_read_eeprom(adev, addrptr, buf, sizeof(buf));
> if (size < 1) {
> DRM_ERROR("Failed to read FRU Manufacturer, ret:%d", size);
> return -EINVAL;
> @@ -139,7 +142,7 @@ int amdgpu_fru_get_product_info(struct amdgpu_device *adev)
> * size field being 1 byte. This pattern continues below.
> */
> addrptr += size + 1;
> - size = amdgpu_fru_read_eeprom(adev, addrptr, buf);
> + size = amdgpu_fru_read_eeprom(adev, addrptr, buf, sizeof(buf));
> if (size < 1) {
> DRM_ERROR("Failed to read FRU product name, ret:%d", size);
> return -EINVAL;
> @@ -155,7 +158,7 @@ int amdgpu_fru_get_product_info(struct amdgpu_device *adev)
> adev->product_name[len] = '\0';
>
> addrptr += size + 1;
> - size = amdgpu_fru_read_eeprom(adev, addrptr, buf);
> + size = amdgpu_fru_read_eeprom(adev, addrptr, buf, sizeof(buf));
> if (size < 1) {
> DRM_ERROR("Failed to read FRU product number, ret:%d", size);
> return -EINVAL;
> @@ -173,7 +176,7 @@ int amdgpu_fru_get_product_info(struct amdgpu_device *adev)
> adev->product_number[len] = '\0';
>
> addrptr += size + 1;
> - size = amdgpu_fru_read_eeprom(adev, addrptr, buf);
> + size = amdgpu_fru_read_eeprom(adev, addrptr, buf, sizeof(buf));
>
> if (size < 1) {
> DRM_ERROR("Failed to read FRU product version, ret:%d", size);
> @@ -181,7 +184,7 @@ int amdgpu_fru_get_product_info(struct amdgpu_device *adev)
> }
>
> addrptr += size + 1;
> - size = amdgpu_fru_read_eeprom(adev, addrptr, buf);
> + size = amdgpu_fru_read_eeprom(adev, addrptr, buf, sizeof(buf));
>
> if (size < 1) {
> DRM_ERROR("Failed to read FRU serial number, ret:%d", size);
> --
> 2.35.0.3.gb23dac905b
More information about the amd-gfx
mailing list