diff --git a/CHANGELOG.md b/CHANGELOG.md index ed82aec..812cebd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Panic in `::from_str` when parsing non-ascii input. (#290) - Index out of bounds in `InfiniteTileLayerData` when parsing a chunk. (#289) - Panic on unexpected XML in `ObjectData` content. (#291) +- Divide by zero when parsing a tileset with height/width dimension of 0. (#292) ## [Unreleased] ## Changed diff --git a/src/error.rs b/src/error.rs index c60b104..727d387 100644 --- a/src/error.rs +++ b/src/error.rs @@ -1,3 +1,4 @@ +use crate::InvalidTilesetError::InvalidTileDimensions; use std::num::ParseIntError; use std::{fmt, path::PathBuf}; @@ -19,6 +20,27 @@ impl fmt::Display for CsvDecodingError { impl std::error::Error for CsvDecodingError {} +/// Errors that can occur parsing a Tileset. +#[derive(Clone, Debug, PartialEq, Eq)] +#[non_exhaustive] +pub enum InvalidTilesetError { + /// An invalid width or height (0) dimension was found in the input. + InvalidTileDimensions, +} + +impl fmt::Display for InvalidTilesetError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + InvalidTileDimensions => write!( + f, + "An invalid width or height (0) dimension was found in the input." + ), + } + } +} + +impl std::error::Error for InvalidTilesetError {} + /// Errors which occurred when parsing the file #[derive(Debug)] #[non_exhaustive] @@ -83,6 +105,8 @@ pub enum Error { /// A description of the error that occurred. description: String, }, + /// There was an invalid tileset in the map parsed. + InvalidTileset(InvalidTilesetError), } /// A result with an error variant of [`crate::Error`]. @@ -133,6 +157,7 @@ impl fmt::Display for Error { write!(fmt, "\"{}\" is not a valid WangId format", read_string), Error::InvalidObjectData{description} => write!(fmt, "Invalid object data: {}", description), + Error::InvalidTileset(e) => write!(fmt, "{}", e), } } } diff --git a/src/tileset.rs b/src/tileset.rs index 425040c..4218ba5 100644 --- a/src/tileset.rs +++ b/src/tileset.rs @@ -7,7 +7,7 @@ use crate::error::{Error, Result}; use crate::image::Image; use crate::properties::{parse_properties, Properties}; use crate::tile::TileData; -use crate::{util::*, Gid, ResourceCache, ResourceReader, Tile, TileId}; +use crate::{util::*, Gid, InvalidTilesetError, ResourceCache, ResourceReader, Tile, TileId}; mod wangset; pub use wangset::*; @@ -284,6 +284,12 @@ impl Tileset { let is_image_collection_tileset = image.is_none(); if !is_image_collection_tileset { + if prop.tile_width == 0 || prop.tile_height == 0 { + return Err(Error::InvalidTileset( + InvalidTilesetError::InvalidTileDimensions, + )); + } + for tile_id in 0..prop.tilecount { tiles.entry(tile_id).or_default(); }