From f78c7a2a215bb2d768047d250a7b9ff2926b709c Mon Sep 17 00:00:00 2001 From: Andrej Babic Date: Tue, 20 Nov 2018 14:28:47 +0100 Subject: [PATCH] Implement input validation --- lib/src/MetadataBuffer.cpp | 57 +++++++++++++++++++++++++++++++------- lib/src/MetadataBuffer.hpp | 11 ++++---- 2 files changed, 52 insertions(+), 16 deletions(-) diff --git a/lib/src/MetadataBuffer.cpp b/lib/src/MetadataBuffer.cpp index 10782e3..814418b 100644 --- a/lib/src/MetadataBuffer.cpp +++ b/lib/src/MetadataBuffer.cpp @@ -1,3 +1,7 @@ +#include +#include + +#include "date.h" #include "MetadataBuffer.hpp" using namespace std; @@ -7,25 +11,47 @@ MetadataBuffer::MetadataBuffer(uint64_t n_images, shared_ptr buffer(new char[buffer_size_bytes], std::default_delete()); - metadata_buffer.insert({name, buffer}); - metadata_length_bytes.insert({name, bytes_size_per_frame}); - } + shared_ptr buffer(new char[buffer_size_bytes], std::default_delete()); + metadata_buffer.insert({name, buffer}); + metadata_length_bytes.insert({name, bytes_size_per_frame}); + } } } void MetadataBuffer::add_metadata_to_buffer(string name, uint64_t frame_index, const char* data) { + if (frame_index >= n_images) { + stringstream error_message; + using namespace date; + error_message << "[" << std::chrono::system_clock::now() << "] "; + error_message << "Requested frame_index " << frame_index << " "; + error_message << "for metadata " << name << " in metadata buffer is out of range. "; + error_message << "Number of available slots: " << n_images << endl; + + throw runtime_error(error_message.str()); + } + + auto metadata = metadata_buffer.find(name); + + if (metadata == metadata_buffer.end()) { + stringstream error_message; + using namespace date; + error_message << "[" << std::chrono::system_clock::now() << "] "; + error_message << "Cannot add data to metadata buffer because '" << name << "' is not declared."<< endl; + + throw runtime_error(error_message.str()); + } + size_t bytes_size_per_frame = metadata_length_bytes.at(name); size_t buffer_offset = frame_index * bytes_size_per_frame; - char* buffer = (metadata_buffer.at(name)).get(); + char* buffer = metadata->second.get(); buffer += buffer_offset; memcpy(buffer, data, bytes_size_per_frame); @@ -33,5 +59,16 @@ void MetadataBuffer::add_metadata_to_buffer(string name, uint64_t frame_index, c shared_ptr MetadataBuffer::get_metadata_values(string name) { - return metadata_buffer.at(name); + auto metadata = metadata_buffer.find(name); + + if (metadata == metadata_buffer.end()) { + stringstream error_message; + using namespace date; + error_message << "[" << std::chrono::system_clock::now() << "] "; + error_message << "Cannot get data from metadata buffer because '" << name << "' is not declared."<< endl; + + throw runtime_error(error_message.str()); + } + + return metadata->second; } diff --git a/lib/src/MetadataBuffer.hpp b/lib/src/MetadataBuffer.hpp index dee7fc4..4900058 100644 --- a/lib/src/MetadataBuffer.hpp +++ b/lib/src/MetadataBuffer.hpp @@ -6,20 +6,19 @@ #include "ZmqReceiver.hpp" - class MetadataBuffer { const uint64_t n_images; const std::shared_ptr> header_values_type; protected: - std::unordered_map> metadata_buffer; - std::unordered_map metadata_length_bytes; + std::unordered_map> metadata_buffer; + std::unordered_map metadata_length_bytes; public: - MetadataBuffer(uint64_t n_images, std::shared_ptr> header_values_type); - void add_metadata_to_buffer(std::string name, uint64_t frame_index, const char* data); - std::shared_ptr get_metadata_values(std::string name); + MetadataBuffer(uint64_t n_images, std::shared_ptr> header_values_type); + void add_metadata_to_buffer(std::string name, uint64_t frame_index, const char* data); + std::shared_ptr get_metadata_values(std::string name); }; #endif