diff options
author | Campbell Barton <ideasman42@gmail.com> | 2007-04-17 23:04:55 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2007-04-17 23:04:55 +0400 |
commit | 7767451b2f051ad2283a0ab7a058e009a0111af7 (patch) | |
tree | 310c711aaa70e2198183329212438018b6355db5 /source/blender | |
parent | 9c8bc4badc9163af4b67b9a1048d29a165dc92d3 (diff) |
maving too many objects for the select buffer would crash blender.
added checks for an error value returned from view3d_opengl_select so as not to act on bad data.
also the error message didnt display because of where it was, delayed the error so it displays right.
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/src/editarmature.c | 4 | ||||
-rw-r--r-- | source/blender/src/editview.c | 12 | ||||
-rw-r--r-- | source/blender/src/view.c | 9 |
3 files changed, 15 insertions, 10 deletions
diff --git a/source/blender/src/editarmature.c b/source/blender/src/editarmature.c index 5c9664d4148..e52a61b1b19 100644 --- a/source/blender/src/editarmature.c +++ b/source/blender/src/editarmature.c @@ -708,7 +708,7 @@ static void *get_nearest_bone (short findunsel) glInitNames(); hits= view3d_opengl_select(buffer, MAXPICKBUF, 0, 0, 0, 0); - if (hits) + if (hits>0) return get_bone_from_selectbuffer(BASACT, buffer, hits, findunsel); return NULL; @@ -951,7 +951,7 @@ static EditBone * get_nearest_editbonepoint (int findunsel, int *selmask) hits= view3d_opengl_select(buffer, MAXPICKBUF, mval[0]-12, mval[1]-12, mval[0]+12, mval[1]+12); /* See if there are any selected bones in this group */ - if (hits) { + if (hits>0) { if(hits==1) { if (!(buffer[3] & BONESEL_NOSEL)) diff --git a/source/blender/src/editview.c b/source/blender/src/editview.c index 225854b1fff..29e08dce7b1 100644 --- a/source/blender/src/editview.c +++ b/source/blender/src/editview.c @@ -1220,17 +1220,17 @@ static short mixed_bones_object_selectbuffer(unsigned int *buffer, short *mval) short has_bones15=0, has_bones9=0, has_bones5=0; hits15= view3d_opengl_select(buffer, MAXPICKBUF, mval[0]-14, mval[1]-14, mval[0]+14, mval[1]+14); - if(hits15) { + if(hits15>0) { for(a=0; a<hits15; a++) if(buffer[4*a+3] & 0xFFFF0000) has_bones15= 1; offs= 4*hits15; hits9= view3d_opengl_select(buffer+offs, MAXPICKBUF-offs, mval[0]-9, mval[1]-9, mval[0]+9, mval[1]+9); - if(hits9) { + if(hits9>0) { for(a=0; a<hits9; a++) if(buffer[offs+4*a+3] & 0xFFFF0000) has_bones9= 1; offs+= 4*hits9; hits5= view3d_opengl_select(buffer+offs, MAXPICKBUF-offs, mval[0]-5, mval[1]-5, mval[0]+5, mval[1]+5); - if(hits5) { + if(hits5>0) { for(a=0; a<hits5; a++) if(buffer[offs+4*a+3] & 0xFFFF0000) has_bones5= 1; } } @@ -1249,12 +1249,12 @@ static short mixed_bones_object_selectbuffer(unsigned int *buffer, short *mval) return hits15; } - if(hits5) { + if(hits5>0) { offs= 4*hits15 + 4*hits9; memcpy(buffer, buffer+offs, 4*offs); return hits5; } - if(hits9) { + if(hits9>0) { offs= 4*hits15; memcpy(buffer, buffer+offs, 4*offs); return hits9; @@ -1789,7 +1789,7 @@ void borderselect(void) does it incorrectly. */ - if (hits) { /* no need to loop if there's no hit */ + if (hits>0) { /* no need to loop if there's no hit */ base= FIRSTBASE; col = vbuffer + 3; while(base && hits) { diff --git a/source/blender/src/view.c b/source/blender/src/view.c index 56166037e7f..3e052dde07c 100644 --- a/source/blender/src/view.c +++ b/source/blender/src/view.c @@ -1026,6 +1026,10 @@ void setcameratoview3d(void) } /* IGLuint-> GLuint*/ +/* Warning: be sure to account for a negative return value + * This is an error, "Too many objects in select buffer" + * and no action should be taken (can crash blender) if this happens + */ short view3d_opengl_select(unsigned int *buffer, unsigned int bufsize, short x1, short y1, short x2, short y2) { rctf rect; @@ -1113,7 +1117,6 @@ short view3d_opengl_select(unsigned int *buffer, unsigned int bufsize, short x1 glPopName(); /* see above (pushname) */ hits= glRenderMode(GL_RENDER); - if(hits<0) error("Too many objects in select buffer"); G.f &= ~G_PICKSEL; setwinmatrixview3d(curarea->winx, curarea->winy, NULL); @@ -1127,7 +1130,9 @@ short view3d_opengl_select(unsigned int *buffer, unsigned int bufsize, short x1 if(G.vd->flag & V3D_CLIPPING) view3d_clr_clipping(); - + + if(hits<0) error("Too many objects in select buffer"); + return hits; } |