Skip to content

Commit 49e87d8

Browse files
committed
PlanManager: prevent memory leak when writing mission items to vehicle
1 parent b7c6d6d commit 49e87d8

File tree

1 file changed

+12
-7
lines changed

1 file changed

+12
-7
lines changed

src/MissionManager/PlanManager.cc

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,11 @@ void PlanManager::writeMissionItems(const QList<MissionItem*>& missionItems)
7777

7878
bool skipFirstItem = _planType == MAV_MISSION_TYPE_MISSION && !_vehicle->firmwarePlugin()->sendHomePositionToVehicle();
7979

80+
if (skipFirstItem) {
81+
// First item is not going to be moved to _writeMissionItems, free it now.
82+
delete missionItems[0];
83+
}
84+
8085
int firstIndex = skipFirstItem ? 1 : 0;
8186

8287
for (int i=firstIndex; i<missionItems.count(); i++) {
@@ -290,7 +295,7 @@ bool PlanManager::_checkForExpectedAck(AckType_t receivedAck)
290295
void PlanManager::_readTransactionComplete(void)
291296
{
292297
qCDebug(PlanManagerLog) << "_readTransactionComplete read sequence complete";
293-
298+
294299
SharedLinkInterfacePtr sharedLink = _vehicle->vehicleLinkManager()->primaryLink().lock();
295300
if (sharedLink) {
296301
mavlink_message_t message;
@@ -436,7 +441,7 @@ void PlanManager::_handleMissionItem(const mavlink_message_t& message)
436441
_vehicle->_setHomePosition(newHomePosition);
437442
return;
438443
}
439-
444+
440445
if (_itemIndicesToRead.contains(seq)) {
441446
_itemIndicesToRead.removeOne(seq);
442447

@@ -468,7 +473,7 @@ void PlanManager::_handleMissionItem(const mavlink_message_t& message)
468473
}
469474

470475
emit progressPctChanged((double)seq / (double)_missionItemCountToRead);
471-
476+
472477
_retryCount = 0;
473478
if (_itemIndicesToRead.count() == 0) {
474479
_readTransactionComplete();
@@ -499,7 +504,7 @@ void PlanManager::_handleMissionRequest(const mavlink_message_t& message)
499504
qCDebug(PlanManagerLog) << QStringLiteral("_handleMissionRequest %1 Incorrect mission_type received expected:actual").arg(_planTypeString()) << _planType << missionRequestMissionType;
500505
return;
501506
}
502-
507+
503508
if (!_checkForExpectedAck(AckMissionRequest)) {
504509
return;
505510
}
@@ -520,7 +525,7 @@ void PlanManager::_handleMissionRequest(const mavlink_message_t& message)
520525
} else {
521526
_itemIndicesToWrite.removeOne(missionRequestSeq);
522527
}
523-
528+
524529
MissionItem* item = _writeMissionItems[missionRequestSeq];
525530
qCDebug(PlanManagerLog) << QStringLiteral("_handleMissionRequest %1 sequenceNumber:command").arg(_planTypeString()) << missionRequestSeq << item->command();
526531

@@ -555,7 +560,7 @@ void PlanManager::_handleMissionRequest(const mavlink_message_t& message)
555560
void PlanManager::_handleMissionAck(const mavlink_message_t& message)
556561
{
557562
mavlink_mission_ack_t missionAck;
558-
563+
559564
mavlink_msg_mission_ack_decode(&message, &missionAck);
560565
if (missionAck.mission_type != _planType) {
561566
// if there was a previous transaction with a different mission_type, it can happen that we receive
@@ -575,7 +580,7 @@ void PlanManager::_handleMissionAck(const mavlink_message_t& message)
575580
// Save the retry ack before calling _checkForExpectedAck since we'll need it to determine what
576581
// type of a protocol sequence we are in.
577582
AckType_t savedExpectedAck = _expectedAck;
578-
583+
579584
// We can get a MISSION_ACK with an error at any time, so if the Acks don't match it is not
580585
// a protocol sequence error. Call _checkForExpectedAck with _retryAck so it will succeed no
581586
// matter what.

0 commit comments

Comments
 (0)