Commit Graph

3792 Commits

Author SHA1 Message Date
Ralph Giles
52df9c6117 Flac-in-mp4 draft v0.0.1.
Draft updates in response to feedback from Timothy B. Terriberry
and Jean-Yves Avenard.

Signed-off-by: Erik de Castro Lopo <erikd@mega-nerd.com>
2016-10-05 03:30:21 +11:00
Ralph Giles
4bbd73a854 Flac-in-mp4 draft v0.0.0.
We've been working on a draft spec for encapsulation of FLAC
in the ISO Base Media File Format (mp4). This is the initial
draft created by Monty Montgomery based on Yusuke Nakamura's
Opus-in-mp4 draft.

More details at https://bugzilla.mozilla.org/show_bug.cgi?id=1286097

Signed-off-by: Erik de Castro Lopo <erikd@mega-nerd.com>
2016-10-05 03:30:21 +11:00
Erik de Castro Lopo
a2420c1405 cpu.c: Really fix compiler warnings 2016-09-12 17:27:11 +10:00
Erik de Castro Lopo
d1c15b4fc1 cpu.c: Fix compiler warning on PowerPC 2016-09-11 13:54:15 +10:00
Erik de Castro Lopo
23f6a35996 Fix compiler warning from gcc-6.1.1 2016-09-08 20:39:48 +10:00
Max Kellermann
a52177b0d1 stream_decoder: reset has_seek_table before read_metadata_seektable_()
If a seek table has already been read successfully, then the
has_seek_table flag is true.  Now imagine the file comes with another
seek table, which doesn't make sense, but libFLAC accepts it happily.
If reading this second seek table fails (for example allocation
failure), read_metadata_seektable_() returns false, but the
has_seek_table flag is still true.  If the calling application happens
to ignore this failure, and at some point tries to seek, the process
will crash due to NULL pointer dereference.  This would sure be an
application bug that needs to be fixed, but libFLAC's internal state
is inconsistent, so let's fix this up.

Signed-off-by: Erik de Castro Lopo <erikd@mega-nerd.com>
2016-07-14 18:42:05 +10:00
Max Kellermann
f7491f9741 stream_decoder: fix memory leak after seek table read error
When read_metadata_seektable_() fails, the has_seek_table flag is
never set to true, and thus free() is never called.

Example valgrind output:

 11,185,464 bytes in 1 blocks are definitely lost in loss record 62 of 62
    at 0x4C2BC0F: malloc (vg_replace_malloc.c:299)
    by 0x4C2DE6F: realloc (vg_replace_malloc.c:785)
    by 0x40A7880: safe_realloc_ (alloc.h:159)
    by 0x40A7911: safe_realloc_mul_2op_ (alloc.h:205)
    by 0x40AB6B5: read_metadata_seektable_ (stream_decoder.c:1654)
    by 0x40AAB2D: read_metadata_ (stream_decoder.c:1422)
    by 0x40A9C79: FLAC__stream_decoder_process_until_end_of_metadata (stream_decoder.c:1055)

It is easy to craft a FLAC file which leaks megabytes of memory on
every attempt to open the file.

This patch fixes the problem by removing checks which are unnecessary
(and harmful).  Checking the has_seek_table flag is not enough, as
described above.  The NULL check is not harmful, but is not helpful
either, because free(NULL) is documented to be legal.

After running this code block, we're in a well-known safe state, no
matter how inconsistent pointer and flag may have been before, for
whatever reasons.

Signed-off-by: Erik de Castro Lopo <erikd@mega-nerd.com>
2016-07-14 18:42:05 +10:00
Erik de Castro Lopo
c12bfa0e72 libFLAC: Fix cpuid detecton on old Cyrix CPUs
Some old CPUs (eg Cyrix) set EDX but not ECX when executing CPUID.
One of the solutions is to clear ECX before calling cpuid. From
https://bugzilla.mozilla.org/show_bug.cgi?id=1096651#c9 bug

Patch-from: lvqcl <lvqcl.mail@gmail.com>
2016-07-13 19:47:11 +10:00
Erik de Castro Lopo
74e751c421 libFLAC: Set decoding status if write callback failed
Previously, it the write callback failed the error status
would be set to `FLAC__STREAM_DECODER_READ_FRAME`. Now it
gets set to `FLAC__STREAM_DECODER_WRITE_STATUS_ABORT`.

Patch-from: lvqcl <lvqcl.mail@gmail.com>
2016-07-13 19:42:25 +10:00
Erik de Castro Lopo
293acefe77 libFLAC/metadata_object.c: Clean up
* Remove Yoda conditionals.
* Drop some un-needed asserts.
2016-07-10 17:09:48 +10:00
Erik de Castro Lopo
a70fcdd633 metadata_object.c: Remove un-needed asserts
These asserts were being triggered by AFL (American Fuzzy Lop) and
serve seemingly no useful purpose. The are only enabled in debug builds
where they abort the program which is otherwise in a safe state.

Removing these asserts will potentially allow AFL to turn up other
problems elsewhere.
2016-07-10 11:25:39 +10:00
Max Kellermann
9949ce15f6 stream_decoder: fix integer underflow due to malformed wasted_bits
It is pretty easy for a malformed FLAC file to underflow the "bps"
variable.  In the debug build, this results in an assertion failure in
FLAC__bitreader_read_raw_uint32():

    FLAC__ASSERT(bits <= 32);

In non-debug builds, this simply makes
FLAC__bitreader_read_raw_uint32() fail because
bitreader_read_from_client_() doesn't find enough buffer space for
2**32-1 bits.  But since the failing FLAC_ASSERT() is reasonable, this
should be caught in the FLAC__bitreader_read_raw_uint32() caller.

Signed-off-by: Erik de Castro Lopo <erikd@mega-nerd.com>
Closes: https://github.com/xiph/flac/pull/13
2016-07-10 08:19:26 +10:00
Max Kellermann
0a49fe7788 stream_decoder: check state==ABORTED after process_single() for seek
FLAC__stream_decoder_process_single() ignores frame_sync_() errors,
which means the caller cannot rely solely on the boolean return value,
it is also required to check the new "state".

After FLAC__stream_decoder_process_until_end_of_metadata(),
state==SEARCH_FOR_FRAME_SYNC and
last_frame.header.number_type==FRAME_NUMBER.  When an application
seeks at this time, but an I/O error occurs, then
FLAC__stream_decoder_process_single() returns true, but no frame has
been read yet, i.e. last_frame.header.number_type is still
FRAME_NUMBER.  This triggers the assertion in
seek_to_absolute_sample_():

 FLAC__ASSERT(decoder->private_->last_frame.header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER);

So what needs to be done is check for state==ABORTED after the
FLAC__stream_decoder_process_single() call.

This bug can be triggered remotely with the Music Player Daemon
(https://www.musicpd.org/), and crashes the process.

Signed-off-by: Erik de Castro Lopo <erikd@mega-nerd.com>
Closes: https://github.com/xiph/flac/pull/12
2016-07-10 08:19:26 +10:00
Erik de Castro Lopo
8279778735 flac++.pc.in: Make flac a private requires
Patch pulled from Debian package.

Description:
Chain::Status::as_cstring uses FLAC__Metadata_ChainStatusString which
is in libFLAC. Since the function is inline, every program calling
this function must also link with -lflac, but this is missing in
flac++.pc.

Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=713645
2016-07-09 21:56:36 +10:00
Erik de Castro Lopo
51fc948746 libFLAC/cpu.c: Fix dfprintf macro for MSVS 2016-07-01 07:04:28 +10:00
Erik de Castro Lopo
bba26a551f libFLAC/cpu.c: Add parens to avoid compiler warnings 2016-06-28 18:08:12 +10:00
Julian Calaby
42c5de6e44 libFLAC/cpu.c: Inline *_disable_avx()
Also only print out OS AVX status if AVX is actually enabled.
2016-06-28 18:08:12 +10:00
Julian Calaby
eae338e0e6 libFLAC/cpu.c: Move cpu_id_ex into cpu_info_x86()
This simplifies the C code without complexifying the preprocessor
code.
2016-06-28 18:08:12 +10:00
Julian Calaby
79ca23ece3 libFLAC/cpu.c: Eliminate a branch in cpu_info_x86
Inverting all the if statements allows us to move the common code of
setting all the registers to zero outside the #if statement.
2016-06-28 18:08:12 +10:00
Julian Calaby
e58a6e7549 libFLAC/cpu.c: Remove a layer of cpp conditionals 2016-06-28 18:08:12 +10:00
Julian Calaby
7394ad85b8 libFLAC/cpu.c: Drop some unnecessary returns 2016-06-28 18:08:12 +10:00
Julian Calaby
078c631d73 libFLAC/cpu.c: Get rid of OS_IS_ANDROID function 2016-06-28 18:08:12 +10:00
Julian Calaby
828e33b38f libFLAC/cpu.c: Move stdio.h include under DEBUG 2016-06-28 18:08:12 +10:00
Julian Calaby
601c051df4 libFLAC/cpu.c: Use a dummy function for debugging
This saves 5 if statements that would have had to have been
optimised away.
2016-06-28 18:08:12 +10:00
Erik de Castro Lopo
85c902fbbc libFLAC/cpu.c: More MSVC fixes
With help from lvqcl <lvqcl.mail@gmail.com>
2016-06-27 05:46:21 +10:00
Erik de Castro Lopo
a08e90c425 libFLAC/cpu.c: Fixes for MSVC
MSVC is strange and perverse.
2016-06-26 21:58:54 +10:00
Erik de Castro Lopo
162a44923c libFLAC/cpu.c: Fix build on non-Intel CPUs 2016-06-26 17:28:27 +10:00
Erik de Castro Lopo
7a8f3591d6 libFLAC/cpu.c: More cleanup and refactoring
* Split `FLAC__cpu_info` into CPU specific functions. We now have
  `ia32_cpi_info` and `x86_64_cpu_info` and a simple obvious way
  to add support for other CPUs.
* Improve handling of Android OS.
* Remove more #ifdefs where possible.
* Compile (syntax and type check) DEBUG output code even when debugging
  is disabled.
* Remove build support for ancient NetBSD version 1.5 (version 1.6 was
  released in 2002).
2016-06-26 17:05:36 +10:00
Erik de Castro Lopo
936e968c3a libFLAC/cpu.[ch]: More pre-processor cleanups 2016-06-26 12:14:02 +10:00
Erik de Castro Lopo
fa24613ad9 libFLAC/cpu.c: More refactoring and cleanups
* Make `FLAC__cpu_xgetbv_x86` private to cpu.c (and rename it to
  `cpu_xgetbv_x86` (it wasn't being used anywhere else).
* Remove `FLAC__cpu_have_cpuid_x86` altogether as it wasn't actually
  being used but that was difficult to tell because of all the #ifdef
  nonsense.
2016-06-26 10:43:29 +10:00
Erik de Castro Lopo
23778a3a60 libFLAC/cpu.c: More pre-processor cleanups 2016-06-25 17:02:06 +10:00
Erik de Castro Lopo
36a0ab100d Fix use of FLAC__HAS_X86INTRIN configure variable 2016-06-20 20:42:44 +10:00
Erik de Castro Lopo
e120037f3c Fix use of FLAC__SSE_OS configure variable 2016-06-20 20:42:44 +10:00
Erik de Castro Lopo
e58b36c8ea Fix nasm compile on OS X / Darwin
Apparently this had been fixes in Audacity and other projects
but no one had bothered to feed them back upstream. Thanks to
lvqcl for researching this and finding the relevant patches.
Thanks to Ozkan Sezer for validating them.

Closes:  https://sourceforge.net/p/flac/bugs/438/
2016-06-14 06:31:25 +10:00
Erik de Castro Lopo
fdc1ccf2bd libFLAC: More metadata_iterators fixes
The previous fixes for metadata_iterators didn't completely fix the problem.

The behavior of chain_prepare_for_write_() must always be the same as the
behavior of FLAC__metadata_chain_check_if_tempfile_needed(). Before this
fix, one check was missing in FLAC__metadata_chain_check_if_tempfile_needed(),
and also chain_prepare_for_write_() checked the sizes of the metadata blocks
*after* making the changes to the chain, while
FLAC__metadata_chain_check_if_tempfile_needed() does it *before* the changes.

This patch changes FLAC__metadata_chain_check_if_tempfile_needed() so that it
keeps some info (lbs_state, lbs_size) about estimated changes and then uses
it to check the block sizes.

It also simplifies FLAC__metadata_chain_check_if_tempfile_needed() a little.

Patch-from: lvqcl <lvqcl.mail@gmail.com>
2016-05-22 11:06:32 +10:00
Erik de Castro Lopo
0b9bcebd78 test/Makefile.lite: Remove call to old script 2016-05-13 06:50:49 +10:00
Erik de Castro Lopo
089caeae8e Makefile.lite: Improved solution to CFLAGS from environment 2016-05-13 06:50:18 +10:00
Erik de Castro Lopo
2a47450d05 Makefile.lite: Pick up CFLAGS from the environment
This allows extra CFLAGS to be set on the command line. Eg

     CFLAGS=Werror make -f Makefile.lite
2016-05-12 19:22:56 +10:00
Tim Blechmann
912bff442e libFLAC: infer cpu type from compiler macros
Signed-off-by: Erik de Castro Lopo <erikd@mega-nerd.com>
2016-05-12 08:06:26 +10:00
Erik de Castro Lopo
bbf1e3eaef test_libFLAC++: Fix memory leaks
Memory leaks found using `cppcheck`.
2016-05-08 17:29:00 +10:00
Erik de Castro Lopo
94a61241b0 libFLAC: Add a workaround for a bug in MSVC2105 update2
MSVC2105 update2 compiles the C code:

    abs_residual_partition_sums[partition] =
                  (FLAC__uint32)_mm_cvtsi128_si32(mm_sum);

into this:

    movq    QWORD PTR [rsi], xmm2

while it should be:

    movd    eax, xmm2
    mov     QWORD PTR [rsi], rax

With this patch, MSVC emits:

    movq    QWORD PTR [rsi], xmm2
    mov     DWORD PTR [rsi+4], r9d

so the price of this workaround is 1 extra write instruction per
partition.

Patch-from: lvqcl <lvqcl.mail@gmail.com>
2016-05-05 17:23:52 +10:00
Erik de Castro Lopo
387992bd64 metadata_iterators.c: Limit padding size
Without this fix, its possible for libFLAC to create an oversized
padding metadata block when:

a) it merges existing padding blocks

or
b) it expands padding block during metadata changes

resulting in a corrupt FLAC file.

Patch-from: lvqcl <lvqcl.mail@gmail.com>
2016-05-01 20:57:18 +10:00
Erik de Castro Lopo
94ff346ad0 Windows/MSVC: Add ENABLE_64_BIT_WORDS macro
Allow setting of ENABLE_64_BIT_WORDS preprocessor variable for
libFLAC_dynamic, libFLAC_static and test_libFLAC projects and x64
platform.

Patch-from: lvqcl <lvqcl.mail@gmail.com>
2016-05-01 20:55:15 +10:00
Erik de Castro Lopo
f3a16f85cf bitwrite.c: Tweaks
* Removes unused FLAC__WORD_ALL_ONES definition.
* Add comment that unused bits of accumulator can contain garbage.
* Turn assert inside FLAC__bitwriter_write_utf8_uint32 into runtime
  check (similar to FLAC__bitwriter_write_utf8_uint64() function).

Patch-from: lvqcl <lvqcl.mail@gmail.com>
2016-05-01 20:40:28 +10:00
Erik de Castro Lopo
94386fdea5 libFLAC: Add metadata size checks to FLAC library
This follows on from the previous patch.

Patch-from: lvqcl <lvqcl.mail@gmail.com>
2016-05-01 20:36:43 +10:00
Erik de Castro Lopo
516a7ad4d9 flac/metaflac: Limit the size of metadata blocks
Limit allow image file size to slightly less than 2^24 bytes so that
the file size plus extra house keeping data is strictly less that
2^24 bytes in size.

Patch-from: lvqcl <lvqcl.mail@gmail.com>
2016-05-01 20:36:25 +10:00
Erik de Castro Lopo
cf0a6ec709 Fix 'make distcheck' target
Last commit added a new file which was not added to `EXTRA_DIST`.
2016-04-27 10:23:38 +10:00
Erik de Castro Lopo
3de7413a36 cuesheet.c: Allow quotes around ISRC field
With this change, flac now accepts cuesheets where the ISRC field is
enclosed in double quotes. Added a test for this as well.

Closes: https://sourceforge.net/p/flac/bugs/436/
2016-04-26 18:06:16 +10:00
Erik de Castro Lopo
50af1bcf63 libFLAC/stream_decoder.c: Fix typo
Introduced in 1be4f9537e.
2016-03-20 20:49:31 +11:00
Erik de Castro Lopo
9548d4b953 configure.ac: Force FLAC__HAS_OGG to 0 or 1 2016-03-20 20:44:59 +11:00