EXT-4388 Crash in octree line segment intersection code (getMask)

Add yet more paranoia-and-return-or-assert, this time for +-INF in input vector.
To be reviewed by Bao.
master
Tofu Linden 2010-04-15 20:15:40 +01:00
parent 384c954fb7
commit bba063c0c1
2 changed files with 21 additions and 2 deletions

View File

@ -70,6 +70,8 @@ class LLVector2
void setVec(const LLVector2 &vec); // deprecated
void setVec(const F32 *vec); // deprecated
inline bool isFinite() const; // checks to see if all values of LLVector2 are finite
F32 length() const; // Returns magnitude of LLVector2
F32 lengthSquared() const; // Returns magnitude squared of LLVector2
F32 normalize(); // Normalizes and returns the magnitude of LLVector2
@ -215,6 +217,7 @@ inline void LLVector2::setVec(const F32 *vec)
mV[VY] = vec[VY];
}
// LLVector2 Magnitude and Normalization Functions
inline F32 LLVector2::length(void) const
@ -247,6 +250,12 @@ inline F32 LLVector2::normalize(void)
return (mag);
}
// checker
inline bool LLVector2::isFinite() const
{
return (llfinite(mV[VX]) && llfinite(mV[VY]));
}
// deprecated
inline F32 LLVector2::magVec(void) const
{

View File

@ -1738,8 +1738,18 @@ BOOL LLImageGL::getMask(const LLVector2 &tc)
if (mPickMask)
{
F32 u = tc.mV[0] - floorf(tc.mV[0]);
F32 v = tc.mV[1] - floorf(tc.mV[1]);
F32 u,v;
if (LL_LIKELY(tc.isFinite()))
{
u = tc.mV[0] - floorf(tc.mV[0]);
v = tc.mV[1] - floorf(tc.mV[1]);
}
else
{
LL_WARNS_ONCE("render") << "Ugh, non-finite u/v in mask pick" << LL_ENDL;
u = v = 0.f;
llassert(false);
}
if (LL_UNLIKELY(u < 0.f || u > 1.f ||
v < 0.f || v > 1.f))