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 */

-- 


Reply via email to