[C++] Clientside BugFix für Clientabstürze

10/11/2015 19:44 Lefloyd#1
Ahoi Seemänner,
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)
Diese Funktion soll überprüfen, ob es sich um eine DDS-Datei oder eine andere Datei handelt, es wird also auf einen DDS-Header geprüft. Vielleicht ist euch aufgefallen, eine Größe von c_pbMap wurde nicht übergeben :) Der DDS-Header besitzt eine Größe von 125 (Magic + DDSURFACEDESC2)... alles gut und schön, doch was wenn eure Datei keine 125 Bytes groß ist? Tjaaaa meine fog.tga war 74 Bytes groß - ich denke das reicht an Erläuterungen oder?^^

Für alle die nicht wissen was sie tun müssen (hier ist das eigentliche Release):
Code:
bool CDXTCImage::LoadHeaderFromMemory(const BYTE * c_pbMap)
mit
Code:
bool CDXTCImage::LoadHeaderFromMemory(const BYTE * c_pbMap, int iSize)
ersetzen.
Unter
Code:
DWORD dwMagic;
Folgendes einfügen:
Code:
if (iSize < sizeof(DWORD))
		return false;
Unter
Code:
dwMagic = *(DWORD *) c_pbMap;
	c_pbMap += sizeof(DWORD);
Folgendes einfügen:
Code:
iSize -= sizeof(DWORD);
Unter
Code:
DDSURFACEDESC2 ddsd; // read from dds file
Folgendes einfügen:
Code:
if (iSize < sizeof(DDSURFACEDESC2))
		return false;
Unter
Code:
memcpy(&ddsd, c_pbMap, sizeof(DDSURFACEDESC2));
	c_pbMap += sizeof(DDSURFACEDESC2);
Folgendes einfügen (JA das ist wichtig!):
Code:
iSize -= sizeof(DDSURFACEDESC2);
Nun drei Zeilen über diese Funktion gehen wo ihr Folgendes seht:
Code:
return LoadFromMemory((const BYTE*) pvMap);
Das mit Folgendem ersetzen:
Code:
return LoadFromMemory((const BYTE*) pvMap, mappedFile.Size());
Nun geht ihr drei Zeilen unter die Funktion wo steht:
Code:
bool CDXTCImage::LoadFromMemory(const BYTE * c_pbMap)
Das mit Folgendem ersetzen:
Code:
bool CDXTCImage::LoadFromMemory(const BYTE * c_pbMap, int iSize)
Dann zwei Zeilen runter wo steht:
Code:
if (!LoadHeaderFromMemory(c_pbMap))
Das ersetzt ihr mit:
Code:
if (!LoadHeaderFromMemory(c_pbMap, iSize))
Die Deklarationen müsste ihr auch noch anpassen (bei den beiden Funktionen jeweils ein "int iSize" ans Ende der Argumentenliste hinzufügen), aber ich bin sicher das schafft ihr ohne ausführliches Tutorial. Nun nur noch die EterLib/GrpImageTexture.cpp öffnen und suchen nach:
Code:
if (image.LoadHeaderFromMemory((const BYTE *) c_pvBuf))
ersetzen mit:
Code:
if (image.LoadHeaderFromMemory((const BYTE *) c_pvBuf, bufSize))
Just to remember: Das ist nicht der ultimative Fix der alle Clientabstürze verhindert..^^ Er fixxt lediglich eine Quelle der Abstürze - aber besser als nix oder ? :D

€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 ^_^
10/11/2015 20:11 QuickFlameZ#2
Bist schon so ein Noob nh!

Nettes Release :*
10/11/2015 20:30 .T4Ump#3
Please, english? :D I dont know what it does :D But thanks ^^
10/11/2015 20:36 TiRez#4
Ouh ja... Wer kennt nicht diese Problematik, mit der man konfrontiert wird, wenn man mal den Source betrachtet.

[20:14:58] Kirito Dragneel: YMIR IST SO UNFÄHIG
[20:15:00] Kirito Dragneel: ICH VERSTEH SIE NICHT
[20:15:03] Kirito Dragneel: KÖNNEN DIE NICHT EINMAL
[20:15:06] Kirito Dragneel: BISSCHEN SAFE CODEN
[20:15:06] Kirito Dragneel: ALTEr

Danke für das Release <3
10/11/2015 20:39 Lefloyd#5
Short english explanation added.

Jaaaa der Fehler hat mich schon bissl geraged xD ne scheiß Stunde verschwendet damit ._. :D
10/11/2015 21:06 .NennoX#6
Aus Prinzip Like da gelassen. :D

Weiter so! Kann zwar damit nichts anfangen, aber who cares.
10/12/2015 12:06 worldend#7
How to add or change this function "int iSize"?


[Only registered and activated users can see links. Click Here To Register...]
10/12/2015 12:32 thespeedyy#8
Das bringt jetzt waaaas :D
10/12/2015 12:42 Mi4uric3#9
Quote:
Originally Posted by thespeedyy View Post
Das bringt jetzt waaaas :D
Lesen bildet..?
10/12/2015 15:18 [Flash]#10
Quote:
Originally Posted by TiRez View Post
Ouh ja... Wer kennt nicht diese Problematik, mit der man konfrontiert wird, wenn man mal den Source betrachtet.

[20:14:58] Kirito Dragneel: YMIR IST SO UNFÄHIG
[20:15:00] Kirito Dragneel: ICH VERSTEH SIE NICHT
[20:15:03] Kirito Dragneel: KÖNNEN DIE NICHT EINMAL
[20:15:06] Kirito Dragneel: BISSCHEN SAFE CODEN
[20:15:06] Kirito Dragneel: ALTEr

Danke für das Release <3
Du weißt aber schon dass der Code 2004 angefangen wurde zu coden oder ?
Und dass es schlitz Augen gecoded haben :D

Kirito Dragneel
10/12/2015 15:33 Mi4uric3#11
Quote:
Originally Posted by [Flash] View Post
Du weißt aber schon dass der Code 2004 angefangen wurde zu coden oder ?
Und dass es schlitz Augen gecoded haben :D

Kirito Dragneel
Was haben diese rassistischen Aussagen mit TiRez Nachricht zu tun?

@TiRez: Ich hab mich das auch immer gefragt, aber man muss halt auch (leider) die Realität sehen. Wenn du in Asien als Spiele-Entwickler arbeitest, wird dir meist leider nicht die Sicherheit, sondern die Geschwindigkeit als oberste Priorität gesetzt. Wär ja ansich kein Problem da ein Security-Auditing drüber laufen zu lassen, zahlt nur keiner. Wenn der Kunde Probleme mit Sicherheitslücken hat, werden die halt anschließend per Change-Request gefixt.
10/13/2015 21:43 °Ace°#12
Kann mir einer behilflich sein, habe 34 Errors.. ?
[Only registered and activated users can see links. Click Here To Register...]
10/13/2015 21:53 .K0rí#13
Danke dir ich habe es mal geadded in : [Only registered and activated users can see links. Click Here To Register...]
10/14/2015 18:55 TiRez#14
Quote:
Originally Posted by Mi4uric3 View Post
Was haben diese rassistischen Aussagen mit TiRez Nachricht zu tun?

@TiRez: Ich hab mich das auch immer gefragt, aber man muss halt auch (leider) die Realität sehen. Wenn du in Asien als Spiele-Entwickler arbeitest, wird dir meist leider nicht die Sicherheit, sondern die Geschwindigkeit als oberste Priorität gesetzt. Wär ja ansich kein Problem da ein Security-Auditing drüber laufen zu lassen, zahlt nur keiner. Wenn der Kunde Probleme mit Sicherheitslücken hat, werden die halt anschließend per Change-Request gefixt.
Huuuu,

mein Beitrag war eher ein Insider ^^ Klar ist mir das bewusst. Auch ist mir bewusst dass der Code 10+ Jahre her ist und die damals bestimmt net die größten Möglichkeiten hatten. Und auch ist mir bewusst, dass die wahrscheinlich nicht damit gerechnet hatten den Source public zu sehen.

Nichts desto trotz danken wir ymir für ihre Arbeit, was für uns zum Hobby wurde.
10/15/2015 00:57 worldend#15
Quote:
Originally Posted by worldend View Post
How to add or change this function "int iSize"?


[Only registered and activated users can see links. Click Here To Register...]
!! Refresh !! How to add this declaration. Any one please?