diff --git a/lib/hooks/reorder_ts.cpp b/lib/hooks/reorder_ts.cpp index 38c43c79f..47203980b 100644 --- a/lib/hooks/reorder_ts.cpp +++ b/lib/hooks/reorder_ts.cpp @@ -5,6 +5,7 @@ * SPDX-License-Identifier: Apache-2.0 */ +#include "villas/exceptions.hpp" #include #include #include @@ -32,6 +33,9 @@ protected: sample_copy(rhs, buffer); } else { buffer = sample_clone(lhs); + if (!buffer) + throw RuntimeError{"Out of memory."}; + sample_copy(lhs, rhs); sample_copy(rhs, buffer); } @@ -80,7 +84,11 @@ public: assert(smp); if (window.empty()) { - window.push_back(sample_clone(smp)); + auto new_smp = sample_clone(smp); + if (!new_smp) + throw RuntimeError{"Out of memory."}; + + window.push_back(new_smp); logger->debug("window.size={}/{}", window.size(), window_size); @@ -104,7 +112,12 @@ public: window.push_back(nullptr); std::copy_backward(std::next(std::begin(window), i + 1), --std::end(window), std::end(window)); - window[i + 1] = sample_clone(smp); + + auto new_smp = sample_clone(smp); + if (!new_smp) + throw RuntimeError{"Out of memory."}; + + window[i + 1] = new_smp; logger->debug("window.size={}/{}", window.size(), window_size); diff --git a/tests/integration/hook-reorder_ts.sh b/tests/integration/hook-reorder_ts.sh new file mode 100755 index 000000000..a62a5da30 --- /dev/null +++ b/tests/integration/hook-reorder_ts.sh @@ -0,0 +1,49 @@ +#!/bin/bash +# +# Integration test for reorder_ts hook. +# +# Author: Philipp Jungkamp +# SPDX-FileCopyrightText: 2023 OPAL-RT Germany GmbH +# SPDX-License-Identifier: Apache-2.0 + +set -e + +DIR=$(mktemp -d) +pushd ${DIR} + +function finish { + popd + rm -rf ${DIR} +} +trap finish EXIT + +cat > input.dat < expect.dat < reorder.dat +villas hook drop < reorder.dat > output.dat + +villas compare output.dat expect.dat