Skip to content

Commit 2f3f4a7

Browse files
committed
drm: writeback: Add missing cleanup in case of initialization failure
The current implementation of drm_writeback_connector initialization does not properly clean up all resources in case of failure (allocated properties and possible_encoders). Add this cleaning in case of failure. Acked-by: Thomas Zimmermann <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected] Signed-off-by: Louis Chauvet <[email protected]>
1 parent 135d8fc commit 2f3f4a7

File tree

1 file changed

+25
-4
lines changed

1 file changed

+25
-4
lines changed

drivers/gpu/drm/drm_writeback.c

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,22 @@ int drm_writeback_connector_init(struct drm_device *dev,
196196
}
197197
EXPORT_SYMBOL(drm_writeback_connector_init);
198198

199+
static void delete_writeback_properties(struct drm_device *dev)
200+
{
201+
if (dev->mode_config.writeback_pixel_formats_property) {
202+
drm_property_destroy(dev, dev->mode_config.writeback_pixel_formats_property);
203+
dev->mode_config.writeback_pixel_formats_property = NULL;
204+
}
205+
if (dev->mode_config.writeback_out_fence_ptr_property) {
206+
drm_property_destroy(dev, dev->mode_config.writeback_out_fence_ptr_property);
207+
dev->mode_config.writeback_out_fence_ptr_property = NULL;
208+
}
209+
if (dev->mode_config.writeback_fb_id_property) {
210+
drm_property_destroy(dev, dev->mode_config.writeback_fb_id_property);
211+
dev->mode_config.writeback_fb_id_property = NULL;
212+
}
213+
}
214+
199215
/**
200216
* drm_writeback_connector_init_with_encoder - Initialize a writeback connector with
201217
* a custom encoder
@@ -231,18 +247,20 @@ static int __drm_writeback_connector_init(struct drm_device *dev,
231247
int ret = create_writeback_properties(dev);
232248

233249
if (ret != 0)
234-
return ret;
250+
goto failed_properties;
235251

236252
connector->interlace_allowed = 0;
237253

238254
ret = drm_connector_attach_encoder(connector, enc);
239255
if (ret)
240-
return ret;
256+
goto failed_properties;
241257

242258
blob = drm_property_create_blob(dev, n_formats * sizeof(*formats),
243259
formats);
244-
if (IS_ERR(blob))
245-
return PTR_ERR(blob);
260+
if (IS_ERR(blob)) {
261+
ret = PTR_ERR(blob);
262+
goto failed_properties;
263+
}
246264

247265
INIT_LIST_HEAD(&wb_connector->job_queue);
248266
spin_lock_init(&wb_connector->job_lock);
@@ -265,6 +283,9 @@ static int __drm_writeback_connector_init(struct drm_device *dev,
265283
wb_connector->pixel_formats_blob_ptr = blob;
266284

267285
return 0;
286+
failed_properties:
287+
delete_writeback_properties(dev);
288+
return ret;
268289
}
269290

270291
/**

0 commit comments

Comments
 (0)