From 48f13821db90a9b6afdcc5c97149d3fd83a51ba4 Mon Sep 17 00:00:00 2001
From: Felix Weiglhofer <weiglhofer@fias.uni-frankfurt.de>
Date: Mon, 25 Oct 2021 08:03:01 +0000
Subject: [PATCH] StsDigi: Add more error handling against timestamp overflows.

---
 core/data/sts/CbmStsAddress.cxx | 4 ++++
 core/data/sts/CbmStsDigi.cxx    | 2 +-
 core/data/sts/CbmStsDigi.h      | 3 ++-
 3 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/core/data/sts/CbmStsAddress.cxx b/core/data/sts/CbmStsAddress.cxx
index d6d8331b8e..8670d4b82f 100644
--- a/core/data/sts/CbmStsAddress.cxx
+++ b/core/data/sts/CbmStsAddress.cxx
@@ -203,6 +203,10 @@ int32_t CbmStsAddress::PackDigiAddress(int32_t address)
                          | kMask[1][kStsModule] << kShift[1][kStsModule];
 
   int32_t ret = (address & kDMask) >> kShift[1][kStsUnit];
+
+  // Check that no bits were set, that are stripped by this function.
+  assert(address == UnpackDigiAddress(ret));
+
   return ret;
 }
 // -------------------------------------------------------------------------
diff --git a/core/data/sts/CbmStsDigi.cxx b/core/data/sts/CbmStsDigi.cxx
index 733544a0e8..15618dc4c0 100644
--- a/core/data/sts/CbmStsDigi.cxx
+++ b/core/data/sts/CbmStsDigi.cxx
@@ -37,7 +37,7 @@ void CbmStsDigi::PackAddressAndTime(int32_t newAddress, uint32_t newTime)
   uint32_t lowerAddr      = packedAddr & ((1 << kNumLowerAddrBits) - 1);
 
   fAddress = lowerAddr;
-  fTime    = (highestBitAddr << kNumTimestampBits) | newTime;
+  fTime    = (highestBitAddr << kNumTimestampBits) | (kTimestampMask & newTime);
 }
 
 int32_t CbmStsDigi::UnpackAddress() const
diff --git a/core/data/sts/CbmStsDigi.h b/core/data/sts/CbmStsDigi.h
index 94594b483e..7867329e5a 100644
--- a/core/data/sts/CbmStsDigi.h
+++ b/core/data/sts/CbmStsDigi.h
@@ -47,8 +47,9 @@ public:
    ** @param  time     Measurement time [ns]
    ** @param  charge   Charge [ADC units]
    **/
-  CbmStsDigi(int32_t address, int32_t channel, uint32_t time, uint16_t charge)
+  CbmStsDigi(int32_t address, int32_t channel, double time, uint16_t charge)
   {
+    assert(time >= 0 && time <= kMaxTimestamp);
     PackAddressAndTime(address, time);
     PackChannelAndCharge(channel, charge);
   }
-- 
GitLab