Big-Endian support is broken

Bug #912427 reported by Tobias Netzel
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
Return To The Roots
Status tracked in S25client
S25client
Fix Released
Medium
FloSoft

Bug Description

Mithilfe von libgmalloc.dylib konnte ich den seit Jahren bestehenden Bug eingrenzen, der auf Mac OS X PowerPC das Spiel beim Starten zum Absturz bringt.

Es kommt zu einer Array-Bereichsüberschreitung in libsiedler2::baseArchivItem_Bitmap_Player::load (this=0xedd86f60, width=4, height=11, image=0xedd88fe6 '\004' <repeats 11 times>, starts=0xedd88fd0, absolute=false, length=33, palette=0xeca4bcb0).

Wäre schön, wenn das endlich beseitigt werden könnte. Da ihr das wahrscheinlich nicht selber tun könnt, bitte ich um Hilfe beim Debuggen. Der angehängte backtrace könnte schonmal helfen.

Wurde RTTR schon einmal erfolgreich auf einer Big-Endian-Plattform getestet? Falls nicht, würde ich zunächst ein Endian-Problem vermuten.

Tags: all-rev
Revision history for this message
Tobias Netzel (tobias-netzel) wrote :
Revision history for this message
Tobias Netzel (tobias-netzel) wrote :

Bin mittlerweile selber vorangekommen bei der Fehlersuche.

Habe herausgefunden, dass beim Laden der 16-Bit-Offsets zu Beginn einer Bitmap nicht auf Endianness geachtet wird. Dies habe ich an allen notwendigen Stellen fürs Laden und Speichern ergänzt und das Spiel kann dann geladen und auch gespielt werden - offensichtlich zum ersten Mal auf einer Big-Endian-Plattform!

Allerdings kann ich nur spielen, wenn ich verhindere, dass der Sound-Treiber geladen wird, da das Programm abstürzt bei dem Versuch, das Klick-Geräusch im Hauptmenü per SDL abzuspielen.

Habe außerdem noch einen recht fatalen Endian-Fehler beim Reservieren des Speichers für MIDI-Tracks korrigiert; die Länge eines MIDI-Tracks wurde mit der falschen Endianness ausgelesen, was in Speicherreservierungsversuchen von über 3GB Größe resultierte. Dies führte auf meinem 32-Bit-PowerPC dazu, dass das Programm vom MacOS umgehend gekillt wurde.

Meine bisherigen Patches habe ich als diff angehängt.

summary: - Array-Bereichsüberschreitung beim Laden von S2/DATA/RESOURCE.DAT
+ Big-Endian support is broken
Revision history for this message
Tobias Netzel (tobias-netzel) wrote :

Bei den Wave-Dateien gab es auch Endianness-Probleme.
Zum Teil ist resample auch einfach für Little-Endian vorkonfiguriert - die Konfiguration müsste beim build erfolgen. In meinem Patch habe ich die mus-config.h für Big-Endian vorkondiguriert.

Mit dem angehängten Patch kann ich das Spiel starten und spielen.

Revision history for this message
FloSoft (flosoft) wrote :

habe den patch in rev7811 hinzugefügt

- hab noch ein paar kleinigkeiten korrigiert (int i wurde im gleichen scope 2x verwendet)
- die sndlib wählt nun je nach system ob es bigendian oder little endian ist.
- libendian.h hatte nicht BYTE_ORDER definiert - habe das nun alles in einen header "endianess.h" in der libendian rausgezogen und diese in s-c inkludiert.

tags: added: all-rev
Revision history for this message
Tobias Netzel (tobias-netzel) wrote :

zum Kompilieren musste ich noch die libendian.h in der endianess.h inkludieren.

Revision history for this message
FloSoft (flosoft) wrote :

oh da wollte ich natürlich eigentlich die zeile kopieren :/ (blöder vim ^^)

Revision history for this message
FloSoft (flosoft) wrote :

okay also deine Änderung bei ArchivItem_Sound_Midi.cpp erzeugt den fehler nun unter windows :/

tauscht er unter big-endian da evtl einfach nicht korrekt?

habe die stelle wieder rückgängig gemacht

Revision history for this message
Tobias Netzel (tobias-netzel) wrote :

Mit meiner Änderung ergibt es z.B. eine gesunde MIDI-Track-Länge von 39121 Bytes im Gegensatz zu ungesunden 3516399616 Bytes ohne diese Änderung.

Dann ist der Fehler wohl schon vorher passiert und wurde durch meine Änderung nachträglich korrigiert.

Revision history for this message
Tobias Netzel (tobias-netzel) wrote :

Die SOUND.LST wurde wohl nicht korrekt geschrieben.

Revision history for this message
Tobias Netzel (tobias-netzel) wrote :

So, das hier sollte funktionieren.

Revision history for this message
FloSoft (flosoft) wrote :

okay das baut und funktioniert nun soweit ichs gesehen hab nun auch bei little-endian maschinen.

Revision history for this message
Tobias Netzel (tobias-netzel) wrote :

Super, wäre toll, wenn in den nightlies jetzt auch die ppc Architektur gebaut würde. SDL und UPnP enthalten ja auch ppc.

Revision history for this message
FloSoft (flosoft) wrote :

hmm irgendeine library hatte ich glaube ich ohne ppc support, weshalb ich den part rausgelassen habe. ich teste...

Revision history for this message
FloSoft (flosoft) wrote :

ah okay geht doch :) gut nächster build ist mit ppc

Revision history for this message
FloSoft (flosoft) wrote :

bitte prüf mal obs nach wie vor funktioniert,

siehe Bug #930890

Revision history for this message
Tobias Netzel (tobias-netzel) wrote :

Habe die LSTS gelöscht und nach anschließender Konvertierung der Sounds funktioniert es immer noch.

To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.