diff options
author | Campbell Barton <ideasman42@gmail.com> | 2013-07-27 14:32:27 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2013-07-27 14:32:27 +0400 |
commit | f83d733a62eae93cc4ef56f8d6968229cc22fdd9 (patch) | |
tree | 6c6346ae827c291f93e20647604a3f699cdcd10f /source | |
parent | 96dbc60e2db35c38603052f004dd914e1d97051f (diff) |
fix for reading outside allocated memory when switching to the 3D view.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/BKE_context.h | 4 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/context.c | 4 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/space_view3d.c | 34 |
3 files changed, 30 insertions, 12 deletions
diff --git a/source/blender/blenkernel/BKE_context.h b/source/blender/blenkernel/BKE_context.h index 285077f258c..c6a6b0672d1 100644 --- a/source/blender/blenkernel/BKE_context.h +++ b/source/blender/blenkernel/BKE_context.h @@ -200,8 +200,8 @@ void CTX_data_dir_set(bContextDataResult *result, const char **member); void CTX_data_type_set(struct bContextDataResult *result, short type); short CTX_data_type_get(struct bContextDataResult *result); -int CTX_data_equals(const char *member, const char *str); -int CTX_data_dir(const char *member); +bool CTX_data_equals(const char *member, const char *str); +bool CTX_data_dir(const char *member); #if 0 void CTX_data_pointer_set(bContextDataResult *result, void *data); diff --git a/source/blender/blenkernel/intern/context.c b/source/blender/blenkernel/intern/context.c index bbf254cd7d1..622b4f6df5a 100644 --- a/source/blender/blenkernel/intern/context.c +++ b/source/blender/blenkernel/intern/context.c @@ -531,12 +531,12 @@ ListBase CTX_data_dir_get(const bContext *C) return CTX_data_dir_get_ex(C, TRUE, FALSE, FALSE); } -int CTX_data_equals(const char *member, const char *str) +bool CTX_data_equals(const char *member, const char *str) { return (strcmp(member, str) == 0); } -int CTX_data_dir(const char *member) +bool CTX_data_dir(const char *member) { return member[0] == '\0'; } diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c index 92bf8214336..dfbc973ee85 100644 --- a/source/blender/editors/space_view3d/space_view3d.c +++ b/source/blender/editors/space_view3d/space_view3d.c @@ -1141,17 +1141,17 @@ const char *view3d_context_dir[] = { static int view3d_context(const bContext *C, const char *member, bContextDataResult *result) { - View3D *v3d = CTX_wm_view3d(C); - Scene *scene = CTX_data_scene(C); - Base *base; /* fallback to the scene layer, allows duplicate and other object operators to run outside the 3d view */ - unsigned int lay = v3d ? v3d->lay : scene->lay; if (CTX_data_dir(member)) { CTX_data_dir_set(result, view3d_context_dir); } else if (CTX_data_equals(member, "selected_objects") || CTX_data_equals(member, "selected_bases")) { - int selected_objects = CTX_data_equals(member, "selected_objects"); + View3D *v3d = CTX_wm_view3d(C); + Scene *scene = CTX_data_scene(C); + const unsigned int lay = v3d ? v3d->lay : scene->lay; + Base *base; + const bool selected_objects = CTX_data_equals(member, "selected_objects"); for (base = scene->base.first; base; base = base->next) { if ((base->flag & SELECT) && (base->lay & lay)) { @@ -1167,7 +1167,11 @@ static int view3d_context(const bContext *C, const char *member, bContextDataRes return 1; } else if (CTX_data_equals(member, "selected_editable_objects") || CTX_data_equals(member, "selected_editable_bases")) { - int selected_editable_objects = CTX_data_equals(member, "selected_editable_objects"); + View3D *v3d = CTX_wm_view3d(C); + Scene *scene = CTX_data_scene(C); + const unsigned int lay = v3d ? v3d->lay : scene->lay; + Base *base; + const bool selected_editable_objects = CTX_data_equals(member, "selected_editable_objects"); for (base = scene->base.first; base; base = base->next) { if ((base->flag & SELECT) && (base->lay & lay)) { @@ -1185,7 +1189,11 @@ static int view3d_context(const bContext *C, const char *member, bContextDataRes return 1; } else if (CTX_data_equals(member, "visible_objects") || CTX_data_equals(member, "visible_bases")) { - int visible_objects = CTX_data_equals(member, "visible_objects"); + View3D *v3d = CTX_wm_view3d(C); + Scene *scene = CTX_data_scene(C); + const unsigned int lay = v3d ? v3d->lay : scene->lay; + Base *base; + const bool visible_objects = CTX_data_equals(member, "visible_objects"); for (base = scene->base.first; base; base = base->next) { if (base->lay & lay) { @@ -1201,7 +1209,11 @@ static int view3d_context(const bContext *C, const char *member, bContextDataRes return 1; } else if (CTX_data_equals(member, "selectable_objects") || CTX_data_equals(member, "selectable_bases")) { - int selectable_objects = CTX_data_equals(member, "selectable_objects"); + View3D *v3d = CTX_wm_view3d(C); + Scene *scene = CTX_data_scene(C); + const unsigned int lay = v3d ? v3d->lay : scene->lay; + Base *base; + const bool selectable_objects = CTX_data_equals(member, "selectable_objects"); for (base = scene->base.first; base; base = base->next) { if (base->lay & lay) { @@ -1217,6 +1229,9 @@ static int view3d_context(const bContext *C, const char *member, bContextDataRes return 1; } else if (CTX_data_equals(member, "active_base")) { + View3D *v3d = CTX_wm_view3d(C); + Scene *scene = CTX_data_scene(C); + const unsigned int lay = v3d ? v3d->lay : scene->lay; if (scene->basact && (scene->basact->lay & lay)) { Object *ob = scene->basact->object; /* if hidden but in edit mode, we still display, can happen with animation */ @@ -1227,6 +1242,9 @@ static int view3d_context(const bContext *C, const char *member, bContextDataRes return 1; } else if (CTX_data_equals(member, "active_object")) { + View3D *v3d = CTX_wm_view3d(C); + Scene *scene = CTX_data_scene(C); + const unsigned int lay = v3d ? v3d->lay : scene->lay; if (scene->basact && (scene->basact->lay & lay)) { Object *ob = scene->basact->object; if ((ob->restrictflag & OB_RESTRICT_VIEW) == 0 || (ob->mode & OB_MODE_EDIT)) |