[Bf-blender-cvs] [ad2f210] wiggly-widgets: Fix memory header corruption, report and cause found by Julian, thanks!
Antony Riakiotakis
noreply at git.blender.org
Sat Dec 5 19:36:19 CET 2015
Commit: ad2f210413ad7aee347bb2824369b1425113d9e1
Author: Antony Riakiotakis
Date: Sat Dec 5 19:34:04 2015 +0100
Branches: wiggly-widgets
https://developer.blender.org/rBad2f210413ad7aee347bb2824369b1425113d9e1
Fix memory header corruption, report and cause found by Julian, thanks!
===================================================================
M source/blender/blenkernel/intern/cdderivedmesh.c
M source/blender/blenkernel/intern/subsurf_ccg.c
===================================================================
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c
index 8e1544b..2cad0b8 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -1610,7 +1610,8 @@ static void cdDM_buffer_copy_facemap(DerivedMesh *dm, unsigned int *varray)
facemap_iter = facemap;
mp_iter = mp;
for (i = 0; i < totpoly; i++, facemap_iter++, mp_iter++) {
- gdo->facemap_count[*facemap_iter] += ME_POLY_TRI_TOT(mp_iter);
+ if (*facemap_iter != -1)
+ gdo->facemap_count[*facemap_iter] += ME_POLY_TRI_TOT(mp_iter);
}
for (i = 0; i < gdo->totfacemaps; i++) {
@@ -1621,16 +1622,18 @@ static void cdDM_buffer_copy_facemap(DerivedMesh *dm, unsigned int *varray)
facemap_iter = facemap;
mp_iter = mp;
for (i = 0; i < totpoly; i++, facemap_iter++, mp_iter++) {
- int numtri = ME_POLY_TRI_TOT(mp_iter);
- int fmap_offset = (gdo->facemap_start[*facemap_iter] + facemap_offset[*facemap_iter]) * 3;
- const MLoopTri *ltri_iter = ltri + poly_to_tri_count(i, mp_iter->loopstart);
+ if (*facemap_iter != -1) {
+ int numtri = ME_POLY_TRI_TOT(mp_iter);
+ int fmap_offset = (gdo->facemap_start[*facemap_iter] + facemap_offset[*facemap_iter]) * 3;
+ const MLoopTri *ltri_iter = ltri + poly_to_tri_count(i, mp_iter->loopstart);
- facemap_offset[*facemap_iter] += numtri;
+ facemap_offset[*facemap_iter] += numtri;
- for (; numtri > 0; numtri--, ltri_iter++) {
- varray[fmap_offset++] = gdo->vert_points[mloop[ltri_iter->tri[0]].v].point_index;
- varray[fmap_offset++] = gdo->vert_points[mloop[ltri_iter->tri[1]].v].point_index;
- varray[fmap_offset++] = gdo->vert_points[mloop[ltri_iter->tri[2]].v].point_index;
+ for (; numtri > 0; numtri--, ltri_iter++) {
+ varray[fmap_offset++] = gdo->vert_points[mloop[ltri_iter->tri[0]].v].point_index;
+ varray[fmap_offset++] = gdo->vert_points[mloop[ltri_iter->tri[1]].v].point_index;
+ varray[fmap_offset++] = gdo->vert_points[mloop[ltri_iter->tri[2]].v].point_index;
+ }
}
}
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index 3303cc6..13ccc5d 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -2139,9 +2139,12 @@ static void ccgDM_buffer_copy_facemaps(DerivedMesh *dm, unsigned int *varray)
facemap_offset = MEM_callocN(gdo->totfacemaps * sizeof(*facemap_offset), "facemap_offset");
for (i = 0; i < totface; i++) {
- CCGFace *f = ccgdm->faceMap[i].face;
- int numVerts = ccgSubSurf_getFaceNumVerts(f);
- gdo->facemap_count[facemap[ccgdm->faceMap[i].startFace]] += gridFaces * gridFaces * numVerts * 2;
+ int facemap_index = facemap[ccgdm->faceMap[i].startFace];
+ if (facemap_index != -1) {
+ CCGFace *f = ccgdm->faceMap[i].face;
+ int numVerts = ccgSubSurf_getFaceNumVerts(f);
+ gdo->facemap_count[facemap_index] += gridFaces * gridFaces * numVerts * 2;
+ }
}
for (i = 0; i < gdo->totfacemaps; i++) {
@@ -2150,25 +2153,27 @@ static void ccgDM_buffer_copy_facemaps(DerivedMesh *dm, unsigned int *varray)
}
for (i = 0; i < totface; i++) {
- CCGFace *f = ccgdm->faceMap[i].face;
- int S, x, y, numVerts = ccgSubSurf_getFaceNumVerts(f);
int facemap_index = facemap[ccgdm->faceMap[i].startFace];
- int fmap_offset = (gdo->facemap_start[facemap_index] + facemap_offset[facemap_index]) * 3;
+ if (facemap_index != -1) {
+ CCGFace *f = ccgdm->faceMap[i].face;
+ int S, x, y, numVerts = ccgSubSurf_getFaceNumVerts(f);
+ int fmap_offset = (gdo->facemap_start[facemap_index] + facemap_offset[facemap_index]) * 3;
- facemap_offset[facemap_index] += gridFaces * gridFaces * numVerts * 2;
+ facemap_offset[facemap_index] += gridFaces * gridFaces * numVerts * 2;
- for (S = 0; S < numVerts; S++) {
- for (y = 0; y < gridFaces; y++) {
- for (x = 0; x < gridFaces; x++) {
- varray[fmap_offset++] = totloops + 3;
- varray[fmap_offset++] = totloops + 2;
- varray[fmap_offset++] = totloops + 1;
+ for (S = 0; S < numVerts; S++) {
+ for (y = 0; y < gridFaces; y++) {
+ for (x = 0; x < gridFaces; x++) {
+ varray[fmap_offset++] = totloops + 3;
+ varray[fmap_offset++] = totloops + 2;
+ varray[fmap_offset++] = totloops + 1;
- varray[fmap_offset++] = totloops + 3;
- varray[fmap_offset++] = totloops + 1;
- varray[fmap_offset++] = totloops;
+ varray[fmap_offset++] = totloops + 3;
+ varray[fmap_offset++] = totloops + 1;
+ varray[fmap_offset++] = totloops;
- totloops += 4;
+ totloops += 4;
+ }
}
}
}
More information about the Bf-blender-cvs
mailing list