From ad0346b7bf388b4ac5a348e27b606df6b416d084 Mon Sep 17 00:00:00 2001
From: Felix Weiglhofer <weiglhofer@fias.uni-frankfurt.de>
Date: Thu, 29 Jun 2023 14:27:37 +0000
Subject: [PATCH] UnpackSts: Add protection against invalid timestamps.

---
 algo/detectors/sts/UnpackSts.cxx | 10 +++++++++-
 core/data/sts/CbmStsDigi.h       | 19 +++++++++----------
 2 files changed, 18 insertions(+), 11 deletions(-)

diff --git a/algo/detectors/sts/UnpackSts.cxx b/algo/detectors/sts/UnpackSts.cxx
index ad1a586ac1..06a154a98c 100644
--- a/algo/detectors/sts/UnpackSts.cxx
+++ b/algo/detectors/sts/UnpackSts.cxx
@@ -123,11 +123,19 @@ namespace cbm::algo
     messageTime -= elinkPar.fTimeOffset;
 
     // --- Apply walk correction if applicable
-    if (message.GetHitAdc() <= elinkPar.fWalk.size()) { messageTime += elinkPar.fWalk[message.GetHitAdc() - 1]; }
+    if (message.GetHitAdc() <= elinkPar.fWalk.size()) {
+      double walk = elinkPar.fWalk[message.GetHitAdc() - 1];
+      messageTime += walk;
+    }
 
     // --- Charge
     double charge = elinkPar.fAdcOffset + (message.GetHitAdc() - 1) * elinkPar.fAdcGain;
 
+    if (messageTime > CbmStsDigi::kMaxTimestamp) {
+      monitor.fNumErrTimestampOverflow++;
+      return;
+    }
+
     // --- Create output digi
     digiVec.emplace_back(elinkPar.fAddress, channel, messageTime, charge);
   }
diff --git a/core/data/sts/CbmStsDigi.h b/core/data/sts/CbmStsDigi.h
index 2363ba0023..ab50018657 100644
--- a/core/data/sts/CbmStsDigi.h
+++ b/core/data/sts/CbmStsDigi.h
@@ -39,11 +39,19 @@
  **/
 class CbmStsDigi {
 
+public:  // constants
+  static constexpr int kNumAdcBits              = 5;
+  static constexpr uint32_t kAdcMask            = (1u << kNumAdcBits) - 1u;
+  static constexpr int kNumLowerAddrBits        = 16;
+  static constexpr int kNumTimestampBits        = 31;
+  static constexpr uint32_t kTimestampMask      = (1u << kNumTimestampBits) - 1u;
+  static constexpr uint32_t kMaxTimestamp       = kTimestampMask;
+  static constexpr uint32_t kTimeAddressBitMask = ~kTimestampMask;
+
 public:
   /** Default constructor **/
   CbmStsDigi() = default;
 
-
   /** Standard constructor
    ** @param  address  Unique element address
    ** @param  channel  Channel number
@@ -159,15 +167,6 @@ public:
 private:
   friend class boost::serialization::access;
 
-
-  static constexpr int kNumAdcBits              = 5;
-  static constexpr uint32_t kAdcMask            = (1u << kNumAdcBits) - 1u;
-  static constexpr int kNumLowerAddrBits        = 16;
-  static constexpr int kNumTimestampBits        = 31;
-  static constexpr uint32_t kTimestampMask      = (1u << kNumTimestampBits) - 1u;
-  static constexpr uint32_t kMaxTimestamp       = kTimestampMask;
-  static constexpr uint32_t kTimeAddressBitMask = ~kTimestampMask;
-
 // CUDA requires types in shared memory to have trivial constructors / destructors
 #if XPU_IS_HIP_CUDA
 #define CPU_ONLY(x)
-- 
GitLab