diff options
author | Auke Kok <sofar+github@foo-projects.org> | 2017-02-05 23:59:18 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-02-05 23:59:18 -0800 |
commit | 3e30731c1ac313b504ff15eb7f40ce6a387d3da2 (patch) | |
tree | 86eb9fa3d5539e14185712ad4f6f2d73a9c40ed3 /src | |
parent | 80c75272a6ffff34069ed470e959f7ff007e6c06 (diff) | |
download | minetest-3e30731c1ac313b504ff15eb7f40ce6a387d3da2.tar.gz minetest-3e30731c1ac313b504ff15eb7f40ce6a387d3da2.tar.bz2 minetest-3e30731c1ac313b504ff15eb7f40ce6a387d3da2.zip |
Prevent SIGFPE on entity tile loading issue. (#5178)
While experimenting with entities I ran into this unresolvable
error where the server is sending some texture that the client
crashes on. The crash prevents the client from ever reconnecting,
resulting in a server that has to use clearobjects.
We shouldn't crash but just ignore the object and move on.
```
0x00000000004dc0de in TextureSource::generateImagePart (this=this@entry=0x7118eb0, part_of_name="[applyfiltersformesh",
baseimg=@0x7fffffffbe98: 0x9f1b010) at /home/sofar/git/minetest/src/client/tile.cpp:1744
1744 u32 xscale = scaleto / dim.Width;
(gdb) bt
#0 0x00000000004dc0de in TextureSource::generateImagePart (this=this@entry=0x7118eb0, part_of_name="[applyfiltersformesh",
baseimg=@0x7fffffffbe98: 0x9f1b010) at /home/sofar/git/minetest/src/client/tile.cpp:1744
```
After reconnecting, the client now can connect without issues
and displays an error message:
```
ERROR[Main]: generateImagePart(): Illegal 0 dimension for part_of_name="[applyfiltersformesh", cancelling.
ERROR[Main]: generateImage(): Failed to generate "[applyfiltersformesh"
ERROR[Main]: Irrlicht: Invalid size of image for OpenGL Texture.
```
Diffstat (limited to 'src')
-rw-r--r-- | src/client/tile.cpp | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/src/client/tile.cpp b/src/client/tile.cpp index fbc0f1709..000c766d0 100644 --- a/src/client/tile.cpp +++ b/src/client/tile.cpp @@ -1741,6 +1741,12 @@ bool TextureSource::generateImagePart(std::string part_of_name, * equal to the target minimum. If e.g. this is a vertical frames * animation, the short dimension will be the real size. */ + if ((dim.Width == 0) || (dim.Height == 0)) { + errorstream << "generateImagePart(): Illegal 0 dimension " + << "for part_of_name=\""<< part_of_name + << "\", cancelling." << std::endl; + return false; + } u32 xscale = scaleto / dim.Width; u32 yscale = scaleto / dim.Height; u32 scale = (xscale > yscale) ? xscale : yscale; |