Skip to content

Commit 04fc52f

Browse files
Maciej Purskidaeinki
authored andcommitted
drm/exynos/hdmi: Fix unsafe list iteration
Function hdmi_mode_fixup() used bare list_for_each entry, which was unsafe and caused memory corruption detected by kasan. It now uses drm_for_each_connector_iter macro, which is now recommended by the documentation and safe. Signed-off-by: Maciej Purski <[email protected]> Signed-off-by: Inki Dae <[email protected]>
1 parent 9ac30ef commit 04fc52f

File tree

1 file changed

+11
-3
lines changed

1 file changed

+11
-3
lines changed

drivers/gpu/drm/exynos/exynos_hdmi.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -944,22 +944,27 @@ static bool hdmi_mode_fixup(struct drm_encoder *encoder,
944944
struct drm_device *dev = encoder->dev;
945945
struct drm_connector *connector;
946946
struct drm_display_mode *m;
947+
struct drm_connector_list_iter conn_iter;
947948
int mode_ok;
948949

949950
drm_mode_set_crtcinfo(adjusted_mode, 0);
950951

951-
list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
952+
drm_connector_list_iter_begin(dev, &conn_iter);
953+
drm_for_each_connector_iter(connector, &conn_iter) {
952954
if (connector->encoder == encoder)
953955
break;
954956
}
957+
if (connector)
958+
drm_connector_get(connector);
959+
drm_connector_list_iter_end(&conn_iter);
955960

956-
if (connector->encoder != encoder)
961+
if (!connector)
957962
return true;
958963

959964
mode_ok = hdmi_mode_valid(connector, adjusted_mode);
960965

961966
if (mode_ok == MODE_OK)
962-
return true;
967+
goto cleanup;
963968

964969
/*
965970
* Find the most suitable mode and copy it to adjusted_mode.
@@ -979,6 +984,9 @@ static bool hdmi_mode_fixup(struct drm_encoder *encoder,
979984
}
980985
}
981986

987+
cleanup:
988+
drm_connector_put(connector);
989+
982990
return true;
983991
}
984992

0 commit comments

Comments
 (0)