Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@gmail.com>2019-04-16 04:39:29 +0300
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2019-04-16 04:41:17 +0300
commitdb80d5c560f55eaaad2702a4dae61b4b9c027e26 (patch)
tree8b6cb721cea99c29e615429adf8d7f37996af552 /source/blender/imbuf/intern/dds/Stream.cpp
parent6a50a3d140d7050dcfa391eb55d5a03720b06f3a (diff)
Fix T62852: crash reading corrupt DDS file.
Diffstat (limited to 'source/blender/imbuf/intern/dds/Stream.cpp')
-rw-r--r--source/blender/imbuf/intern/dds/Stream.cpp20
1 files changed, 14 insertions, 6 deletions
diff --git a/source/blender/imbuf/intern/dds/Stream.cpp b/source/blender/imbuf/intern/dds/Stream.cpp
index 92b5923e8a1..d8c2862cc09 100644
--- a/source/blender/imbuf/intern/dds/Stream.cpp
+++ b/source/blender/imbuf/intern/dds/Stream.cpp
@@ -30,7 +30,7 @@ static const char *msg_error_read = "DDS: trying to read beyond end of stream (c
unsigned int Stream::seek(unsigned int p)
{
if (p > size) {
- puts(msg_error_seek);
+ set_failed(msg_error_seek);
}
else {
pos = p;
@@ -42,7 +42,7 @@ unsigned int Stream::seek(unsigned int p)
unsigned int mem_read(Stream & mem, unsigned long long & i)
{
if (mem.pos + 8 > mem.size) {
- puts(msg_error_seek);
+ mem.set_failed(msg_error_seek);
return(0);
}
memcpy(&i, mem.mem + mem.pos, 8); // @@ todo: make sure little endian
@@ -53,7 +53,7 @@ unsigned int mem_read(Stream & mem, unsigned long long & i)
unsigned int mem_read(Stream & mem, unsigned int & i)
{
if (mem.pos + 4 > mem.size) {
- puts(msg_error_read);
+ mem.set_failed(msg_error_read);
return(0);
}
memcpy(&i, mem.mem + mem.pos, 4); // @@ todo: make sure little endian
@@ -64,7 +64,7 @@ unsigned int mem_read(Stream & mem, unsigned int & i)
unsigned int mem_read(Stream & mem, unsigned short & i)
{
if (mem.pos + 2 > mem.size) {
- puts(msg_error_read);
+ mem.set_failed(msg_error_read);
return(0);
}
memcpy(&i, mem.mem + mem.pos, 2); // @@ todo: make sure little endian
@@ -75,7 +75,7 @@ unsigned int mem_read(Stream & mem, unsigned short & i)
unsigned int mem_read(Stream & mem, unsigned char & i)
{
if (mem.pos + 1 > mem.size) {
- puts(msg_error_read);
+ mem.set_failed(msg_error_read);
return(0);
}
i = (mem.mem + mem.pos)[0];
@@ -86,10 +86,18 @@ unsigned int mem_read(Stream & mem, unsigned char & i)
unsigned int mem_read(Stream & mem, unsigned char *i, unsigned int cnt)
{
if (mem.pos + cnt > mem.size) {
- puts(msg_error_read);
+ mem.set_failed(msg_error_read);
return(0);
}
memcpy(i, mem.mem + mem.pos, cnt);
mem.pos += cnt;
return(cnt);
}
+
+void Stream::set_failed(const char *msg)
+{
+ if (!failed) {
+ puts(msg_error_seek);
+ failed = true;
+ }
+}