From 93daf905f1cda0c095af8237a3136167f1b01663 Mon Sep 17 00:00:00 2001 From: Daniel Gibson Date: Mon, 18 Apr 2016 19:37:02 +0200 Subject: [PATCH] EntitiesMP/Common/Particles.cpp: Don't access afStarsPositions[i][3] fix out of bounds accesses of that array. I guess the same will have to be done for Entities/Common/Particles.cpp --- Sources/EntitiesMP/Common/Particles.cpp | 67 +++++++++++++------------ 1 file changed, 34 insertions(+), 33 deletions(-) diff --git a/Sources/EntitiesMP/Common/Particles.cpp b/Sources/EntitiesMP/Common/Particles.cpp index 8c5c846..605db3c 100755 --- a/Sources/EntitiesMP/Common/Particles.cpp +++ b/Sources/EntitiesMP/Common/Particles.cpp @@ -1589,9 +1589,10 @@ INDEX Particles_Regeneration(CEntity *pen, FLOAT tmStart, FLOAT tmStop, FLOAT fY vPos2 = Lerp( vSource, vDestination, fT2); } - UBYTE ubR = (UBYTE) (192+afStarsPositions[iRnd][1]*64); - UBYTE ubG = (UBYTE) (192+afStarsPositions[iRnd][2]*64); - UBYTE ubB = (UBYTE) (192+afStarsPositions[iRnd][3]*64); // FIXME DG: afStarsPositions[i][3] invalid, what's going on here? + // DG: changed indices from 1-3 to 0-2 so they're not out of bounds + UBYTE ubR = (UBYTE) (192+afStarsPositions[iRnd][0]*64); + UBYTE ubG = (UBYTE) (192+afStarsPositions[iRnd][1]*64); + UBYTE ubB = (UBYTE) (192+afStarsPositions[iRnd][2]*64); UBYTE ubA = (UBYTE) CalculateRatio( fT, 0.0f, 1.0f, 0.4f, 0.01f)*255; COLOR colLine = RGBToColor( ubR, ubG, ubB) | ubA; @@ -2242,7 +2243,7 @@ void Particles_DustFall(CEntity *pen, FLOAT tmStarted, FLOAT3D vStretch) FLOAT fRndAppearX = afStarsPositions[iRnd][0]*vStretch(1); FLOAT fRndSpeedY = (afStarsPositions[iRnd][1]+0.5f)*0.125f*vStretch(2); FLOAT fRndAppearZ = afStarsPositions[iRnd][2]*vStretch(3); - FLOAT3D vRndDir=FLOAT3D(afStarsPositions[iRnd][1],0,afStarsPositions[iRnd][3]); + FLOAT3D vRndDir=FLOAT3D(afStarsPositions[iRnd][0],0,afStarsPositions[iRnd][2]); vRndDir.Normalize(); FLOAT fRiseTime=Max(fRatio-0.5f,0.0f); FLOAT3D vPos=vCenter+vRndDir*fSpeed*3*fStretch+vY*fRiseTime*0.25f; @@ -2374,7 +2375,7 @@ void Particles_LavaErupting(CEntity *pen, FLOAT fStretchAll, FLOAT fSize, vPos(2) += (fStretchY+(fStretchY*0.25f*afStarsPositions[iRnd1][1]))*fT-fGA/2.0f*fT*fT; vPos(3) += fRndAppearZ+afStarsPositions[iRnd1][2]*fT*fStretchZ*10; - Particle_RenderSquare( vPos, fSize+afStarsPositions[iRnd2][3]*fSize*0.5f, fRndRotation*300*fT, C_WHITE|CT_OPAQUE); + Particle_RenderSquare( vPos, fSize+afStarsPositions[iRnd2][2]*fSize*0.5f, fRndRotation*300*fT, C_WHITE|CT_OPAQUE); // all done Particle_Flush(); @@ -3091,7 +3092,7 @@ void Particles_Rain(CEntity *pen, FLOAT fGridSize, INDEX ctGrids, FLOAT fFactor, for( INDEX iZ=0; iZfLife/2) @@ -4781,11 +4782,11 @@ void Particles_AfterBurner(CEntity *pen, FLOAT tmSpawn, FLOAT fStretch, INDEX iG // smoke FLOAT3D vPosS = *pvPos1; Particle_SetTexturePart( 512, 512, 1, 0); - FLOAT fAngleS = afStarsPositions[iRnd][2]*360.0f+fT*120.0f*afStarsPositions[iRnd][3]; + FLOAT fAngleS = afStarsPositions[iRnd][1]*360.0f+fT*120.0f*afStarsPositions[iRnd][2]; FLOAT fSizeS = (0.5f+aSmoke_sol[iIndex]*2.5f)*fStretch; - FLOAT3D vVelocityS=FLOAT3D(afStarsPositions[iRnd][2], - afStarsPositions[iRnd][3], - afStarsPositions[iRnd][1])*5.0f; + FLOAT3D vVelocityS=FLOAT3D(afStarsPositions[iRnd][1], + afStarsPositions[iRnd][2], + afStarsPositions[iRnd][0])*5.0f; vPosS=vPosS+vVelocityS*fT+vGDir*fGA/2.0f*(fT*fT)/32.0f; Particle_RenderSquare( vPosS, fSizeS, fAngleS, ByteSwap(pcolSmoke[iIndex])); @@ -4899,7 +4900,7 @@ void Particles_RocketMotorBurning(CEntity *pen, FLOAT tmSpawn, FLOAT3D vStretch, INDEX iIndex=(INDEX) (fT*255); // smoke Particle_SetTexturePart( 512, 512, 1, 0); - FLOAT fAngleS = afStarsPositions[iRnd][2]*360.0f+fT*120.0f*afStarsPositions[iRnd][3]; + FLOAT fAngleS = afStarsPositions[iRnd][1]*360.0f+fT*120.0f*afStarsPositions[iRnd][2]; FLOAT fSizeS = (3.0f+fT*4.5f)*fStretch; Particle_RenderSquare( vPosS, fSizeS, fAngleS, ByteSwap(pcolSmoke[iIndex])); @@ -4933,7 +4934,7 @@ void Particles_RocketMotorBurning(CEntity *pen, FLOAT tmSpawn, FLOAT3D vStretch, INDEX iIndex=(INDEX) (fT*255); // smoke Particle_SetTexturePart( 512, 512, 1, 0); - FLOAT fAngleS = afStarsPositions[iRnd][2]*360.0f+fT*120.0f*afStarsPositions[iRnd][3]; + FLOAT fAngleS = afStarsPositions[iRnd][1]*360.0f+fT*120.0f*afStarsPositions[iRnd][2]; FLOAT fSizeS = (1.5f+aSmoke_sol[iIndex]*2.5f)*fStretch*fFireStretch; Particle_RenderSquare( vPosS, fSizeS, fAngleS, ByteSwap(pcolSmoke[iIndex])); @@ -5303,7 +5304,7 @@ void Particles_CollectEnergy(CEntity *pen, FLOAT tmStart, FLOAT tmStop) UBYTE ubR = (UBYTE) (255);//+afStarsPositions[iRnd][1]*64; UBYTE ubG = (UBYTE) (128+(1.0f-fT)*128);//223+afStarsPositions[iRnd][2]*64; - UBYTE ubB = (UBYTE) (16+afStarsPositions[iRnd][3]*32+(1.0f-fT)*64); + UBYTE ubB = (UBYTE) (16+afStarsPositions[iRnd][2]*32+(1.0f-fT)*64); UBYTE ubA = (UBYTE) (CalculateRatio( fT, 0.0f, 1.0f, 0.4f, 0.01f)*255); COLOR colLine = RGBToColor( ubR, ubG, ubB) | ubA; @@ -5339,7 +5340,7 @@ void Particles_CollectEnergy(CEntity *pen, FLOAT tmStart, FLOAT tmStop) vZ*Cos(fT*360.0f)*fRadius; UBYTE ubR = (UBYTE) (255); UBYTE ubG = (UBYTE) (128+(1.0f-fT)*128); - UBYTE ubB = (UBYTE) (16+afStarsPositions[iRnd][3]*32+(1.0f-fT)*64); + UBYTE ubB = (UBYTE) (16+afStarsPositions[iRnd][2]*32+(1.0f-fT)*64); FLOAT fFader=CalculateRatio( fT, 0.0f, 1.0f, 0.4f, 0.01f); FLOAT fPulser=(1.0f+(sin((fT*fT)/4.0f)))/2.0f; UBYTE ubA = (UBYTE) (fFader*fPulser*255); @@ -5404,9 +5405,9 @@ void Particles_SummonerDisappear( CEntity *pen, FLOAT tmStart) for( INDEX iVtx=0; iVtx