Cherry-pick pull request #2409 from SKURInc/master

avoid index out of range with large bitmap sizes

With large u and v, the product u * v exceeds the capacity of an int.  The result when coerced to size_t can be an out of range index into bitmap.
Avoid this by casting u and v to size_t before multiplying.
This commit is contained in:
Caedmon Irias 2017-09-09 12:34:42 -07:00 committed by Laurent Rineau
parent 1d03f05d71
commit 8690601d56
1 changed files with 3 additions and 3 deletions

View File

@ -166,7 +166,7 @@ namespace CGAL {
u = (u < 0) ? 0 : (((std::size_t)u >= u_extent) ? (int)u_extent - 1 : u);
v = (v < 0) ? 0 : (((std::size_t)v >= v_extent) ? (int)v_extent - 1 : v);
bitmap[v * int(u_extent) + u] = true;
bitmap[size_t(v) * u_extent + size_t(u)] = true;
}
// Iterate through the bitmap
@ -249,7 +249,7 @@ namespace CGAL {
u = (u < 0) ? 0 : (((std::size_t)u >= u_extent) ? (int)u_extent - 1 : u);
v = (v < 0) ? 0 : (((std::size_t)v >= v_extent) ? (int)v_extent - 1 : v);
count[bitmap[v * int(u_extent) + u]]++;
count[bitmap[size_t(v) * u_extent + size_t(u)]]++;
}
// Find largest component. Start at index 2 as 0/1 are reserved for
@ -269,7 +269,7 @@ namespace CGAL {
u = (u < 0) ? 0 : (((std::size_t)u >= u_extent) ? (int)u_extent - 1 : u);
v = (v < 0) ? 0 : (((std::size_t)v >= v_extent) ? (int)v_extent - 1 : v);
if (bitmap[v * int(u_extent) + u] == largest)
if (bitmap[size_t(v) * u_extent + size_t(u)] == largest)
comp_indices.push_back(indices[i]);
}