cedric pushed a commit to branch master.

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

commit 0c4de0235c0a0ff14896c6e1ba49c1664f908999
Author: Oleksandr Shcherbina <o.shcherb...@samsung.com>
Date:   Thu Feb 5 15:17:43 2015 +0100

    evas: Evas_3D - fix evas_3d_scene_pick when trying to get empty texcoords 
from mesh.
    
    Summary:
    During filling evas pick public data by API evas_3d_scene_pick
    segfault can occur if mesh was created without texcoords.
    See functions - _pick_data_mesh_add, _pick_data_texcoord_update
    
    @fix
    
    Reviewers: cedric, Hermet, raster
    
    Subscribers: cedric
    
    Differential Revision: https://phab.enlightenment.org/D1941
    
    Signed-off-by: Cedric BAIL <ced...@osg.samsung.com>
---
 src/lib/evas/canvas/evas_3d_scene.c | 27 ++++++++++++++++++---------
 1 file changed, 18 insertions(+), 9 deletions(-)

diff --git a/src/lib/evas/canvas/evas_3d_scene.c 
b/src/lib/evas/canvas/evas_3d_scene.c
index c8a2c67..0e177a7 100644
--- a/src/lib/evas/canvas/evas_3d_scene.c
+++ b/src/lib/evas/canvas/evas_3d_scene.c
@@ -352,7 +352,8 @@ _pick_data_mesh_add(Evas_3D_Pick_Data *data, const 
Evas_Ray3 *ray,
 
                   if (_pick_data_triangle_add(data, ray, &tri))
                     {
-                       _pick_data_texcoord_update(data, &tex0, &tex1, 
tex_weight, i0, i1, i2);
+                       if (tex0.data)
+                         _pick_data_texcoord_update(data, &tex0, &tex1, 
tex_weight, i0, i1, i2);
                        data->mesh = mesh;
                        data->node = node;
                     }
@@ -399,7 +400,8 @@ _pick_data_mesh_add(Evas_3D_Pick_Data *data, const 
Evas_Ray3 *ray,
                             i1 = ((unsigned char *)pdmesh->indices)[i + 1];
                          }
 
-                       _pick_data_texcoord_update(data, &tex0, &tex1, 
tex_weight, i0, i1, i2);
+                       if (tex0.data)
+                         _pick_data_texcoord_update(data, &tex0, &tex1, 
tex_weight, i0, i1, i2);
                        data->mesh = mesh;
                        data->node = node;
                     }
@@ -439,7 +441,8 @@ _pick_data_mesh_add(Evas_3D_Pick_Data *data, const 
Evas_Ray3 *ray,
                        else
                          i1 = ((unsigned char *)pdmesh->indices)[i];
 
-                       _pick_data_texcoord_update(data, &tex0, &tex1, 
tex_weight, i0, i1, i2);
+                       if (tex0.data)
+                         _pick_data_texcoord_update(data, &tex0, &tex1, 
tex_weight, i0, i1, i2);
                        data->mesh = mesh;
                        data->node = node;
                     }
@@ -458,7 +461,8 @@ _pick_data_mesh_add(Evas_3D_Pick_Data *data, const 
Evas_Ray3 *ray,
 
                   if (_pick_data_triangle_add(data, ray, &tri))
                     {
-                       _pick_data_texcoord_update(data, &tex0, &tex1, 
tex_weight, i, i + 1, i + 2);
+                       if (tex0.data)
+                         _pick_data_texcoord_update(data, &tex0, &tex1, 
tex_weight, i, i + 1, i + 2);
                        data->mesh = mesh;
                        data->node = node;
                     }
@@ -478,7 +482,8 @@ _pick_data_mesh_add(Evas_3D_Pick_Data *data, const 
Evas_Ray3 *ray,
 
                   if (_pick_data_triangle_add(data, ray, &tri))
                     {
-                       _pick_data_texcoord_update(data, &tex0, &tex1, 
tex_weight, i, i + 1, i + 2);
+                       if (tex0.data)
+                         _pick_data_texcoord_update(data, &tex0, &tex1, 
tex_weight, i, i + 1, i + 2);
                        data->mesh = mesh;
                        data->node = node;
                     }
@@ -497,7 +502,8 @@ _pick_data_mesh_add(Evas_3D_Pick_Data *data, const 
Evas_Ray3 *ray,
 
                   if (_pick_data_triangle_add(data, ray, &tri))
                     {
-                       _pick_data_texcoord_update(data, &tex0, &tex1, 
tex_weight, 0, i, i + 1);
+                      if (tex0.data)
+                        _pick_data_texcoord_update(data, &tex0, &tex1, 
tex_weight, 0, i, i + 1);
                        data->mesh = mesh;
                        data->node = node;
                     }
@@ -516,7 +522,8 @@ _pick_data_mesh_add(Evas_3D_Pick_Data *data, const 
Evas_Ray3 *ray,
 
                   if (_pick_data_triangle_add(data, ray, &tri))
                     {
-                       _pick_data_texcoord_update(data, &tex0, &tex1, 
tex_weight, i, i + 1, i + 2);
+                       if (tex0.data)
+                         _pick_data_texcoord_update(data, &tex0, &tex1, 
tex_weight, i, i + 1, i + 2);
                        data->mesh = mesh;
                        data->node = node;
                     }
@@ -536,7 +543,8 @@ _pick_data_mesh_add(Evas_3D_Pick_Data *data, const 
Evas_Ray3 *ray,
 
                   if (_pick_data_triangle_add(data, ray, &tri))
                     {
-                       _pick_data_texcoord_update(data, &tex0, &tex1, 
tex_weight, i, i + 1, i + 2);
+                      if (tex0.data)
+                        _pick_data_texcoord_update(data, &tex0, &tex1, 
tex_weight, i, i + 1, i + 2);
                        data->mesh = mesh;
                        data->node = node;
                     }
@@ -555,7 +563,8 @@ _pick_data_mesh_add(Evas_3D_Pick_Data *data, const 
Evas_Ray3 *ray,
 
                   if (_pick_data_triangle_add(data, ray, &tri))
                     {
-                       _pick_data_texcoord_update(data, &tex0, &tex1, 
tex_weight, 0, i, i + 1);
+                       if (tex0.data)
+                         _pick_data_texcoord_update(data, &tex0, &tex1, 
tex_weight, 0, i, i + 1);
                        data->mesh = mesh;
                        data->node = node;
                     }

-- 


Reply via email to