From 237e73eccaf1e59dccad9193a8f7bc621e275d0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Corentin=20No=C3=ABl?= Date: Thu, 12 Jan 2023 11:26:04 +0100 Subject: [PATCH] gbm: Avoid leaks on screen creation failures MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Some of the code paths were not freeing the allocated strings, also remove the unused ret variable as we are always returning -1 on failure. Signed-off-by: Corentin Noël Reviewed-by: Simon Ser Part-of: --- src/gbm/backends/dri/gbm_dri.c | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c index 368d32593bf..ed76087b20b 100644 --- a/src/gbm/backends/dri/gbm_dri.c +++ b/src/gbm/backends/dri/gbm_dri.c @@ -333,15 +333,12 @@ static int dri_screen_create_for_driver(struct gbm_dri_device *dri, char *driver_name) { bool swrast = driver_name == NULL; /* If it's pure swrast, not just swkms. */ - int ret = 0; dri->driver_name = swrast ? strdup("swrast") : driver_name; - if (dri->driver_name == NULL) - return -1; const __DRIextension **extensions = dri_open_driver(dri); if (!extensions) - return -1; + goto fail; bool bind_ok; if (!swrast) { @@ -353,33 +350,26 @@ dri_screen_create_for_driver(struct gbm_dri_device *dri, char *driver_name) ARRAY_SIZE(gbm_swrast_device_extensions), extensions); } + if (!bind_ok) { - dlclose(dri->driver); fprintf(stderr, "failed to bind extensions\n"); - return -1; + goto close_driver; } dri->driver_extensions = extensions; - - if (ret) { - fprintf(stderr, "failed to load driver: %s\n", dri->driver_name); - return ret; - } - dri->loader_extensions = gbm_dri_screen_extensions; dri->screen = dri->mesa->createNewScreen(0, swrast ? -1 : dri->base.v0.fd, dri->loader_extensions, dri->driver_extensions, &dri->driver_configs, dri); if (dri->screen == NULL) - return -1; + goto close_driver; if (!swrast) { extensions = dri->core->getExtensions(dri->screen); if (!loader_bind_extensions(dri, dri_core_extensions, ARRAY_SIZE(dri_core_extensions), extensions)) { - ret = -1; goto free_screen; } } @@ -392,7 +382,12 @@ dri_screen_create_for_driver(struct gbm_dri_device *dri, char *driver_name) free_screen: dri->core->destroyScreen(dri->screen); - return ret; +close_driver: + dlclose(dri->driver); + +fail: + free(dri->driver_name); + return -1; } static int