You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@datasketches.apache.org by jm...@apache.org on 2023/04/21 18:22:54 UTC
[datasketches-cpp] 01/02: add better memory checks, fix a few typos
This is an automated email from the ASF dual-hosted git repository.
jmalkin pushed a commit to branch minor_cleanup
in repository https://gitbox.apache.org/repos/asf/datasketches-cpp.git
commit 1deefe98dff7fb991d87ddbf4f67dfa96070f605
Author: Jon Malkin <78...@users.noreply.github.com>
AuthorDate: Fri Apr 21 11:19:11 2023 -0700
add better memory checks, fix a few typos
---
count/include/count_min_impl.hpp | 6 +++++-
density/include/density_sketch_impl.hpp | 5 ++---
2 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/count/include/count_min_impl.hpp b/count/include/count_min_impl.hpp
index b7ff1cb..ec77be6 100644
--- a/count/include/count_min_impl.hpp
+++ b/count/include/count_min_impl.hpp
@@ -359,7 +359,7 @@ auto count_min_sketch<W,A>::deserialize(std::istream& is, uint64_t seed, const A
template<typename W, typename A>
size_t count_min_sketch<W,A>::get_serialized_size_bytes() const {
- // The header is always 2 bytes, whether empty or full
+ // The header is always 2 longs, whether empty or full
size_t preamble_longs = PREAMBLE_LONGS_SHORT;
// If the sketch is empty, we're done. Otherwise, we need the total weight
@@ -411,6 +411,8 @@ auto count_min_sketch<W,A>::serialize(unsigned header_size_bytes) const -> vecto
template<typename W, typename A>
auto count_min_sketch<W,A>::deserialize(const void* bytes, size_t size, uint64_t seed, const A& allocator) -> count_min_sketch {
+ ensure_minimum_memory(size, PREAMBLE_LONGS_SHORT * sizeof(uint64_t));
+
const char* ptr = static_cast<const char*>(bytes);
// First 8 bytes are 4 bytes of preamble and 4 unused bytes.
@@ -443,6 +445,8 @@ auto count_min_sketch<W,A>::deserialize(const void* bytes, size_t size, uint64_t
const bool is_empty = (flags_byte & (1 << flags::IS_EMPTY)) > 0;
if (is_empty) return c ; // sketch is empty, no need to read further.
+ ensure_minimum_memory(size, sizeof(W) * (1 + nbuckets * nhashes));
+
// Long 2 is the weight.
W weight;
ptr += copy_from_mem(ptr, weight) ;
diff --git a/density/include/density_sketch_impl.hpp b/density/include/density_sketch_impl.hpp
index 4b4e3b7..763f4e7 100755
--- a/density/include/density_sketch_impl.hpp
+++ b/density/include/density_sketch_impl.hpp
@@ -354,10 +354,11 @@ density_sketch<T, K, A> density_sketch<T, K, A>::deserialize(const void* bytes,
// levels arrays
Levels levels(allocator);
- int64_t num_to_read = num_retained; // num_retrained is uint32_t so this allows error checking
+ int64_t num_to_read = num_retained; // num_retained is uint32_t so this allows error checking
while (num_to_read > 0) {
uint32_t level_size;
ptr += copy_from_mem(ptr, level_size);
+ ensure_minimum_memory(end_ptr - ptr, level_size * pt_size);
Level lvl(allocator);
lvl.reserve(level_size);
for (uint32_t i = 0; i < level_size; ++i) {
@@ -442,7 +443,6 @@ string<A> density_sketch<T, K, A>::to_string(bool print_levels, bool print_items
if (print_items) {
os << "### Density sketch data:" << std::endl;
- unsigned level = 0;
for (unsigned height = 0; height < levels_.size(); ++height) {
os << " level " << height << ": " << std::endl;
for (const auto& point: levels_[height]) {
@@ -458,7 +458,6 @@ string<A> density_sketch<T, K, A>::to_string(bool print_levels, bool print_items
}
os << "]" << std::endl;
}
- ++level;
}
os << "### End sketch data" << std::endl;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@datasketches.apache.org
For additional commands, e-mail: commits-help@datasketches.apache.org