summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Riedesel <mark@klowner.com>2022-10-30 11:20:50 -0500
committerMark Riedesel <mark@klowner.com>2022-10-30 11:20:50 -0500
commit5cb07486db6fc53cc5a13e3451dd451e987f39d7 (patch)
tree734382e2946a2a757fd4e136f4d8ca27e1320852
parentad3f2a234082f0d62820094199c05855115c1341 (diff)
Add buffer size check to Image.load_tga_from_buffer(). Fixes #67985
-rw-r--r--modules/tga/image_loader_tga.cpp8
1 files changed, 7 insertions, 1 deletions
diff --git a/modules/tga/image_loader_tga.cpp b/modules/tga/image_loader_tga.cpp
index a6fc650414..8adde3c5d3 100644
--- a/modules/tga/image_loader_tga.cpp
+++ b/modules/tga/image_loader_tga.cpp
@@ -284,14 +284,21 @@ Error ImageLoaderTGA::load_image(Ref<Image> p_image, Ref<FileAccess> f, BitField
err = FAILED;
}
+ uint64_t color_map_size;
if (has_color_map) {
if (tga_header.color_map_length > 256 || (tga_header.color_map_depth != 24) || tga_header.color_map_type != 1) {
err = FAILED;
}
+ color_map_size = tga_header.color_map_length * (tga_header.color_map_depth >> 3);
} else {
if (tga_header.color_map_type) {
err = FAILED;
}
+ color_map_size = 0;
+ }
+
+ if ((src_image_len - f->get_position()) < (tga_header.id_length + color_map_size)) {
+ err = FAILED; // TGA data appears to be truncated (fewer bytes than expected).
}
if (tga_header.image_width <= 0 || tga_header.image_height <= 0) {
@@ -308,7 +315,6 @@ Error ImageLoaderTGA::load_image(Ref<Image> p_image, Ref<FileAccess> f, BitField
Vector<uint8_t> palette;
if (has_color_map) {
- size_t color_map_size = tga_header.color_map_length * (tga_header.color_map_depth >> 3);
err = palette.resize(color_map_size);
if (err == OK) {
uint8_t *palette_w = palette.ptrw();