es ist unglaublich was für Ungetüme einem auf hoher See begegnen, jedoch ist das nichts im Vergleich dazu, was dir begegnet wenn du dich mal genauer im Source von unseren lieben Freunden YMIR umschaust. Ich hatte komischerweise öfter mal Clientabstürze und wollte dem auf dem Grund gehen, also habe ich gesucht.. gesucht.. und herausgefunden, dass der Client manchmal beim Laden meiner "fog.tga" abschmiert.
Sehr komisch, denn er läd sie beim ersten mal korrekt ein und beim zweiten mal hat er sie ja sogar noch an der gleichen Adresse im Ram mit der gleichen Größe... achja die Größe, darauf wird von YMIR nicht besonders viel Wert gelegt. Spielt ja auch nicht so die Rolle, wann ne Datei zu Ende ist - findet ihr nicht auch ? :3
Schaut euch mal die Funktion CDXTCImage::LoadHeaderFromMemory in der Datei EterImageLib/DXTCImage.cpp an. Ihr werdet feststellen, sie besitzt lediglich ein Argument:
Code:
bool CDXTCImage::LoadHeaderFromMemory(const BYTE * c_pbMap)
Für alle die nicht wissen was sie tun müssen (hier ist das eigentliche Release):
Code:
bool CDXTCImage::LoadHeaderFromMemory(const BYTE * c_pbMap)
Code:
bool CDXTCImage::LoadHeaderFromMemory(const BYTE * c_pbMap, int iSize)
Unter
Code:
DWORD dwMagic;
Code:
if (iSize < sizeof(DWORD)) return false;
Code:
dwMagic = *(DWORD *) c_pbMap; c_pbMap += sizeof(DWORD);
Code:
iSize -= sizeof(DWORD);
Code:
DDSURFACEDESC2 ddsd; // read from dds file
Code:
if (iSize < sizeof(DDSURFACEDESC2)) return false;
Code:
memcpy(&ddsd, c_pbMap, sizeof(DDSURFACEDESC2)); c_pbMap += sizeof(DDSURFACEDESC2);
Code:
iSize -= sizeof(DDSURFACEDESC2);
Code:
return LoadFromMemory((const BYTE*) pvMap);
Code:
return LoadFromMemory((const BYTE*) pvMap, mappedFile.Size());
Code:
bool CDXTCImage::LoadFromMemory(const BYTE * c_pbMap)
Code:
bool CDXTCImage::LoadFromMemory(const BYTE * c_pbMap, int iSize)
Code:
if (!LoadHeaderFromMemory(c_pbMap))
Code:
if (!LoadHeaderFromMemory(c_pbMap, iSize))
Code:
if (image.LoadHeaderFromMemory((const BYTE *) c_pvBuf))
Code:
if (image.LoadHeaderFromMemory((const BYTE *) c_pvBuf, bufSize))
€dit: Short english explanation: There was a missing file size check in the function where the image files are checked on their format (dds or not dds) - and if the dds header was checked and the file was smaller than the dds header size (125mb) it could happen that the client aborted because he thought it was a dds file and tried to read farther than the file reaches. Well, bad english and I didn't really tried hard but I hope you're able to understand :3
Ihr habts geschafft :3
Lefloyd ^_^