Skip to content

Commit f5240ae

Browse files
committed
CAudioGroupSet: Fix over-swapping past projects end
1 parent c87f8ad commit f5240ae

File tree

1 file changed

+20
-11
lines changed

1 file changed

+20
-11
lines changed

Runtime/Audio/CAudioGroupSet.cpp

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,26 +16,37 @@ static inline u32 SwapU32(u32 v) { return __builtin_bswap32(v); }
1616
static inline s16 SwapS16(s16 v) { return static_cast<s16>(__builtin_bswap16(static_cast<u16>(v))); }
1717

1818
void CAudioGroupSet::SwapProjectEndian() {
19-
// Project data is a linked list of GROUP_DATA structures
20-
// Each GROUP_DATA contains offsets to sub-tables within the project
2119
u8* base = m_proj;
2220
u32 offset = 0;
2321

24-
while (offset < m_projLen) {
22+
while (offset + sizeof(u32) <= m_projLen) {
2523
GROUP_DATA* g = reinterpret_cast<GROUP_DATA*>(base + offset);
2624

27-
// Swap GROUP_DATA fields
2825
g->nextOff = SwapU32(g->nextOff);
26+
if (g->nextOff == 0xFFFFFFFF) {
27+
break;
28+
}
29+
30+
// Swap GROUP_DATA fields
2931
g->id = SwapU16(g->id);
3032
g->type = SwapU16(g->type);
3133
g->macroOff = SwapU32(g->macroOff);
3234
g->sampleOff = SwapU32(g->sampleOff);
3335
g->curveOff = SwapU32(g->curveOff);
3436
g->keymapOff = SwapU32(g->keymapOff);
3537
g->layerOff = SwapU32(g->layerOff);
36-
g->data.song.normpageOff = SwapU32(g->data.song.normpageOff);
37-
g->data.song.drumpageOff = SwapU32(g->data.song.drumpageOff);
38-
g->data.song.midiSetupOff = SwapU32(g->data.song.midiSetupOff);
38+
switch (g->type) {
39+
case 0:
40+
g->data.song.normpageOff = SwapU32(g->data.song.normpageOff);
41+
g->data.song.drumpageOff = SwapU32(g->data.song.drumpageOff);
42+
g->data.song.midiSetupOff = SwapU32(g->data.song.midiSetupOff);
43+
break;
44+
case 1:
45+
g->data.fx.tableOff = SwapU32(g->data.fx.tableOff);
46+
break;
47+
default:
48+
break;
49+
}
3950

4051
// Swap the ID reference lists (u16 lists terminated by 0xFFFF)
4152
// macroOff points to a list of u16 macro IDs
@@ -85,8 +96,8 @@ void CAudioGroupSet::SwapProjectEndian() {
8596
}
8697

8798
// Swap FX table if type == 1 (FX group)
88-
if (g->type == 1 && g->data.song.normpageOff < m_projLen) {
89-
FX_DATA* fxData = reinterpret_cast<FX_DATA*>(base + g->data.song.normpageOff);
99+
if (g->type == 1 && g->data.fx.tableOff < m_projLen) {
100+
FX_DATA* fxData = reinterpret_cast<FX_DATA*>(base + g->data.fx.tableOff);
90101
fxData->num = SwapU16(fxData->num);
91102
fxData->reserverd = SwapU16(fxData->reserverd);
92103
u16 numFx = fxData->num;
@@ -98,8 +109,6 @@ void CAudioGroupSet::SwapProjectEndian() {
98109
}
99110
}
100111

101-
if (g->nextOff == 0xFFFFFFFF)
102-
break;
103112
offset = g->nextOff;
104113
}
105114
}

0 commit comments

Comments
 (0)