From d6dcc9878eb74fbd0412b85c75a0156dba416c06 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Blin?=
 <sebastien.blin@savoirfairelinux.com>
Date: Thu, 7 Dec 2023 13:51:07 -0500
Subject: [PATCH] misc: avoid crash if no certificate added for device

Using foundAccountDevice with a dht::PkId, can add known devices
without certificates. Iterating over knownDevices_ without checking
any certificate will lead to a segfault.
This will not happen under normal circumstances, because foundAccountDevice
only uses certificates, except for testing purpose

Change-Id: I9bf6682d7d6539c0f905e80995333db0d948c5af
---
 src/jamidht/archive_account_manager.cpp | 4 ++++
 src/jamidht/contact_list.cpp            | 4 ++++
 2 files changed, 8 insertions(+)

diff --git a/src/jamidht/archive_account_manager.cpp b/src/jamidht/archive_account_manager.cpp
index 7cf0edb0f4..0fc8c299af 100644
--- a/src/jamidht/archive_account_manager.cpp
+++ b/src/jamidht/archive_account_manager.cpp
@@ -527,6 +527,10 @@ ArchiveAccountManager::syncDevices()
         // don't send sync data to ourself
         if (dev.first.toString() == info_->deviceId)
             continue;
+        if (!dev.second.certificate) {
+            JAMI_WARNING("Cannot find certificate for {}", dev.first);
+            continue;
+        }
         auto pk = dev.second.certificate->getSharedPublicKey();
         JAMI_DBG("sending device sync to %s %s",
                  dev.second.name.c_str(),
diff --git a/src/jamidht/contact_list.cpp b/src/jamidht/contact_list.cpp
index 187bc32637..5f299cb555 100644
--- a/src/jamidht/contact_list.cpp
+++ b/src/jamidht/contact_list.cpp
@@ -595,6 +595,10 @@ ContactList::getSyncData() const
     }
 
     for (const auto& dev : knownDevices_) {
+        if (!dev.second.certificate) {
+            JAMI_WARNING("No certificate found for {}", dev.first);
+            continue;
+        }
         sync_data.devices.emplace(dev.second.certificate->getLongId(),
                                   KnownDeviceSync {dev.second.name,
                                                    dev.second.certificate->getId()});
-- 
GitLab