Commit Graph

4056 Commits

Author SHA1 Message Date
Martijn van Beurden
95064f9f08 Fix fuzzer_decoder timeouts
fuzzer_decoder was running into timeouts because it triggered the
gap-filling for broken frames with 5*192000 samples and a blocksize
of 1, causing the write callback to be called 960000 times. Doing
this several times in one file caused a single fuzz run to take
> 60 seconds

This commit limits the minimum blocksize to 16 samples, and the
maximum number of frames emitted to 50

Credit: Oss-Fuzz
Issue: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=47193
2022-05-29 21:08:29 +02:00
Martijn van Beurden
9e425621cc Close file when stream_encoder init fails 2022-05-28 22:28:21 +02:00
Martijn van Beurden
9e143766ca Only locally disable signed integer sanitizing on decoder fuzzers
See https://github.com/google/oss-fuzz/pull/7687
2022-05-28 07:31:37 +02:00
Martijn van Beurden
6b2fc739ed Improve compute_residual_from_qlp_coefficients datapath selection
This bases the selection of the datapath on the actual predictor
coefficients instead of on the predictor coefficient precision
2022-05-28 07:31:37 +02:00
Martijn van Beurden
dd4a263406 Remove Makefile.lite build system 2022-05-27 21:59:32 +02:00
Martijn van Beurden
1bb80c18da Small make distcheck fixes 2022-05-27 21:59:32 +02:00
Martijn van Beurden
e0e9cc58b4 Remove all Visual Studio specific build files 2022-05-27 21:59:32 +02:00
Martijn van Beurden
5705a61c55 fuzzer_encoder_v2, fix 32-bit input and seektable 2022-05-26 22:46:09 +02:00
Martijn van Beurden
febff86af0 Remove all assembler and intrinsics from decoder
This commit drops all use of assembler and intrinsics from the libFLAC
decoder. This is because they are only for 32-bit x86, hard to debug,
maintain and fuzz properly, and because the decoder has much greater
security risks than the encoder.
2022-05-26 11:04:05 +02:00
Martijn van Beurden
a67102694d Add extra check to decoding cpp example like in 93846ee
This fixes https://github.com/xiph/flac/issues/162

See also https://sourceforge.net/p/flac/bugs/418/
2022-05-23 06:53:07 +02:00
Martijn van Beurden
4dedae4f18 Renable escape coding for fuzzing
Escape coding has been deprecated since FLAC 1.0.4 (24-Sep-2002), but
it is needed for full spec coverage, (as this is a reference
implementation after all) so this should be reenabled at some point.

For now only enable while fuzzing, so we can get some bugs out first.
2022-05-22 10:53:56 +02:00
Martijn van Beurden
f44d5967fd
Fix compression of loose mid-side for certain kinds of music
The loose mid-side option only fully evaluates stereo decorrelation
once every few frames. However, in case of finding left-side or
right-side to be the best option, subsequent frames were coded
mid-side, which could be worse off. To not complicate code too much
(to make it possible to evaluate only left or right and side frame
for example), evaluation of left-side and right-side is completely
disabled when loose mid-side is enabled.
2022-05-21 20:06:57 +02:00
Martijn van Beurden
bcb7ed12b9 Default to picture type other when unknown picture type is found
When an unknown picture type was found, the resulting type wouldn't
occur in the enum, which is undefined behaviour. This commit changes
the picture type to 0 (other) when that happens.

Credit: Oss-Fuzz
Issue: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=46964
2022-05-20 22:48:38 +02:00
Martijn van Beurden
69cf76c58e Fix use of undefined value
The mechanism to improve metadata reading added in 0077d3b overrides
a FLAC__STREAM_DECODER_ABORTED with
FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC causing the decoder to
overread a buffer into an uninitialized part. A check is added that
ensures searching for frame sync is only set when the decoder is
still in a valid state

Credit: Oss-Fuzz
Issue: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=47525
2022-05-20 19:38:56 +02:00
Martijn van Beurden
43b6b64cad [CMake] Add /arch:avx2 flag, clarify WITH_SSE2 and WITH_AVX options
Adds /arch:avx2 to the avx2-specific source files. This mirrors the
current vcxproj files. While it currently brings no improvements,
it might if CPU-specific optimization is left to the compiler
instead of with hand-optimized code in the future

Also, the exact meaning of options WITH_SSE2 and WITH_AVX is
stated, as the first is compile-time only, and the second also
has runtime detection
2022-05-20 16:32:25 +02:00
Martijn van Beurden
7e4d8189d8 [CMake] Remove _FORTIFY_SOURCE=1 on not having libssp
Based on some information somewhere on the internet, CMakeLists.txt
sets _FORTIFY_SOURCE=2 when its runtime functions are available and
_FORTIFY_SOURCE=1 when they are not. However, _FORTIFY_SOURCE=1
also requires runtime functions.
2022-05-20 16:09:39 +02:00
Martijn van Beurden
5f4fa0ad73 Fix heap overflow when invalid encoder is used anyway 2022-05-19 20:22:09 +02:00
Martijn van Beurden
74b093f6e1 Fix initialization of encoder fuzzer (v1)
The encoder fuzzer initialized before setting up. This is now swapped
without upsetting the way the datasource is queried
2022-05-19 20:22:09 +02:00
Martijn van Beurden
383b77fa08 Let fuzzer_encoder_v2 use tmp files to improve coverage 2022-05-19 20:22:09 +02:00
Rosen Penev
2b4ba6013e
tests: Run through shellcheck (#134)
Signed-off-by: Rosen Penev <rosenp@gmail.com>
2022-05-18 21:27:19 +02:00
Martijn van Beurden
f180900b95 Fix memory leak
When resetting the decoder, the MD5 buffer wasn't freed but the pointer
set to zero anyway.
2022-05-18 17:12:28 +02:00
Martijn van Beurden
9e8d7389dc Fix initialization of decoder fuzzer
The decoder fuzzer initialized before setting up. This is now swapped
without upsetting the way the datasource is queried
2022-05-18 17:12:28 +02:00
Martijn van Beurden
e5e99dcdc2
Simplify and merge win_utf8 files and remove from DLL interface
libFLAC DLLs were exposing windows_unicode_filename.h functions
because flac and metaflac needed to set flac_internal_set_utf8_
filenames. Files windows_unicode_filename.{c/h} and
win_utf8_io.[c/h] are merged, and all non-utf8 parts are removed.

With this commit, the libFLAC DLL interface is the same as the
libFLAC interface of shared libraries on other platforms
2022-05-17 22:05:45 +02:00
Martijn van Beurden
3d40818489
Revert part of commit 5df56db
Commit 5df56db introduced four completely rewritten functions with
intrinsics, but it turns out two of them have integers that can
overflow. Because those two functions were barely faster than
what they replaced, fixing these overflows will probably make the
functions slower than what they replaced, so this is reverted.

Credit: Oss-Fuzz
Issue: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=47416
2022-05-16 19:41:59 +02:00
Martijn van Beurden
61649d09aa
Add checks for decoding from and encoding to UTF-8 filenames 2022-05-12 22:21:39 +02:00
Martijn van Beurden
1bec35e337 Add residual limit checking
This patch adds a (fast) check in the bitreader to detect overflow
of the residual
2022-05-11 10:34:49 +02:00
Martijn van Beurden
becba351f0 Make it possible for fuzzer to disable instruction set optimizations
This should greatly increase code coverage of the encoder fuzzer
2022-05-11 10:34:49 +02:00
Martijn van Beurden
87a5f3e952 Add abort on encoding error that should not happen
This commit lets the following errors trigger an abort:
- FLAC__STREAM_ENCODER_OGG_ERROR
- FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR
- FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA
- FLAC__STREAM_ENCODER_IO_ERROR
- FLAC__STREAM_ENCODER_FRAMING_ERROR
- FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR

FLAC__STREAM_ENCODER_CLIENT_ERROR does not trigger an abort because
it is used to signal invalid input. FLAC__STREAM_ENCODER_UNINITIALIZED
does not trigger an abort because init fails when invalid parameters
are given
2022-05-11 10:34:49 +02:00
Martijn van Beurden
6122337f73 Check whether verify decoder is still valid
Errors returned by the verifing decoder were ignored, while an error
often invalidates the assumptions the encoder made about the state
of the verifying decoder. If an error was ignored, it could be the
decoder outputs an (invalid) frame with a different number of channels
than the encoder expects. This could cause heap overflows. This
commit adds checks for this occuring.
2022-05-11 10:34:49 +02:00
Martijn van Beurden
dd15db8f93 Fix overflows in fixed_compute_best_predictor
Credit: Oss-Fuzz
Issue: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=47187
2022-05-09 22:08:39 +02:00
Martijn van Beurden
8b148b257e Rename FLAC__get_decoder_client_data to ...
... FLAC__stream_decoder_get_client_data. Also the function
definition was moved to its 'siblings'. This way, the function
fits better in the API with respect to naming.
2022-05-09 17:29:46 +02:00
Martijn van Beurden
b433bbc5cf
Rewrite of fixed_compute_best_predictor functions
The code of fixed_compute_best_predictor was presumable once optimized,
but it appears a much more readable form is now equally fast or even faster,
see https://github.com/xiph/flac/pull/337 for details.
2022-05-08 20:14:36 +02:00
Martijn van Beurden
b64ea1171b Fix fuzzer_encoder_v2 timeouts
This fixes the 'false positive' oss-fuzz bug filed under
https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=47264

The fuzzer was timing out because of an enormous input (932kB)
combined with very slow settings. The commit disables certain
slow settings on inputs larger than 2^18 byte.
2022-05-07 21:58:40 +02:00
Martijn van Beurden
b6e2f4f014 Fix distcheck 2022-05-06 12:28:17 +02:00
Martijn van Beurden
cda987f7c5 Lengthen test_compression.sh material for benchmarking on CI
This is necessary to compare CI WITH_ASM=1 and WITH_ASM=0 to be able
to check whether this switch does anything
2022-05-03 11:10:15 +02:00
Martijn van Beurden
e3a9212bfc [CMake] Fix ARM64 intrinsics activation
In 95e2c52 the autotools build worked fine, but CMake missed a few
defines. Activition of the lpc_compute_residual_from_qlp_coefficients
depended on encoder->private_->cpuinfo.use_asm for no reason, so
this dependency is removed
2022-05-03 11:10:15 +02:00
Martijn van Beurden
d9554fb7c9 Add --limit-min-bitrate to flac and add test for it 2022-05-02 07:59:01 +02:00
Martijn van Beurden
b5f4a1535c Add API functions to limit minimum bitrate
Quite a lot of decoders have trouble streaming or seeking in a
file with frames that only consist of constant subframes because
of the large difference between the largest and smallest subframe.

To remedy this, this commit makes it possible to disable the use
of constant subframes for the last subframe in case all others are
constant with a new API function. This means the minimum bitrate
for a FLAC file encoded with this function used is raised to
1bit/sample (i.e. 48kbit/s for 48kHz material). This commit also
adds tests to the test suite
2022-05-02 07:59:01 +02:00
Martijn van Beurden
3fc5ba4637 Replace seek error with handling when hitting EOF while reading frame 2022-05-01 17:35:36 +02:00
Martijn van Beurden
ee9c07aa22 Fix memory leak in stream_decoder.c
Memory leaked in case FLAC__stream_encoder_set_metadata was used
but subsequent init failed
2022-04-30 21:20:50 +02:00
Martijn van Beurden
b52734242e Add fuzzer_encoder_v2
Add additional fuzzer for the encoder, aiming to reach more coverage
than the current encoder fuzzer. This is done by incorporating
metadata handling and fixing a problem with different settings in
the current fuzzer
2022-04-30 21:20:50 +02:00
Martijn van Beurden
e0a874e84b
Silence a bunch of MSVC warnings
See https://github.com/xiph/flac/issues/313
2022-04-30 11:55:17 +02:00
Fabrice Fontaine
6cd28e855c Fix uclibc build
Commit 4fbb6d4f2e reverted commit
44036c9a9b and so broke again the build on
uclibc

So put back the sys/auxv.h check as well as a getauxval check in a way
that doesn't break iOS

Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
2022-04-30 09:46:47 +02:00
Martijn van Beurden
63ac1c37be
Silence oss-fuzz integer overflow warnings in audio data path
Because fuzzing feeds bogus predictors and residual samples to the
decoder, having overflows in certain functions is unavoidable. Also,
because the calculated values are audio path only, there is little
potential for security problems

Should 'fix' the following reports
https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=44824
https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=46964
2022-04-30 09:25:16 +02:00
Martijn van Beurden
ef4ad99231 Add ARM64 NEON intrinsics lpc_compute_autocorrelation routines 2022-04-29 21:44:29 +02:00
Rosen Penev
bfe5ff9455 change if checks to ifdef
More similar to the rest of the code.

Signed-off-by: Rosen Penev <rosenp@gmail.com>
2022-04-29 19:17:26 +02:00
RonenGvili
95e2c52980
Adding ARM64 support and optimized Neon implementation (#270)
Add NEON intrinsics routines for lpc_compute_residual_from_qlp_coefficients
and lpc_compute_residual_from_qlp_coefficients_wide
2022-04-29 14:46:07 +02:00
Martijn van Beurden
5df56dbcf5
Speed up intrinsic routines for fixed_compute_best_predictor
New intrinsic routines are added to compute the best fixed
predictor. According to my testing, the new routine is about
3 times as fast as the existing routine. This means an
overall speedup for preset -2 of about 30% and for preset
-0 of about 15% for CDDA
2022-04-28 21:19:10 +02:00
Martijn van Beurden
0caf685360
[CMake] Enable building ogg together with flac (#325)
This reverts the part of commit 2013738 that searched for a local
ogg build
2022-04-27 19:53:13 +02:00
Martijn van Beurden
1793632ee6
Rework error handling (#283)
This commit reworks the code decoding a frame, to add silence when
frames are missing and output silence when something other than the
frame header seems corrupted. Tests are added to the test suite for
this functionality. Also, decoded values are checked to be within bps
2022-04-27 12:16:15 +02:00