billiob pushed a commit to branch master.

http://git.enlightenment.org/apps/terminology.git/commit/?id=4c9091c9c6a64b836c6eb34618f9c9fd54596ed7

commit 4c9091c9c6a64b836c6eb34618f9c9fd54596ed7
Author: Boris Faure <[email protected]>
Date:   Mon Apr 6 23:11:10 2020 +0200

    controls: avoid uses after free
    
    CID1422109
    CID1422110
    CID1422111
---
 src/bin/controls.c | 31 ++++++++++++++++++++++++++-----
 src/bin/main.c     |  6 ++----
 src/bin/win.c      |  6 ++----
 src/bin/win.h      |  4 ++--
 4 files changed, 32 insertions(+), 15 deletions(-)

diff --git a/src/bin/controls.c b/src/bin/controls.c
index 7b89d28..8af7713 100644
--- a/src/bin/controls.c
+++ b/src/bin/controls.c
@@ -22,11 +22,10 @@ typedef struct _Controls_Ctx {
 } Controls_Ctx;
 
 
+/* /!\ can free ctx */
 static void
 controls_hide(Controls_Ctx *ctx, Eina_Bool call_cb);
 
-
-
 static void
 _cb_sel_on(void *data,
            Evas_Object *_term EINA_UNUSED,
@@ -80,6 +79,8 @@ _cb_ct_copy(void *data,
    Evas_Object *term = ctx->term;
 
    controls_hide(ctx, EINA_TRUE);
+   ctx = NULL;
+
    termio_take_selection(term, ELM_SEL_TYPE_CLIPBOARD);
 }
 
@@ -92,6 +93,8 @@ _cb_ct_paste(void *data,
    Evas_Object *term = ctx->term;
 
    controls_hide(ctx, EINA_TRUE);
+   ctx = NULL;
+
    termio_paste_selection(term, ELM_SEL_TYPE_CLIPBOARD);
 }
 
@@ -101,8 +104,12 @@ _cb_ct_new(void *data,
            void *_event EINA_UNUSED)
 {
    Controls_Ctx *ctx = data;
+   Evas_Object *term = ctx->term;
+
    controls_hide(ctx, EINA_TRUE);
-   main_new(ctx->term);
+   ctx = NULL;
+
+   main_new(term);
 }
 
 static void
@@ -111,8 +118,13 @@ _cb_ct_split_v(void *data,
                void *_event EINA_UNUSED)
 {
    Controls_Ctx *ctx = data;
+   Evas_Object *term = ctx->term;
+
+
    controls_hide(ctx, EINA_TRUE);
-   split_vertically(ctx->win, ctx->term, NULL);
+   ctx = NULL;
+
+   split_vertically(term, NULL);
 }
 
 static void
@@ -121,8 +133,12 @@ _cb_ct_split_h(void *data,
                void *_event EINA_UNUSED)
 {
    Controls_Ctx *ctx = data;
+   Evas_Object *term = ctx->term;
+
    controls_hide(ctx, EINA_TRUE);
-   split_horizontally(ctx->win, ctx->term, NULL);
+   ctx = NULL;
+
+   split_horizontally(term, NULL);
 }
 
 static void
@@ -141,7 +157,10 @@ _cb_ct_set_title(void *data,
 {
    Controls_Ctx *ctx = data;
    Evas_Object *term = ctx->term;
+
    controls_hide(ctx, EINA_TRUE);
+   ctx = NULL;
+
    term_set_title(termio_term_get(term));
 }
 
@@ -155,6 +174,8 @@ _cb_ct_close(void *data,
    Evas_Object *win = ctx->win;
 
    controls_hide(ctx, EINA_TRUE);
+   ctx = NULL;
+
    term_close(win, term, EINA_FALSE);
 }
 
diff --git a/src/bin/main.c b/src/bin/main.c
index 35ddece..59092b2 100644
--- a/src/bin/main.c
+++ b/src/bin/main.c
@@ -624,16 +624,14 @@ _start(Ipc_Instance *instance, Eina_Bool 
need_scale_wizard)
              if (instance->startup_split[i] == 'v')
                {
                   cmd = eina_list_data_get(instance->cmds);
-                  split_vertically(win_evas_object_get(term_win_get(next)),
-                                   term_termio_get(next), cmd);
+                  split_vertically(term_termio_get(next), cmd);
                   instance->cmds = eina_list_remove_list(instance->cmds,
                                                          instance->cmds);
                }
              else if (instance->startup_split[i] == 'h')
                {
                   cmd = eina_list_data_get(instance->cmds);
-                  split_horizontally(win_evas_object_get(term_win_get(next)),
-                                     term_termio_get(next), cmd);
+                  split_horizontally(term_termio_get(next), cmd);
                   instance->cmds = eina_list_remove_list(instance->cmds,
                                                          instance->cmds);
                }
diff --git a/src/bin/win.c b/src/bin/win.c
index 36dd21c..8d82b42 100644
--- a/src/bin/win.c
+++ b/src/bin/win.c
@@ -3049,8 +3049,7 @@ _cb_size_hint(void *data,
 }
 
 void
-split_horizontally(Evas_Object *_win EINA_UNUSED,
-                   Evas_Object *term,
+split_horizontally(Evas_Object *term,
                    const char *cmd)
 {
    Term *tm;
@@ -3064,8 +3063,7 @@ split_horizontally(Evas_Object *_win EINA_UNUSED,
 }
 
 void
-split_vertically(Evas_Object *_win EINA_UNUSED,
-                 Evas_Object *term,
+split_vertically(Evas_Object *term,
                  const char *cmd)
 {
    Term *tm;
diff --git a/src/bin/win.h b/src/bin/win.h
index 7b7d6dd..e08a9b8 100644
--- a/src/bin/win.h
+++ b/src/bin/win.h
@@ -18,8 +18,8 @@ void term_set_title(Term *term);
 void term_miniview_hide(Term *term);
 Eina_Bool term_tab_go(Term *term, int tnum);
 
-void split_horizontally(Evas_Object *win, Evas_Object *term, const char *cmd);
-void split_vertically(Evas_Object *win, Evas_Object *term, const char *cmd);
+void split_horizontally(Evas_Object *term, const char *cmd);
+void split_vertically(Evas_Object *term, const char *cmd);
 
 
 Win *

-- 


Reply via email to