aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cvt_xmi2mid.hpp10
-rw-r--r--src/midi_sequencer_impl.hpp28
2 files changed, 31 insertions, 7 deletions
diff --git a/src/cvt_xmi2mid.hpp b/src/cvt_xmi2mid.hpp
index 4dcba70..4bc4775 100644
--- a/src/cvt_xmi2mid.hpp
+++ b/src/cvt_xmi2mid.hpp
@@ -90,7 +90,7 @@ typedef struct {
} midi_descriptor;
struct xmi2mid_xmi_ctx {
- uint8_t *src, *src_ptr;
+ uint8_t *src, *src_ptr, *src_end;
uint32_t srcsize;
uint32_t datastart;
uint8_t *dst, *dst_ptr;
@@ -129,6 +129,7 @@ static uint32_t xmi2mid_ExtractTracksFromXmi(struct xmi2mid_xmi_ctx *ctx);
static uint32_t xmi2mid_read1(struct xmi2mid_xmi_ctx *ctx)
{
uint8_t b0;
+ assert(ctx->src_ptr + 1 < ctx->src_end);
b0 = *ctx->src_ptr++;
return (b0);
}
@@ -136,6 +137,7 @@ static uint32_t xmi2mid_read1(struct xmi2mid_xmi_ctx *ctx)
static uint32_t xmi2mid_read2(struct xmi2mid_xmi_ctx *ctx)
{
uint8_t b0, b1;
+ assert(ctx->src_ptr + 2 < ctx->src_end);
b0 = *ctx->src_ptr++;
b1 = *ctx->src_ptr++;
return (b0 + ((uint32_t)b1 << 8));
@@ -144,6 +146,7 @@ static uint32_t xmi2mid_read2(struct xmi2mid_xmi_ctx *ctx)
static uint32_t xmi2mid_read4(struct xmi2mid_xmi_ctx *ctx)
{
uint8_t b0, b1, b2, b3;
+ assert(ctx->src_ptr + 4 < ctx->src_end);
b3 = *ctx->src_ptr++;
b2 = *ctx->src_ptr++;
b1 = *ctx->src_ptr++;
@@ -154,6 +157,7 @@ static uint32_t xmi2mid_read4(struct xmi2mid_xmi_ctx *ctx)
static uint32_t xmi2mid_read4le(struct xmi2mid_xmi_ctx *ctx)
{
uint8_t b0, b1, b2, b3;
+ assert(ctx->src_ptr + 4 < ctx->src_end);
b3 = *ctx->src_ptr++;
b2 = *ctx->src_ptr++;
b1 = *ctx->src_ptr++;
@@ -163,6 +167,7 @@ static uint32_t xmi2mid_read4le(struct xmi2mid_xmi_ctx *ctx)
static void xmi2mid_copy(struct xmi2mid_xmi_ctx *ctx, char *b, uint32_t len)
{
+ assert(ctx->src_ptr + len < ctx->src_end);
memcpy(b, ctx->src_ptr, len);
ctx->src_ptr += len;
}
@@ -525,6 +530,7 @@ static int Convert_xmi2midi(uint8_t *in, uint32_t insize,
memset(&ctx, 0, sizeof(struct xmi2mid_xmi_ctx));
ctx.src = ctx.src_ptr = in;
ctx.srcsize = insize;
+ ctx.src_end = ctx.src + insize;
ctx.convert_type = convert_type;
if (xmi2mid_ParseXMI(&ctx) < 0) {
@@ -632,6 +638,8 @@ static int xmi2mid_GetVLQ(struct xmi2mid_xmi_ctx *ctx, uint32_t *quant) {
*quant = 0;
for (i = 0; i < 4; i++) {
+ if(ctx->src_ptr + 1 >= ctx->src + ctx->srcsize)
+ break;
data = xmi2mid_read1(ctx);
*quant <<= 7;
*quant |= data & 0x7F;
diff --git a/src/midi_sequencer_impl.hpp b/src/midi_sequencer_impl.hpp
index ee2a77d..9136cb6 100644
--- a/src/midi_sequencer_impl.hpp
+++ b/src/midi_sequencer_impl.hpp
@@ -1825,7 +1825,7 @@ void BW_MidiSequencer::handleEvent(size_t track, const BW_MidiSequencer::MidiEve
// Special event FF
uint_fast16_t evtype = evt.subtype;
uint64_t length = static_cast<uint64_t>(evt.data.size());
- const char *data(length ? reinterpret_cast<const char *>(evt.data.data()) : "");
+ const char *data(length ? reinterpret_cast<const char *>(evt.data.data()) : "\0\0\0\0\0\0\0\0");
if(m_interface->rt_metaEvent) // Meta event hook
m_interface->rt_metaEvent(m_interface->rtUserData, evtype, reinterpret_cast<const uint8_t*>(data), size_t(length));
@@ -1879,9 +1879,22 @@ void BW_MidiSequencer::handleEvent(size_t track, const BW_MidiSequencer::MidiEve
m_loop.skipStackStart = false;
return;
}
- LoopStackEntry &s = m_loop.stack[static_cast<size_t>(m_loop.stackLevel + 1)];
- s.loops = static_cast<int>(data[0]);
- s.infinity = (data[0] == 0);
+
+ char x = data[0];
+ size_t s_addr = static_cast<size_t>(m_loop.stackLevel + 1);
+ while(s_addr >= m_loop.stack.size())
+ {
+ LoopStackEntry e;
+ e.loops = x;
+ e.infinity = (x == 0);
+ e.start = 0;
+ e.end = 0;
+ m_loop.stack.push_back(e);
+ }
+
+ LoopStackEntry &s = m_loop.stack[s_addr];
+ s.loops = static_cast<int>(x);
+ s.infinity = (x == 0);
m_loop.caughtStackStart = true;
return;
}
@@ -2899,12 +2912,15 @@ bool BW_MidiSequencer::parseXMI(FileAndMemReader &fr)
size_t mus_len = fr.fileSize();
fr.seek(0, FileAndMemReader::SET);
- uint8_t *mus = (uint8_t*)malloc(mus_len);
+ uint8_t *mus = (uint8_t*)std::malloc(mus_len + 20);
if(!mus)
{
m_errorString = "Out of memory!";
return false;
}
+
+ std::memset(mus, 0, mus_len + 20);
+
fsize = fr.read(mus, 1, mus_len);
if(fsize < mus_len)
{
@@ -2917,7 +2933,7 @@ bool BW_MidiSequencer::parseXMI(FileAndMemReader &fr)
uint8_t *mid = NULL;
uint32_t mid_len = 0;
- int m2mret = Convert_xmi2midi(mus, static_cast<uint32_t>(mus_len),
+ int m2mret = Convert_xmi2midi(mus, static_cast<uint32_t>(mus_len + 20),
&mid, &mid_len, XMIDI_CONVERT_NOCONVERSION);
if(mus)
free(mus);