From 67a656a4df326ebfcbca48c76efdc4fc39554093 Mon Sep 17 00:00:00 2001 From: Sierraffinity Date: Mon, 4 Jan 2021 16:26:28 -0800 Subject: Fix/document possible division by zero in ConvertScaleParam --- gflib/sprite.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'gflib/sprite.c') diff --git a/gflib/sprite.c b/gflib/sprite.c index c7e3d09a3..e36c53721 100644 --- a/gflib/sprite.c +++ b/gflib/sprite.c @@ -1319,8 +1319,18 @@ void ApplyAffineAnimFrameRelativeAndUpdateMatrix(u8 matrixNum, struct AffineAnim s16 ConvertScaleParam(s16 scale) { + s16 ret; s32 val = 0x10000; - return val / scale; + // UB: possible division by zero +#ifdef UBFIX + if (scale != 0) + ret = val / scale; + else + ret = 0; +#else + ret = val / scale; +#endif //UBFIX + return ret; } void GetAffineAnimFrame(u8 matrixNum, struct Sprite *sprite, struct AffineAnimFrameCmd *frameCmd) -- cgit v1.2.3 From a982e6ab8887853eb6d8776485e5b1d80bd0c645 Mon Sep 17 00:00:00 2001 From: Sierraffinity Date: Mon, 4 Jan 2021 16:39:35 -0800 Subject: Make div by zero fix more concice --- gflib/sprite.c | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) (limited to 'gflib/sprite.c') diff --git a/gflib/sprite.c b/gflib/sprite.c index e36c53721..2616aeaed 100644 --- a/gflib/sprite.c +++ b/gflib/sprite.c @@ -1319,18 +1319,13 @@ void ApplyAffineAnimFrameRelativeAndUpdateMatrix(u8 matrixNum, struct AffineAnim s16 ConvertScaleParam(s16 scale) { - s16 ret; s32 val = 0x10000; // UB: possible division by zero #ifdef UBFIX - if (scale != 0) - ret = val / scale; - else - ret = 0; -#else - ret = val / scale; + if (scale == 0) + return 0; #endif //UBFIX - return ret; + return val / scale; } void GetAffineAnimFrame(u8 matrixNum, struct Sprite *sprite, struct AffineAnimFrameCmd *frameCmd) -- cgit v1.2.3 From b04f0aaa2beb4dad08f78716ce1865b797fc34bd Mon Sep 17 00:00:00 2001 From: GriffinR Date: Sat, 20 Feb 2021 00:30:37 -0500 Subject: Use SPRITE_NONE constant --- gflib/sprite.c | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) (limited to 'gflib/sprite.c') diff --git a/gflib/sprite.c b/gflib/sprite.c index 2616aeaed..764ead3d3 100644 --- a/gflib/sprite.c +++ b/gflib/sprite.c @@ -33,6 +33,12 @@ struct SpriteCopyRequest u16 size; }; +struct OamDimensions32 +{ + s32 width; + s32 height; +}; + struct OamDimensions { s8 width; @@ -240,25 +246,28 @@ static const AffineAnimCmdFunc sAffineAnimCmdFuncs[] = AffineAnimCmd_frame, }; -static const s32 sUnknown_082EC6F4[3][4][2] = +static const struct OamDimensions32 sOamDimensions32[3][4] = { + [ST_OAM_SQUARE] = { - {8, 8}, - {0x10, 0x10}, - {0x20, 0x20}, - {0x40, 0x40}, + [SPRITE_SIZE(8x8)] = { 8, 8 }, + [SPRITE_SIZE(16x16)] = { 16, 16 }, + [SPRITE_SIZE(32x32)] = { 32, 32 }, + [SPRITE_SIZE(64x64)] = { 64, 64 }, }, + [ST_OAM_H_RECTANGLE] = { - {0x10, 8}, - {0x20, 8}, - {0x20, 0x10}, - {0x40, 0x20}, + [SPRITE_SIZE(16x8)] = { 16, 8 }, + [SPRITE_SIZE(32x8)] = { 32, 8 }, + [SPRITE_SIZE(32x16)] = { 32, 16 }, + [SPRITE_SIZE(64x32)] = { 64, 32 }, }, + [ST_OAM_V_RECTANGLE] = { - {8, 0x10}, - {8, 0x20}, - {0x10, 0x20}, - {0x20, 0x40}, + [SPRITE_SIZE(8x16)] = { 8, 16 }, + [SPRITE_SIZE(8x32)] = { 8, 32 }, + [SPRITE_SIZE(16x32)] = { 16, 32 }, + [SPRITE_SIZE(32x64)] = { 32, 64 }, }, }; @@ -1233,14 +1242,14 @@ void obj_update_pos2(struct Sprite *sprite, s32 a1, s32 a2) u32 matrixNum = sprite->oam.matrixNum; if (a1 != 0x800) { - var0 = sUnknown_082EC6F4[sprite->oam.shape][sprite->oam.size][0]; + var0 = sOamDimensions32[sprite->oam.shape][sprite->oam.size].width; var1 = var0 << 8; var2 = (var0 << 16) / gOamMatrices[matrixNum].a; sprite->pos2.x = sub_8007E28(var1, var2, a1); } if (a2 != 0x800) { - var0 = sUnknown_082EC6F4[sprite->oam.shape][sprite->oam.size][1]; + var0 = sOamDimensions32[sprite->oam.shape][sprite->oam.size].height; var1 = var0 << 8; var2 = (var0 << 16) / gOamMatrices[matrixNum].d; sprite->pos2.y = sub_8007E28(var1, var2, a2); -- cgit v1.2.3 From dfc6ee0e9e20658a80e4080da16c2f6423b85457 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Fri, 19 Mar 2021 18:17:43 -0400 Subject: Add SAFE_DIV --- gflib/sprite.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) (limited to 'gflib/sprite.c') diff --git a/gflib/sprite.c b/gflib/sprite.c index 764ead3d3..c66b1e47d 100644 --- a/gflib/sprite.c +++ b/gflib/sprite.c @@ -1329,12 +1329,7 @@ void ApplyAffineAnimFrameRelativeAndUpdateMatrix(u8 matrixNum, struct AffineAnim s16 ConvertScaleParam(s16 scale) { s32 val = 0x10000; - // UB: possible division by zero -#ifdef UBFIX - if (scale == 0) - return 0; -#endif //UBFIX - return val / scale; + return SAFE_DIV(val, scale); } void GetAffineAnimFrame(u8 matrixNum, struct Sprite *sprite, struct AffineAnimFrameCmd *frameCmd) -- cgit v1.2.3 From a454f9c187008e791d05da8c378ac8f553f4ce3e Mon Sep 17 00:00:00 2001 From: gAlfonso-bit <83477269+gAlfonso-bit@users.noreply.github.com> Date: Sun, 23 May 2021 10:10:55 -0400 Subject: UBFIX: sprite.c (#1442) Fix out-of-bounds array access in `SortSprites()`. Co-authored-by: Marcus Huderle --- gflib/sprite.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'gflib/sprite.c') diff --git a/gflib/sprite.c b/gflib/sprite.c index c66b1e47d..f97ecc712 100644 --- a/gflib/sprite.c +++ b/gflib/sprite.c @@ -452,6 +452,10 @@ void SortSprites(void) // Although this doesn't result in a bug in the ROM, // the behavior is undefined. j--; +#ifdef UBFIX + if (j == 0) + break; +#endif sprite1 = &gSprites[sSpriteOrder[j - 1]]; sprite2 = &gSprites[sSpriteOrder[j]]; @@ -661,8 +665,7 @@ void ResetOamRange(u8 a, u8 b) for (i = a; i < b; i++) { - struct OamData *oamBuffer = gMain.oamBuffer; - oamBuffer[i] = *(struct OamData *)&gDummyOamData; + gMain.oamBuffer[i] = *(struct OamData *)&gDummyOamData; } } -- cgit v1.2.3