discomfitor pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=b2409153aa775c1147b97280f7929daff25ff58c

commit b2409153aa775c1147b97280f7929daff25ff58c
Author: Marcel Hollerbach <[email protected]>
Date:   Wed Jun 20 12:24:06 2018 -0400

    elm: refactor do not call efl_data_scope_get on a object without data
    
    Summary:
    A call to efl_data_Scope_get is actually quite dangerous,
    efl_data_scope_get will return a pointer to a 0 sized segment in memory,
    this is happening based on how the class data is organized. So in theory
    you could use this pointer and accidently write to it. This resolves
    this issue.
    
    Reviewers: devilhorns, zmike
    
    Reviewed By: zmike
    
    Subscribers: cedric, #committers, zmike
    
    Tags: #efl
    
    Differential Revision: https://phab.enlightenment.org/D6337
---
 src/lib/elementary/efl_ui_button.c        |  2 +-
 src/lib/elementary/efl_ui_check.c         |  2 +-
 src/lib/elementary/efl_ui_layout_object.c | 35 ++++++++------
 src/lib/elementary/efl_ui_progressbar.c   |  2 +-
 src/lib/elementary/efl_ui_radio.c         |  2 +-
 src/lib/elementary/elm_part_helper.h      | 79 ++++++++++++++++++++-----------
 6 files changed, 76 insertions(+), 46 deletions(-)

diff --git a/src/lib/elementary/efl_ui_button.c 
b/src/lib/elementary/efl_ui_button.c
index 7081d8c915..4a8067f022 100644
--- a/src/lib/elementary/efl_ui_button.c
+++ b/src/lib/elementary/efl_ui_button.c
@@ -494,7 +494,7 @@ _part_is_efl_ui_button_legacy_part(const Eo *obj 
EINA_UNUSED, const char *part)
 }
 
 ELM_PART_OVERRIDE_PARTIAL(efl_ui_button_legacy, EFL_UI_BUTTON_LEGACY, void, 
_part_is_efl_ui_button_legacy_part)
-ELM_PART_OVERRIDE_CONTENT_SET(efl_ui_button_legacy, EFL_UI_BUTTON_LEGACY, void)
+ELM_PART_OVERRIDE_CONTENT_SET_NO_SD(efl_ui_button_legacy)
 #include "efl_ui_button_legacy_part.eo.c"
 
 /* Efl.Part end */
diff --git a/src/lib/elementary/efl_ui_check.c 
b/src/lib/elementary/efl_ui_check.c
index bf6e8c2aa8..4b38992e3b 100644
--- a/src/lib/elementary/efl_ui_check.c
+++ b/src/lib/elementary/efl_ui_check.c
@@ -551,7 +551,7 @@ _part_is_efl_ui_check_legacy_part(const Eo *obj 
EINA_UNUSED, const char *part)
 }
 
 ELM_PART_OVERRIDE_PARTIAL(efl_ui_check_legacy, EFL_UI_CHECK_LEGACY, void, 
_part_is_efl_ui_check_legacy_part)
-ELM_PART_OVERRIDE_CONTENT_SET(efl_ui_check_legacy, EFL_UI_CHECK_LEGACY, void)
+ELM_PART_OVERRIDE_CONTENT_SET_NO_SD(efl_ui_check_legacy)
 #include "efl_ui_check_legacy_part.eo.c"
 
 /* Efl.Part end */
diff --git a/src/lib/elementary/efl_ui_layout_object.c 
b/src/lib/elementary/efl_ui_layout_object.c
index 55ee6247f4..95b3fc5fb9 100644
--- a/src/lib/elementary/efl_ui_layout_object.c
+++ b/src/lib/elementary/efl_ui_layout_object.c
@@ -2345,16 +2345,27 @@ 
_efl_ui_layout_part_efl_ui_cursor_cursor_theme_search_enabled_get(const Eo *obj,
    return !_efl_ui_layout_part_cursor_engine_only_get(sd, pd->part);
 }
 
+#define CONTENT_FULL(part_typename, typename, CLASS, TYPENAME) \
+  ELM_PART_OVERRIDE_CONTENT_GET_FULL(part_typename, typename, 
ELM_PART_OVERRIDE_INTERNALS_FETCH(CLASS, TYPENAME)) \
+  ELM_PART_OVERRIDE_CONTENT_SET_FULL(part_typename, typename, 
ELM_PART_OVERRIDE_INTERNALS_FETCH(CLASS, TYPENAME)) \
+  ELM_PART_OVERRIDE_CONTENT_UNSET_FULL(part_typename, typename, 
ELM_PART_OVERRIDE_INTERNALS_FETCH(CLASS, TYPENAME))
+
+
+#define TEXT_FULL(part_typename, typename, CLASS, TYPENAME) \
+  ELM_PART_OVERRIDE_TEXT_TEXT_GET_FULL(part_typename, typename, 
ELM_PART_OVERRIDE_INTERNALS_FETCH(CLASS, TYPENAME)) \
+  ELM_PART_OVERRIDE_TEXT_TEXT_SET_FULL(part_typename, typename, 
ELM_PART_OVERRIDE_INTERNALS_FETCH(CLASS, TYPENAME)) \
+
+
+#define MARKUP_FULL(part_typename, typename, CLASS, TYPENAME) \
+  ELM_PART_OVERRIDE_TEXT_MARKUP_GET_FULL(part_typename, typename, 
ELM_PART_OVERRIDE_INTERNALS_FETCH(CLASS, TYPENAME)) \
+  ELM_PART_OVERRIDE_TEXT_MARKUP_SET_FULL(part_typename, typename, 
ELM_PART_OVERRIDE_INTERNALS_FETCH(CLASS, TYPENAME)) \
+
 /* Efl.Ui.Layout.Part_Content */
-ELM_PART_OVERRIDE_CONTENT_GET_FULL(efl_ui_layout_part_content, efl_ui_layout, 
EFL_UI_LAYOUT_OBJECT, Efl_Ui_Layout_Object_Data)
-ELM_PART_OVERRIDE_CONTENT_SET_FULL(efl_ui_layout_part_content, efl_ui_layout, 
EFL_UI_LAYOUT_OBJECT, Efl_Ui_Layout_Object_Data)
-ELM_PART_OVERRIDE_CONTENT_UNSET_FULL(efl_ui_layout_part_content, 
efl_ui_layout, EFL_UI_LAYOUT_OBJECT, Efl_Ui_Layout_Object_Data)
+CONTENT_FULL(efl_ui_layout_part_content, efl_ui_layout, EFL_UI_LAYOUT_OBJECT, 
Efl_Ui_Layout_Object_Data)
 
 /* Efl.Ui.Layout.Part_Text */
-ELM_PART_OVERRIDE_TEXT_TEXT_GET_FULL(efl_ui_layout_part_text, efl_ui_layout, 
EFL_UI_LAYOUT_OBJECT, Efl_Ui_Layout_Object_Data)
-ELM_PART_OVERRIDE_TEXT_TEXT_SET_FULL(efl_ui_layout_part_text, efl_ui_layout, 
EFL_UI_LAYOUT_OBJECT, Efl_Ui_Layout_Object_Data)
-ELM_PART_OVERRIDE_TEXT_MARKUP_GET_FULL(efl_ui_layout_part_text, efl_ui_layout, 
EFL_UI_LAYOUT_OBJECT, Efl_Ui_Layout_Object_Data)
-ELM_PART_OVERRIDE_TEXT_MARKUP_SET_FULL(efl_ui_layout_part_text, efl_ui_layout, 
EFL_UI_LAYOUT_OBJECT, Efl_Ui_Layout_Object_Data)
+TEXT_FULL(efl_ui_layout_part_text, efl_ui_layout, EFL_UI_LAYOUT_OBJECT, 
Efl_Ui_Layout_Object_Data)
+MARKUP_FULL(efl_ui_layout_part_text, efl_ui_layout, EFL_UI_LAYOUT_OBJECT, 
Efl_Ui_Layout_Object_Data)
 
 EOLIAN static const char *
 _efl_ui_layout_part_text_efl_ui_translatable_translatable_text_get(const Eo 
*obj, void *_pd EINA_UNUSED, const char **domain)
@@ -2371,13 +2382,9 @@ 
_efl_ui_layout_part_text_efl_ui_translatable_translatable_text_set(Eo *obj, void
 }
 
 /* Efl.Ui.Layout.Part_Legacy */
-ELM_PART_OVERRIDE_CONTENT_GET_FULL(efl_ui_layout_part_legacy, efl_ui_layout, 
EFL_UI_LAYOUT_OBJECT, Efl_Ui_Layout_Object_Data)
-ELM_PART_OVERRIDE_CONTENT_SET_FULL(efl_ui_layout_part_legacy, efl_ui_layout, 
EFL_UI_LAYOUT_OBJECT, Efl_Ui_Layout_Object_Data)
-ELM_PART_OVERRIDE_CONTENT_UNSET_FULL(efl_ui_layout_part_legacy, efl_ui_layout, 
EFL_UI_LAYOUT_OBJECT, Efl_Ui_Layout_Object_Data)
-ELM_PART_OVERRIDE_TEXT_TEXT_GET_FULL(efl_ui_layout_part_legacy, efl_ui_layout, 
EFL_UI_LAYOUT_OBJECT, Efl_Ui_Layout_Object_Data)
-ELM_PART_OVERRIDE_TEXT_TEXT_SET_FULL(efl_ui_layout_part_legacy, efl_ui_layout, 
EFL_UI_LAYOUT_OBJECT, Efl_Ui_Layout_Object_Data)
-ELM_PART_OVERRIDE_TEXT_MARKUP_GET_FULL(efl_ui_layout_part_legacy, 
efl_ui_layout, EFL_UI_LAYOUT_OBJECT, Efl_Ui_Layout_Object_Data)
-ELM_PART_OVERRIDE_TEXT_MARKUP_SET_FULL(efl_ui_layout_part_legacy, 
efl_ui_layout, EFL_UI_LAYOUT_OBJECT, Efl_Ui_Layout_Object_Data)
+CONTENT_FULL(efl_ui_layout_part_legacy, efl_ui_layout, EFL_UI_LAYOUT_OBJECT, 
Efl_Ui_Layout_Object_Data)
+TEXT_FULL(efl_ui_layout_part_legacy, efl_ui_layout, EFL_UI_LAYOUT_OBJECT, 
Efl_Ui_Layout_Object_Data)
+MARKUP_FULL(efl_ui_layout_part_legacy, efl_ui_layout, EFL_UI_LAYOUT_OBJECT, 
Efl_Ui_Layout_Object_Data)
 
 EOLIAN static const char *
 _efl_ui_layout_part_legacy_efl_ui_translatable_translatable_text_get(const Eo 
*obj, void *_pd EINA_UNUSED, const char **domain)
diff --git a/src/lib/elementary/efl_ui_progressbar.c 
b/src/lib/elementary/efl_ui_progressbar.c
index c1a3f1a998..5773a455df 100644
--- a/src/lib/elementary/efl_ui_progressbar.c
+++ b/src/lib/elementary/efl_ui_progressbar.c
@@ -869,7 +869,7 @@ _part_is_efl_ui_progressbar_legacy_part(const Eo *obj 
EINA_UNUSED, const char *p
 }
 
 ELM_PART_OVERRIDE_PARTIAL(efl_ui_progressbar_legacy, 
EFL_UI_PROGRESSBAR_LEGACY, void, _part_is_efl_ui_progressbar_legacy_part)
-ELM_PART_OVERRIDE_CONTENT_SET(efl_ui_progressbar_legacy, 
EFL_UI_PROGRESSBAR_LEGACY, void)
+ELM_PART_OVERRIDE_CONTENT_SET_NO_SD(efl_ui_progressbar_legacy)
 #include "efl_ui_progressbar_legacy_part.eo.c"
 
 /* Efl.Part for legacy end */
diff --git a/src/lib/elementary/efl_ui_radio.c 
b/src/lib/elementary/efl_ui_radio.c
index 16ef832d1e..3ed97d2af8 100644
--- a/src/lib/elementary/efl_ui_radio.c
+++ b/src/lib/elementary/efl_ui_radio.c
@@ -469,7 +469,7 @@ _part_is_efl_ui_radio_legacy_part(const Eo *obj 
EINA_UNUSED, const char *part)
 }
 
 ELM_PART_OVERRIDE_PARTIAL(efl_ui_radio_legacy, EFL_UI_RADIO_LEGACY, void, 
_part_is_efl_ui_radio_legacy_part)
-ELM_PART_OVERRIDE_CONTENT_SET(efl_ui_radio_legacy, EFL_UI_RADIO_LEGACY, void)
+ELM_PART_OVERRIDE_CONTENT_SET_NO_SD(efl_ui_radio_legacy)
 #include "efl_ui_radio_legacy_part.eo.c"
 
 /* Efl.Part end */
diff --git a/src/lib/elementary/elm_part_helper.h 
b/src/lib/elementary/elm_part_helper.h
index 7d5c374ec3..6fe2304d8f 100644
--- a/src/lib/elementary/elm_part_helper.h
+++ b/src/lib/elementary/elm_part_helper.h
@@ -88,89 +88,112 @@ _ ## type ## _efl_part_part_get(const Eo *obj, typedata 
*priv EINA_UNUSED, const
    return ELM_PART_IMPLEMENT(TYPE ## _PART_CLASS, obj, part); \
 }
 
-#define ELM_PART_OVERRIDE_CONTENT_SET_FULL(full, type, TYPE, typedata) \
+#define ELM_PART_OVERRIDE_INTERNALS_FETCH(TYPE, typedata) \
+   Elm_Part_Data *pd = efl_data_scope_get(obj, EFL_UI_WIDGET_PART_CLASS); \
+   typedata *sd = efl_data_scope_get(pd->obj, TYPE ## _CLASS);
+
+#define ELM_PART_OVERRIDE_INTERNALS_FETCH_NO_SD() \
+   Elm_Part_Data *pd = efl_data_scope_get(obj, EFL_UI_WIDGET_PART_CLASS); \
+   void *sd = NULL;
+
+#define ELM_PART_OVERRIDE_CONTENT_SET_FULL(full, type, internals) \
 EOLIAN static Eina_Bool \
 _ ## full ## _efl_content_content_set(Eo *obj, void *_pd EINA_UNUSED, 
Efl_Gfx_Entity *content) \
 { \
-   Elm_Part_Data *pd = efl_data_scope_get(obj, EFL_UI_WIDGET_PART_CLASS); \
-   typedata *sd = efl_data_scope_get(pd->obj, TYPE ## _CLASS); \
+   internals \
    return _ ## type ## _content_set(pd->obj, sd, pd->part, content); \
 }
 
-#define ELM_PART_OVERRIDE_CONTENT_GET_FULL(full, type, TYPE, typedata) \
+#define ELM_PART_OVERRIDE_CONTENT_GET_FULL(full, type, internals) \
 EOLIAN static Efl_Gfx_Entity * \
 _ ## full ## _efl_content_content_get(const Eo *obj, void *_pd EINA_UNUSED) \
 { \
-   Elm_Part_Data *pd = efl_data_scope_get(obj, EFL_UI_WIDGET_PART_CLASS); \
-   typedata *sd = efl_data_scope_get(pd->obj, TYPE ## _CLASS); \
+   internals \
    return _ ## type ## _content_get(pd->obj, sd, pd->part); \
 }
 
-#define ELM_PART_OVERRIDE_CONTENT_UNSET_FULL(full, type, TYPE, typedata) \
+#define ELM_PART_OVERRIDE_CONTENT_UNSET_FULL(full, type, internals) \
 EOLIAN static Efl_Gfx_Entity * \
 _ ## full ## _efl_content_content_unset(Eo *obj, void *_pd EINA_UNUSED) \
 { \
-   Elm_Part_Data *pd = efl_data_scope_get(obj, EFL_UI_WIDGET_PART_CLASS); \
-   typedata *sd = efl_data_scope_get(pd->obj, TYPE ## _CLASS); \
+   internals \
    return _ ## type ## _content_unset(pd->obj, sd, pd->part); \
 }
 
-#define ELM_PART_OVERRIDE_TEXT_TEXT_SET_FULL(full, type, TYPE, typedata) \
+#define ELM_PART_OVERRIDE_TEXT_TEXT_SET_FULL(full, type, internals) \
 EOLIAN static void \
 _ ## full ## _efl_text_text_set(Eo *obj, void *_pd EINA_UNUSED, const char 
*text) \
 { \
-   Elm_Part_Data *pd = efl_data_scope_get(obj, EFL_UI_WIDGET_PART_CLASS); \
-   typedata *sd = efl_data_scope_get(pd->obj, TYPE ## _CLASS); \
+   internals \
    _ ## type ## _text_set(pd->obj, sd, pd->part, text); \
 }
 
-#define ELM_PART_OVERRIDE_TEXT_TEXT_GET_FULL(full, type, TYPE, typedata) \
+#define ELM_PART_OVERRIDE_TEXT_TEXT_GET_FULL(full, type, internals) \
 EOLIAN static const char *\
 _ ## full ## _efl_text_text_get(const Eo *obj, void *_pd EINA_UNUSED) \
 { \
-   Elm_Part_Data *pd = efl_data_scope_get(obj, EFL_UI_WIDGET_PART_CLASS); \
-   typedata *sd = efl_data_scope_get(pd->obj, TYPE ## _CLASS); \
+   internals \
    return _ ## type ## _text_get(pd->obj, sd, pd->part); \
 }
 
-#define ELM_PART_OVERRIDE_TEXT_MARKUP_GET_FULL(full, type, TYPE, typedata) \
+#define ELM_PART_OVERRIDE_TEXT_MARKUP_GET_FULL(full, type, internals) \
 EOLIAN static const char *\
 _ ## full ## _efl_text_markup_markup_get(const Eo *obj, void *_pd EINA_UNUSED) 
\
 { \
-   Elm_Part_Data *pd = efl_data_scope_get(obj, EFL_UI_WIDGET_PART_CLASS); \
-   typedata *sd = efl_data_scope_get(pd->obj, TYPE ## _CLASS); \
+   internals \
    return _ ## type ## _text_markup_get(pd->obj, sd, pd->part); \
 }
 
-#define ELM_PART_OVERRIDE_TEXT_MARKUP_SET_FULL(full, type, TYPE, typedata) \
+#define ELM_PART_OVERRIDE_TEXT_MARKUP_SET_FULL(full, type, internals) \
 EOLIAN static void \
 _ ## full ## _efl_text_markup_markup_set(Eo *obj, void *_pd EINA_UNUSED, const 
char *markup) \
 { \
-   Elm_Part_Data *pd = efl_data_scope_get(obj, EFL_UI_WIDGET_PART_CLASS); \
-   typedata *sd = efl_data_scope_get(pd->obj, TYPE ## _CLASS); \
+   internals \
    _ ## type ## _text_markup_set(pd->obj, sd, pd->part, markup); \
 }
 
 #define ELM_PART_OVERRIDE_CONTENT_SET(type, TYPE, typedata) \
-   ELM_PART_OVERRIDE_CONTENT_SET_FULL(type ## _part, type, TYPE, typedata)
+   ELM_PART_OVERRIDE_CONTENT_SET_FULL(type ## _part, type, 
ELM_PART_OVERRIDE_INTERNALS_FETCH(TYPE, typedata))
 
 #define ELM_PART_OVERRIDE_CONTENT_GET(type, TYPE, typedata) \
-   ELM_PART_OVERRIDE_CONTENT_GET_FULL(type ## _part, type, TYPE, typedata)
+   ELM_PART_OVERRIDE_CONTENT_GET_FULL(type ## _part, type, 
ELM_PART_OVERRIDE_INTERNALS_FETCH(TYPE, typedata))
 
 #define ELM_PART_OVERRIDE_CONTENT_UNSET(type, TYPE, typedata) \
-   ELM_PART_OVERRIDE_CONTENT_UNSET_FULL(type ## _part, type, TYPE, typedata)
+   ELM_PART_OVERRIDE_CONTENT_UNSET_FULL(type ## _part, type, 
ELM_PART_OVERRIDE_INTERNALS_FETCH(TYPE, typedata))
 
 #define ELM_PART_OVERRIDE_TEXT_SET(type, TYPE, typedata) \
-   ELM_PART_OVERRIDE_TEXT_TEXT_SET_FULL(type ## _part, type, TYPE, typedata)
+   ELM_PART_OVERRIDE_TEXT_TEXT_SET_FULL(type ## _part, type, 
ELM_PART_OVERRIDE_INTERNALS_FETCH(TYPE, typedata))
 
 #define ELM_PART_OVERRIDE_TEXT_GET(type, TYPE, typedata) \
-   ELM_PART_OVERRIDE_TEXT_TEXT_GET_FULL(type ## _part, type, TYPE, typedata)
+   ELM_PART_OVERRIDE_TEXT_TEXT_GET_FULL(type ## _part, type, 
ELM_PART_OVERRIDE_INTERNALS_FETCH(TYPE, typedata))
 
 #define ELM_PART_OVERRIDE_MARKUP_SET(type, TYPE, typedata) \
-   ELM_PART_OVERRIDE_TEXT_MARKUP_SET_FULL(type ## _part, type, TYPE, typedata)
+   ELM_PART_OVERRIDE_TEXT_MARKUP_SET_FULL(type ## _part, type, 
ELM_PART_OVERRIDE_INTERNALS_FETCH(TYPE, typedata))
 
 #define ELM_PART_OVERRIDE_MARKUP_GET(type, TYPE, typedata) \
-   ELM_PART_OVERRIDE_TEXT_MARKUP_GET_FULL(type ## _part, type, TYPE, typedata)
+   ELM_PART_OVERRIDE_TEXT_MARKUP_GET_FULL(type ## _part, type, 
ELM_PART_OVERRIDE_INTERNALS_FETCH(TYPE, typedata))
+
+#define ELM_PART_OVERRIDE_CONTENT_SET_NO_SD(type) \
+   ELM_PART_OVERRIDE_CONTENT_SET_FULL(type ## _part, type, 
ELM_PART_OVERRIDE_INTERNALS_FETCH_NO_SD())
+
+#define ELM_PART_OVERRIDE_CONTENT_GET_NO_SD(type) \
+   ELM_PART_OVERRIDE_CONTENT_GET_FULL(type ## _part, type, 
ELM_PART_OVERRIDE_INTERNALS_FETCH_NO_SD())
+
+#define ELM_PART_OVERRIDE_CONTENT_UNSET_NO_SD(type) \
+   ELM_PART_OVERRIDE_CONTENT_UNSET_FULL(type ## _part, type, 
ELM_PART_OVERRIDE_INTERNALS_FETCH_NO_SD())
+
+#define ELM_PART_OVERRIDE_TEXT_SET_NO_SD(type) \
+   ELM_PART_OVERRIDE_TEXT_TEXT_SET_FULL(type ## _part, type, 
ELM_PART_OVERRIDE_INTERNALS_FETCH_NO_SD())
+
+#define ELM_PART_OVERRIDE_TEXT_GET_NO_SD(type) \
+   ELM_PART_OVERRIDE_TEXT_TEXT_GET_FULL(type ## _part, type, 
ELM_PART_OVERRIDE_INTERNALS_FETCH_NO_SD())
+
+#define ELM_PART_OVERRIDE_MARKUP_SET_NO_SD(type) \
+   ELM_PART_OVERRIDE_TEXT_MARKUP_SET_FULL(type ## _part, type, 
ELM_PART_OVERRIDE_INTERNALS_FETCH_NO_SD())
+
+#define ELM_PART_OVERRIDE_MARKUP_GET_NO_SD(type) \
+   ELM_PART_OVERRIDE_TEXT_MARKUP_GET_FULL(type ## _part, type, 
ELM_PART_OVERRIDE_INTERNALS_FETCH_NO_SD())
+
 
 #define ELM_PART_TEXT_DEFAULT_IMPLEMENT(type, typedata) \
 EOLIAN static void \

-- 


Reply via email to