Skip to content

Commit

Permalink
Fix segmentation fault and use move semantics
Browse files Browse the repository at this point in the history
Make sure the vector size is properly resized before
read operation and remove null termination.

Avoid copy assignment by using move semantics.
  • Loading branch information
tstibor committed Feb 28, 2025
1 parent 5f0cf0b commit 04fdc89
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 13 deletions.
16 changes: 8 additions & 8 deletions src/importexport/midi/internal/midiexport/exportmidi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ void ExportMidi::writeHeader(const CompatMidiRendererInternal::Context& context)
MidiEvent ev;
ev.setType(ME_META);
ev.setMetaType(META_TRACK_NAME);
ev.setEData(data);
ev.setEData(std::move(data));
ev.setLen(static_cast<int>(len));

track1.insert(0, ev);
Expand Down Expand Up @@ -121,7 +121,7 @@ void ExportMidi::writeHeader(const CompatMidiRendererInternal::Context& context)
MidiEvent ev;
ev.setType(ME_META);
ev.setMetaType(META_TIME_SIGNATURE);
ev.setEData(data);
ev.setEData(std::move(data));
ev.setLen(4);
track.insert(CompatMidiRender::tick(context, is->first + tickOffset), ev);
}
Expand Down Expand Up @@ -153,7 +153,7 @@ void ExportMidi::writeHeader(const CompatMidiRendererInternal::Context& context)
ev.setMetaType(META_KEY_SIGNATURE);
ev.setLen(2);
std::vector<unsigned char> data { static_cast<unsigned char>(key), 0 /* major */ };
ev.setEData(data);
ev.setEData(std::move(data));
int tick = ik->first + tickOffset;
track1.insert(CompatMidiRender::tick(context, tick), ev);
if (tick == 0) {
Expand All @@ -169,7 +169,7 @@ void ExportMidi::writeHeader(const CompatMidiRendererInternal::Context& context)
ev.setMetaType(META_KEY_SIGNATURE);
ev.setLen(2);
std::vector<unsigned char> data { 0 /* key */, 0 /* major */ };
ev.setEData(data);
ev.setEData(std::move(data));
track1.insert(0, ev);
}

Expand Down Expand Up @@ -200,7 +200,7 @@ void ExportMidi::writeHeader(const CompatMidiRendererInternal::Context& context)
std::vector<unsigned char> data { static_cast<unsigned char>(tempo >> 16),
static_cast<unsigned char>(tempo >> 8),
static_cast<unsigned char>(tempo) };
ev.setEData(data);
ev.setEData(std::move(data));
track.insert(it->first, ev);
}
}
Expand Down Expand Up @@ -295,7 +295,7 @@ bool ExportMidi::write(QIODevice* device, bool midiExpandRepeats, bool exportRPN
ev.setMetaType(META_PORT_CHANGE);
ev.setLen(1);
std::vector<unsigned char> data { static_cast<unsigned char>(track.outPort()) };
ev.setEData(data);
ev.setEData(std::move(data));
track.insert(0, ev);
}

Expand Down Expand Up @@ -384,7 +384,7 @@ bool ExportMidi::write(QIODevice* device, bool midiExpandRepeats, bool exportRPN
MidiEvent ev;
ev.setType(ME_META);
ev.setMetaType(META_LYRIC);
ev.setEData(data);
ev.setEData(std::move(data));
ev.setLen(static_cast<int>(len));

int tick = cr->tick().ticks() + tickOffset;
Expand All @@ -409,7 +409,7 @@ bool ExportMidi::write(QIODevice* device, bool midiExpandRepeats, bool exportRPN
MidiEvent ev;
ev.setType(ME_META);
ev.setMetaType(META_MARKER);
ev.setEData(data);
ev.setEData(std::move(data));
ev.setLen(static_cast<int>(len));

int tick = r->segment()->tick().ticks() + tickOffset;
Expand Down
2 changes: 1 addition & 1 deletion src/importexport/midi/internal/midishared/midievent.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ class MidiEvent : public engraving::MidiCoreEvent
: MidiCoreEvent(t, c, a, b), _edata(0), _len(0) {}

const uchar* edata() const { return _edata.data(); }
void setEData(std::vector<uchar>& d) { _edata = d; }
void setEData(std::vector<uchar>&& d) { _edata = d; }
int len() const { return _len; }
void setLen(int l) { _len = l; }
int metaType() const { return _metaType; }
Expand Down
8 changes: 4 additions & 4 deletions src/importexport/midi/internal/midishared/midifile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -563,16 +563,16 @@ bool MidiFile::readEvent(MidiEvent* event)
return false;
}
dataLen = len;
data.resize(len + 1);
read(data.data(), len);
data[dataLen] = 0; // always terminate with zero
if (data[len - 1] != 0xf7) {
LOGD("SYSEX does not end with 0xf7!");
// more to come?
} else {
dataLen--; // don't count 0xf7
}
event->setType(ME_SYSEX);
event->setEData(data);
event->setEData(std::move(data));
event->setLen(dataLen);
return true;
}
Expand All @@ -587,14 +587,14 @@ bool MidiFile::readEvent(MidiEvent* event)
return false;
}
if (dataLen) {
data.resize(dataLen + 1);
read(data.data(), dataLen);
}
data[dataLen] = 0; // always terminate with zero so we get valid C++ strings

event->setType(ME_META);
event->setMetaType(type);
event->setLen(dataLen);
event->setEData(data);
event->setEData(std::move(data));
return true;
}

Expand Down

0 comments on commit 04fdc89

Please sign in to comment.