Skip to content

Commit a18c0af

Browse files
thierryredingdanvet
authored andcommitted
drm: Zero out DRM object memory upon cleanup
Drivers where the DRM objects have a lifetime that extends beyond that of the DRM device need to zero out the DRM object memory to void stale data such as properties. The DRM core code expects to operate on newly allocated and zeroed out objects and will behave unexpectedly, such as add duplicate properties, otherwise. Signed-off-by: Thierry Reding <treding@nvidia.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
1 parent 393e872 commit a18c0af

File tree

1 file changed

+10
-1
lines changed

1 file changed

+10
-1
lines changed

drivers/gpu/drm/drm_crtc.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -725,6 +725,8 @@ void drm_crtc_cleanup(struct drm_crtc *crtc)
725725
WARN_ON(crtc->state && !crtc->funcs->atomic_destroy_state);
726726
if (crtc->state && crtc->funcs->atomic_destroy_state)
727727
crtc->funcs->atomic_destroy_state(crtc, crtc->state);
728+
729+
memset(crtc, 0, sizeof(*crtc));
728730
}
729731
EXPORT_SYMBOL(drm_crtc_cleanup);
730732

@@ -927,6 +929,8 @@ void drm_connector_cleanup(struct drm_connector *connector)
927929
if (connector->state && connector->funcs->atomic_destroy_state)
928930
connector->funcs->atomic_destroy_state(connector,
929931
connector->state);
932+
933+
memset(connector, 0, sizeof(*connector));
930934
}
931935
EXPORT_SYMBOL(drm_connector_cleanup);
932936

@@ -1068,6 +1072,8 @@ void drm_bridge_cleanup(struct drm_bridge *bridge)
10681072
list_del(&bridge->head);
10691073
dev->mode_config.num_bridge--;
10701074
drm_modeset_unlock_all(dev);
1075+
1076+
memset(bridge, 0, sizeof(*bridge));
10711077
}
10721078
EXPORT_SYMBOL(drm_bridge_cleanup);
10731079

@@ -1134,10 +1140,11 @@ void drm_encoder_cleanup(struct drm_encoder *encoder)
11341140
drm_modeset_lock_all(dev);
11351141
drm_mode_object_put(dev, &encoder->base);
11361142
kfree(encoder->name);
1137-
encoder->name = NULL;
11381143
list_del(&encoder->head);
11391144
dev->mode_config.num_encoder--;
11401145
drm_modeset_unlock_all(dev);
1146+
1147+
memset(encoder, 0, sizeof(*encoder));
11411148
}
11421149
EXPORT_SYMBOL(drm_encoder_cleanup);
11431150

@@ -1257,6 +1264,8 @@ void drm_plane_cleanup(struct drm_plane *plane)
12571264
WARN_ON(plane->state && !plane->funcs->atomic_destroy_state);
12581265
if (plane->state && plane->funcs->atomic_destroy_state)
12591266
plane->funcs->atomic_destroy_state(plane, plane->state);
1267+
1268+
memset(plane, 0, sizeof(*plane));
12601269
}
12611270
EXPORT_SYMBOL(drm_plane_cleanup);
12621271

0 commit comments

Comments
 (0)