1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-11-23 03:32:32 +00:00

Merge pull request #664 from TomHarte/DataAllocationGuards

Adds safety checks around video data allocation
This commit is contained in:
Thomas Harte 2019-10-19 18:36:05 -04:00 committed by GitHub
commit ddae086661
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 12 additions and 0 deletions

View File

@ -406,6 +406,10 @@ void CRT::set_immediate_default_phase(float phase) {
} }
void CRT::output_data(int number_of_cycles, size_t number_of_samples) { void CRT::output_data(int number_of_cycles, size_t number_of_samples) {
#ifndef NDEBUG
assert(number_of_samples > 0 && number_of_samples <= allocated_data_length_);
allocated_data_length_ = std::numeric_limits<size_t>::min();
#endif
scan_target_->end_data(number_of_samples); scan_target_->end_data(number_of_samples);
Scan scan; Scan scan;
scan.type = Scan::Type::Data; scan.type = Scan::Type::Data;

View File

@ -10,6 +10,7 @@
#define CRT_hpp #define CRT_hpp
#include <cstdint> #include <cstdint>
#include <limits>
#include <memory> #include <memory>
#include "../ScanTarget.hpp" #include "../ScanTarget.hpp"
@ -83,6 +84,10 @@ class CRT {
Outputs::Display::ScanTarget::Modals scan_target_modals_; Outputs::Display::ScanTarget::Modals scan_target_modals_;
static const uint8_t DefaultAmplitude = 80; static const uint8_t DefaultAmplitude = 80;
#ifndef NDEBUG
size_t allocated_data_length_ = std::numeric_limits<size_t>::min();
#endif
public: public:
/*! Constructs the CRT with a specified clock rate, height and colour subcarrier frequency. /*! Constructs the CRT with a specified clock rate, height and colour subcarrier frequency.
The requested number of buffers, each with the requested number of bytes per pixel, The requested number of buffers, each with the requested number of bytes per pixel,
@ -221,6 +226,9 @@ class CRT {
@returns A pointer to the allocated area if room is available; @c nullptr otherwise. @returns A pointer to the allocated area if room is available; @c nullptr otherwise.
*/ */
inline uint8_t *begin_data(std::size_t required_length, std::size_t required_alignment = 1) { inline uint8_t *begin_data(std::size_t required_length, std::size_t required_alignment = 1) {
#ifndef NDEBUG
allocated_data_length_ = required_length;
#endif
return scan_target_->begin_data(required_length, required_alignment); return scan_target_->begin_data(required_length, required_alignment);
} }