Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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 <tzimmermann@suse.de>
Link: https://patchwork.freedesktop.org/patch/msgid/20250116-google-vkms-managed-v9-6-3e4ae1bd05a0@bootlin.com
Signed-off-by: Louis Chauvet <louis.chauvet@bootlin.com>

+25 -4
+25 -4
drivers/gpu/drm/drm_writeback.c
··· 196 196 } 197 197 EXPORT_SYMBOL(drm_writeback_connector_init); 198 198 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 + 199 215 /** 200 216 * drm_writeback_connector_init_with_encoder - Initialize a writeback connector with 201 217 * a custom encoder ··· 247 231 int ret = create_writeback_properties(dev); 248 232 249 233 if (ret != 0) 250 - return ret; 234 + goto failed_properties; 251 235 252 236 connector->interlace_allowed = 0; 253 237 254 238 ret = drm_connector_attach_encoder(connector, enc); 255 239 if (ret) 256 - return ret; 240 + goto failed_properties; 257 241 258 242 blob = drm_property_create_blob(dev, n_formats * sizeof(*formats), 259 243 formats); 260 - if (IS_ERR(blob)) 261 - return PTR_ERR(blob); 244 + if (IS_ERR(blob)) { 245 + ret = PTR_ERR(blob); 246 + goto failed_properties; 247 + } 262 248 263 249 INIT_LIST_HEAD(&wb_connector->job_queue); 264 250 spin_lock_init(&wb_connector->job_lock); ··· 283 265 wb_connector->pixel_formats_blob_ptr = blob; 284 266 285 267 return 0; 268 + failed_properties: 269 + delete_writeback_properties(dev); 270 + return ret; 286 271 } 287 272 288 273 /**