devilhorns pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=41147645d7152f52a9e2774befbef2fbbdf028c3
commit 41147645d7152f52a9e2774befbef2fbbdf028c3 Author: Chris Michael <[email protected]> Date: Thu Aug 28 15:40:17 2014 -0400 ecore-drm: Add local function to free outputs and on any errors during create, call it Basically, this will fix a potential leak (and a potential case of a false output getting added) IF during creation of outputs, something fails. @fix Signed-off-by: Chris Michael <[email protected]> --- src/lib/ecore_drm/ecore_drm_output.c | 38 ++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/src/lib/ecore_drm/ecore_drm_output.c b/src/lib/ecore_drm/ecore_drm_output.c index bf1cca6..1aa9845 100644 --- a/src/lib/ecore_drm/ecore_drm_output.c +++ b/src/lib/ecore_drm/ecore_drm_output.c @@ -366,8 +366,11 @@ _ecore_drm_output_create(Ecore_Drm_Device *dev, drmModeRes *res, drmModeConnecto } } - if (!output->current_mode) - output->current_mode = _ecore_drm_output_mode_add(output, &crtc_mode); + if ((!output->current_mode) && (crtc_mode.clock != 0)) + { + output->current_mode = _ecore_drm_output_mode_add(output, &crtc_mode); + if (!output->current_mode) goto mode_err; + } /* #ifdef HAVE_GBM */ /* if ((dev->use_hw_accel) && (dev->gbm)) */ @@ -394,11 +397,14 @@ _ecore_drm_output_create(Ecore_Drm_Device *dev, drmModeRes *res, drmModeConnecto DBG("Setup Output %d for Software Rendering", output->crtc_id); } - /* TODO */ + /* TODO: Backlight */ return output; mode_err: + eina_stringshare_del(output->make); + eina_stringshare_del(output->model); + eina_stringshare_del(output->name); EINA_LIST_FREE(output->modes, mode) free(mode); drmModeFreeCrtc(output->crtc); @@ -407,6 +413,26 @@ mode_err: return NULL; } +static void +_ecore_drm_output_free(Ecore_Drm_Output *output) +{ + Ecore_Drm_Output_Mode *mode; + + if (!output) return; + + eina_stringshare_del(output->make); + eina_stringshare_del(output->model); + eina_stringshare_del(output->name); + + EINA_LIST_FREE(output->modes, mode) + free(mode); + + drmModeFreeCrtc(output->crtc); + dev->crtc_allocator &= ~(1 << output->crtc_id); + + free(output); +} + void _ecore_drm_output_frame_finish(Ecore_Drm_Output *output) { @@ -521,15 +547,16 @@ ecore_drm_outputs_create(Ecore_Drm_Device *dev) { /* free the connector */ drmModeFreeConnector(conn); + _ecore_drm_output_free(output); continue; } output->drm_fd = dev->drm.fd; - dev->outputs = eina_list_append(dev->outputs, output); if (!(enc = drmModeGetEncoder(dev->drm.fd, conn->encoder_id))) { drmModeFreeConnector(conn); + _ecore_drm_output_free(output); continue; } @@ -537,6 +564,7 @@ ecore_drm_outputs_create(Ecore_Drm_Device *dev) { drmModeFreeEncoder(enc); drmModeFreeConnector(conn); + _ecore_drm_output_free(output); continue; } @@ -544,6 +572,8 @@ ecore_drm_outputs_create(Ecore_Drm_Device *dev) drmModeFreeCrtc(crtc); drmModeFreeEncoder(enc); + + dev->outputs = eina_list_append(dev->outputs, output); } /* free the connector */ --
