From f63ca316d774293521154e542efc730e64753de8 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Fri, 6 May 2016 13:19:11 +1000 Subject: [PATCH] Reject invalid terrain.png (non square, non power of 2) instead of crashing. (Thanks 123DMWM) --- ClassicalSharp/Game/Game.cs | 11 +++++++++-- ClassicalSharp/Network/INetworkProcessor.cs | 4 ++-- ClassicalSharp/TexturePack/Animations.cs | 4 ++-- ClassicalSharp/TexturePack/TexturePackExtractor.cs | 4 +++- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/ClassicalSharp/Game/Game.cs b/ClassicalSharp/Game/Game.cs index e6fbd1dff..5d0abacfa 100644 --- a/ClassicalSharp/Game/Game.cs +++ b/ClassicalSharp/Game/Game.cs @@ -34,9 +34,16 @@ namespace ClassicalSharp { TerrainAtlas1D.UpdateState( TerrainAtlas ); } - public void ChangeTerrainAtlas( Bitmap newAtlas ) { - LoadAtlas( newAtlas ); + public bool ChangeTerrainAtlas( Bitmap atlas ) { + bool pow2 = Utils.IsPowerOf2( atlas.Width ) && Utils.IsPowerOf2( atlas.Height ); + if( !pow2 || atlas.Width != atlas.Height ) { + Chat.Add( "&cCurrent texture pack has an invalid terrain.png" ); + Chat.Add( "&cWidth and length must be the same, and also powers of two." ); + return false; + } + LoadAtlas( atlas ); Events.RaiseTerrainAtlasChanged(); + return true; } public void Run() { window.Run(); } diff --git a/ClassicalSharp/Network/INetworkProcessor.cs b/ClassicalSharp/Network/INetworkProcessor.cs index 82787d670..a37907d1a 100644 --- a/ClassicalSharp/Network/INetworkProcessor.cs +++ b/ClassicalSharp/Network/INetworkProcessor.cs @@ -134,7 +134,7 @@ namespace ClassicalSharp { Utils.LogDebug( "Converting terrain atlas to 32bpp image" ); game.Drawer2D.ConvertTo32Bpp( ref bmp ); } - game.ChangeTerrainAtlas( bmp ); + if( !game.ChangeTerrainAtlas( bmp ) ) { bmp.Dispose(); return; } TextureCache.AddToCache( item.Url, bmp ); TextureCache.AddETagToCache( item.Url, item.ETag, game.ETags ); } else if( Is304Status( item.WebEx ) ) { @@ -143,7 +143,7 @@ namespace ClassicalSharp { ExtractDefault(); } else if( item.Url != game.World.TextureUrl ) { game.Animations.Dispose(); - game.ChangeTerrainAtlas( bmp ); + if( !game.ChangeTerrainAtlas( bmp ) ) { bmp.Dispose(); return; } } if( bmp != null ) game.World.TextureUrl = item.Url; diff --git a/ClassicalSharp/TexturePack/Animations.cs b/ClassicalSharp/TexturePack/Animations.cs index 924617c08..b5acea3a0 100644 --- a/ClassicalSharp/TexturePack/Animations.cs +++ b/ClassicalSharp/TexturePack/Animations.cs @@ -35,8 +35,8 @@ namespace ClassicalSharp.TexturePack { public void Tick( double delta ) { if( animations.Count == 0 ) return; if( fastBmp == null ) { - game.Chat.Add( "&cCurrent texture pack specifies it uses animations,"); - game.Chat.Add( "&cbut it is missing animations.png"); + game.Chat.Add( "&cCurrent texture pack specifies it uses animations," ); + game.Chat.Add( "&cbut is missing animations.png" ); animations.Clear(); return; } diff --git a/ClassicalSharp/TexturePack/TexturePackExtractor.cs b/ClassicalSharp/TexturePack/TexturePackExtractor.cs index e41cffe59..1a708aa69 100644 --- a/ClassicalSharp/TexturePack/TexturePackExtractor.cs +++ b/ClassicalSharp/TexturePack/TexturePackExtractor.cs @@ -43,7 +43,9 @@ namespace ClassicalSharp.TexturePack { switch( filename ) { case "terrain.png": - game.ChangeTerrainAtlas( Platform.ReadBmp( stream ) ); break; + Bitmap atlas = Platform.ReadBmp( stream ); + if( !game.ChangeTerrainAtlas( atlas ) ) atlas.Dispose(); + break; case "chicken.png": UpdateTexture( ref cache.ChickenTexId, stream, false ); break; case "creeper.png":