- sb16 patch that fixes
[ #425640 ] sb16 assumes fpos_t is long int needs to be tested still
This commit is contained in:
parent
d282407d8c
commit
228180c40b
63
bochs/patches/patch.sb16-ftell
Normal file
63
bochs/patches/patch.sb16-ftell
Normal file
@ -0,0 +1,63 @@
|
||||
----------------------------------------------------------------------
|
||||
Patch name: patch.sb16-ftell
|
||||
Author: Bryce Denney
|
||||
Date: Tue Jun 5 20:13:23 EDT 2001
|
||||
|
||||
Detailed description:
|
||||
[ #425640 ] sb16 assumes fpos_t is long int
|
||||
Use ftell since it returns an int, rather than fgetpos which returns
|
||||
a fpos_t. Without the patch, Bochs gets an fpos_t and assumes it
|
||||
is an integer type, but on some systems (like linux with newer
|
||||
glibc libraries) this assumption is not valid.
|
||||
|
||||
Malte Cornils <malte@cornils.net> first reported this bug, and he
|
||||
warned me that ftell is not portable to some platforms, and that's
|
||||
why I haven't checked in the change.
|
||||
|
||||
Apply patch to:
|
||||
current CVS
|
||||
Instructions:
|
||||
To patch, go to main bochs directory.
|
||||
Type "patch -p0 < THIS_PATCH_FILE".
|
||||
----------------------------------------------------------------------
|
||||
RCS file: /cvsroot/bochs/bochs/iodev/sb16.cc,v
|
||||
retrieving revision 1.7
|
||||
diff -u -r1.7 sb16.cc
|
||||
--- iodev/sb16.cc 2001/05/30 18:56:01 1.7
|
||||
+++ iodev/sb16.cc 2001/06/06 00:12:58
|
||||
@@ -2781,7 +2781,6 @@
|
||||
|
||||
void bx_sb16_c::finishmidifile()
|
||||
{
|
||||
- fpos_t tracklen;
|
||||
struct {
|
||||
Bit8u delta, statusbyte, metaevent, length;
|
||||
} metatrackend = { 0, 0xff, 0x2f, 0 };
|
||||
@@ -2789,19 +2788,20 @@
|
||||
// Meta event track end (0xff 0x2f 0x00) plus leading delta time
|
||||
fwrite(&metatrackend, 1, sizeof metatrackend, MIDIDATA );
|
||||
|
||||
- fgetpos(MIDIDATA, &tracklen);
|
||||
+ Bit32u tracklen = ftell(MIDIDATA);
|
||||
+ if (tracklen < 0)
|
||||
+ BX_PANIC (("ftell failed in finishmidifile"));
|
||||
+ if (tracklen < 22)
|
||||
+ BX_PANIC (("finishmidifile with track length too short"));
|
||||
tracklen -= 22; // subtract the midi file and track header
|
||||
-
|
||||
fseek(MIDIDATA, 22 - 4, SEEK_SET);
|
||||
-
|
||||
- // value has to be in big endian
|
||||
+ // value has to be in big endian
|
||||
#ifdef BX_LITTLE_ENDIAN
|
||||
tracklen = (tracklen << 24) | (tracklen >> 24) |
|
||||
- ((tracklen & 0x00ff0000) >> 8) |
|
||||
- ((tracklen & 0x0000ff00) << 8);
|
||||
+ ((tracklen & 0x00ff0000) >> 8) |
|
||||
+ ((tracklen & 0x0000ff00) << 8);
|
||||
#endif
|
||||
fwrite(&tracklen, 4, 1, MIDIDATA);
|
||||
-
|
||||
return;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user