From 11be1bb1e712a7f5281589e40d1844946e208055 Mon Sep 17 00:00:00 2001 From: Robin Getz Date: Sat, 1 Aug 2026 16:44:34 -0400 Subject: [PATCH] deviceapi: Avoid invalid iterator erase in removeBuddy In std::vector::erase, The iterator pos must be valid and dereferenceable. Thus the end() iterator (which is valid, but is not dereferenceable) cannot be used as a value for pos. Protect against that by checking the result of std::find() before erasing a buddy entry. The buddy should always be present when removeBuddy() is called, but avoid undefined behavior if that assumption is violated. Signed-off-by: Robin Getz --- sdrbase/device/deviceapi.cpp | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/sdrbase/device/deviceapi.cpp b/sdrbase/device/deviceapi.cpp index 9e08b0723..d969272ba 100644 --- a/sdrbase/device/deviceapi.cpp +++ b/sdrbase/device/deviceapi.cpp @@ -774,13 +774,25 @@ void DeviceAPI::removeBuddy(DeviceAPI* buddy) { switch(buddy->m_streamType) { case StreamSingleRx: - m_sourceBuddies.erase(std::find(m_sourceBuddies.begin(), m_sourceBuddies.end(), buddy)); + { + auto it = std::find(m_sourceBuddies.begin(), m_sourceBuddies.end(), buddy); + if (it != m_sourceBuddies.end()) + { + m_sourceBuddies.erase(it); + } break; + } case StreamSingleTx: - m_sinkBuddies.erase(std::find(m_sinkBuddies.begin(), m_sinkBuddies.end(), buddy)); + { + auto it = std::find(m_sinkBuddies.begin(), m_sinkBuddies.end(), buddy); + if (it != m_sinkBuddies.end()) + { + m_sinkBuddies.erase(it); + } break; + } default: - qDebug("DeviceAPI::removeSourceBuddy: buddy %s(%s) is not of single Rx or Tx type", + qDebug("DeviceAPI::removeBuddy: buddy %s(%s) is not of single Rx or Tx type", qPrintable(buddy->getHardwareId()), qPrintable(buddy->getSamplingDeviceSerial())); return;