Add multithreading to libFLAC++ and more fuzzers

This commit is contained in:
Martijn van Beurden 2023-08-01 11:30:27 +02:00
parent 8c41e7f62e
commit c227be6c12
4 changed files with 26 additions and 0 deletions

View File

@ -148,6 +148,7 @@ namespace FLAC {
virtual bool set_metadata(::FLAC__StreamMetadata **metadata, uint32_t num_blocks); ///< See FLAC__stream_encoder_set_metadata()
virtual bool set_metadata(FLAC::Metadata::Prototype **metadata, uint32_t num_blocks); ///< See FLAC__stream_encoder_set_metadata()
virtual bool set_limit_min_bitrate(bool value); ///< See FLAC__stream_encoder_set_limit_min_bitrate()
virtual uint32_t set_num_threads(uint32_t value); ///< See FLAC__stream_encoder_set_num_threads()
/* get_state() is not virtual since we want subclasses to be able to return their own state */
State get_state() const; ///< See FLAC__stream_encoder_get_state()
@ -171,6 +172,7 @@ namespace FLAC {
virtual uint32_t get_rice_parameter_search_dist() const; ///< See FLAC__stream_encoder_get_rice_parameter_search_dist()
virtual FLAC__uint64 get_total_samples_estimate() const; ///< See FLAC__stream_encoder_get_total_samples_estimate()
virtual bool get_limit_min_bitrate() const; ///< See FLAC__stream_encoder_get_limit_min_bitrate()
virtual uint32_t get_num_threads() const; ///< See FLAC__stream_encoder_get_num_threads()
virtual ::FLAC__StreamEncoderInitStatus init(); ///< See FLAC__stream_encoder_init_stream()
virtual ::FLAC__StreamEncoderInitStatus init_ogg(); ///< See FLAC__stream_encoder_init_ogg_stream()

View File

@ -142,6 +142,10 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
const bool res = encoder.set_sample_rate(ds.Get<uint32_t>());
fuzzing::memory::memory_test(res);
}
{
const bool res = encoder.set_num_threads(ds.Get<uint32_t>());
fuzzing::memory::memory_test(res);
}
if ( size > 2 * 65535 * 4 ) {
/* With large inputs and expensive options enabled, the fuzzer can get *really* slow.
@ -197,6 +201,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
res = res || encoder.set_limit_min_bitrate(true);
res = res || encoder.set_blocksize(3021);
res = res || encoder.set_sample_rate(44100);
res = res || (encoder.set_num_threads(4) == FLAC__STREAM_ENCODER_SET_NUM_THREADS_OK);
fuzzing::memory::memory_test(res);
if(res)
abort();
@ -224,6 +229,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
res = res != encoder.get_limit_min_bitrate();
res = res != encoder.get_blocksize();
res = res != encoder.get_sample_rate();
res = res != encoder.get_num_threads();
fuzzing::memory::memory_test(res);
}

View File

@ -197,6 +197,10 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
const bool res = encoder.set_sample_rate(ds.Get<uint32_t>());
fuzzing::memory::memory_test(res);
}
{
const bool res = encoder.set_num_threads(ds.Get<uint32_t>());
fuzzing::memory::memory_test(res);
}
decoder.set_metadata_respond_all();
@ -254,6 +258,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
res = res || encoder.set_limit_min_bitrate(true);
res = res || encoder.set_blocksize(3021);
res = res || encoder.set_sample_rate(44100);
res = res || (encoder.set_num_threads(4) == FLAC__STREAM_ENCODER_SET_NUM_THREADS_OK);
fuzzing::memory::memory_test(res);
if(res)
abort();
@ -281,6 +286,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
res = res != encoder.get_limit_min_bitrate();
res = res != encoder.get_blocksize();
res = res != encoder.get_sample_rate();
res = res != encoder.get_num_threads();
fuzzing::memory::memory_test(res);
}

View File

@ -217,6 +217,12 @@ namespace FLAC {
return static_cast<bool>(::FLAC__stream_encoder_set_limit_min_bitrate(encoder_, value));
}
uint32_t Stream::set_num_threads(uint32_t value)
{
FLAC__ASSERT(is_valid());
return ::FLAC__stream_encoder_set_num_threads(encoder_, value);
}
Stream::State Stream::get_state() const
{
FLAC__ASSERT(is_valid());
@ -343,6 +349,12 @@ namespace FLAC {
return static_cast<bool>(::FLAC__stream_encoder_get_limit_min_bitrate(encoder_));
}
uint32_t Stream::get_num_threads() const
{
FLAC__ASSERT(is_valid());
return ::FLAC__stream_encoder_get_num_threads(encoder_);
}
::FLAC__StreamEncoderInitStatus Stream::init()
{
FLAC__ASSERT(is_valid());