apply patches
This commit is contained in:
commit
cd5d347e6a
|
@ -31,7 +31,7 @@
|
|||
<UL>
|
||||
<LI> Compilation problems on new platforms.
|
||||
<LI> Errors being detected during the `make check' process.
|
||||
<LI> Segmentation faults occuring inside libsndfile.
|
||||
<LI> Segmentation faults occurring inside libsndfile.
|
||||
<LI> libsndfile hanging when opening a file.
|
||||
<LI> Supported sound file types being incorrectly read or written.
|
||||
<LI> Omissions, errors or spelling mistakes in the documentation.
|
||||
|
|
|
@ -317,7 +317,7 @@ main (int argc, char * argv [])
|
|||
if ((sfinfo.format & SF_FORMAT_SUBMASK) == SF_FORMAT_GSM610 && sfinfo.samplerate != 8000)
|
||||
{ printf (
|
||||
"WARNING: GSM 6.10 data format only supports 8kHz sample rate. The converted\n"
|
||||
"ouput file will contain the input data converted to the GSM 6.10 data format\n"
|
||||
"output file will contain the input data converted to the GSM 6.10 data format\n"
|
||||
"but not re-sampled.\n"
|
||||
) ;
|
||||
} ;
|
||||
|
|
|
@ -89,6 +89,13 @@ main (int argc, char **argv)
|
|||
exit (1) ;
|
||||
} ;
|
||||
|
||||
if (sfinfo.channels > MAX_CHANNELS)
|
||||
{ printf ("\nError : Input file '%s' has too many (%d) channels. Limit is %d.\n",
|
||||
argv [1], sfinfo.channels, MAX_CHANNELS) ;
|
||||
exit (1) ;
|
||||
} ;
|
||||
|
||||
|
||||
state.channels = sfinfo.channels ;
|
||||
sfinfo.channels = 1 ;
|
||||
|
||||
|
|
|
@ -1905,7 +1905,7 @@ aiff_read_chanmap (SF_PRIVATE * psf, unsigned dword)
|
|||
psf_binheader_readf (psf, "j", dword - bytesread) ;
|
||||
|
||||
if (map_info->channel_map != NULL)
|
||||
{ size_t chanmap_size = psf->sf.channels * sizeof (psf->channel_map [0]) ;
|
||||
{ size_t chanmap_size = SF_MIN (psf->sf.channels, layout_tag & 0xffff) * sizeof (psf->channel_map [0]) ;
|
||||
|
||||
free (psf->channel_map) ;
|
||||
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include "sfconfig.h"
|
||||
|
||||
#include <math.h>
|
||||
#include <limits.h>
|
||||
|
||||
#include "sndfile.h"
|
||||
#include "common.h"
|
||||
|
@ -326,7 +327,9 @@ s2alaw_array (const short *ptr, int count, unsigned char *buffer)
|
|||
static inline void
|
||||
i2alaw_array (const int *ptr, int count, unsigned char *buffer)
|
||||
{ while (--count >= 0)
|
||||
{ if (ptr [count] >= 0)
|
||||
{ if (ptr [count] == INT_MIN)
|
||||
buffer [count] = alaw_encode [INT_MAX >> (16 + 4)] ;
|
||||
else if (ptr [count] >= 0)
|
||||
buffer [count] = alaw_encode [ptr [count] >> (16 + 4)] ;
|
||||
else
|
||||
buffer [count] = 0x7F & alaw_encode [- ptr [count] >> (16 + 4)] ;
|
||||
|
@ -346,7 +349,9 @@ f2alaw_array (const float *ptr, int count, unsigned char *buffer, float normfact
|
|||
static inline void
|
||||
d2alaw_array (const double *ptr, int count, unsigned char *buffer, double normfact)
|
||||
{ while (--count >= 0)
|
||||
{ if (ptr [count] >= 0)
|
||||
{ if (!isfinite (ptr [count]))
|
||||
buffer [count] = 0 ;
|
||||
else if (ptr [count] >= 0)
|
||||
buffer [count] = alaw_encode [lrint (normfact * ptr [count])] ;
|
||||
else
|
||||
buffer [count] = 0x7F & alaw_encode [- lrint (normfact * ptr [count])] ;
|
||||
|
|
|
@ -675,15 +675,15 @@ psf_binheader_writef (SF_PRIVATE *psf, const char *format, ...)
|
|||
/* Write a C string (guaranteed to have a zero terminator). */
|
||||
strptr = va_arg (argptr, char *) ;
|
||||
size = strlen (strptr) + 1 ;
|
||||
size += (size & 1) ;
|
||||
|
||||
if (psf->header.indx + (sf_count_t) size >= psf->header.len && psf_bump_header_allocation (psf, 16))
|
||||
if (psf->header.indx + 4 + (sf_count_t) size + (sf_count_t) (size & 1) > psf->header.len && psf_bump_header_allocation (psf, 4 + size + (size & 1)))
|
||||
return count ;
|
||||
|
||||
if (psf->rwf_endian == SF_ENDIAN_BIG)
|
||||
header_put_be_int (psf, size) ;
|
||||
header_put_be_int (psf, size + (size & 1)) ;
|
||||
else
|
||||
header_put_le_int (psf, size) ;
|
||||
header_put_le_int (psf, size + (size & 1)) ;
|
||||
size += (size & 1) ;
|
||||
memcpy (&(psf->header.ptr [psf->header.indx]), strptr, size) ;
|
||||
psf->header.indx += size ;
|
||||
psf->header.ptr [psf->header.indx - 1] = 0 ;
|
||||
|
|
|
@ -725,6 +725,7 @@ enum
|
|||
SFE_FLAC_INIT_DECODER,
|
||||
SFE_FLAC_LOST_SYNC,
|
||||
SFE_FLAC_BAD_SAMPLE_RATE,
|
||||
SFE_FLAC_CHANNEL_COUNT_CHANGED,
|
||||
SFE_FLAC_UNKOWN_ERROR,
|
||||
|
||||
SFE_WVE_NOT_WVE,
|
||||
|
|
|
@ -91,7 +91,7 @@ int
|
|||
double64_init (SF_PRIVATE *psf)
|
||||
{ static int double64_caps ;
|
||||
|
||||
if (psf->sf.channels < 1)
|
||||
if (psf->sf.channels < 1 || psf->sf.channels > SF_MAX_CHANNELS)
|
||||
{ psf_log_printf (psf, "double64_init : internal error : channels = %d\n", psf->sf.channels) ;
|
||||
return SFE_INTERNAL ;
|
||||
} ;
|
||||
|
|
35
src/flac.c
35
src/flac.c
|
@ -169,6 +169,14 @@ flac_buffer_copy (SF_PRIVATE *psf)
|
|||
const int32_t* const *buffer = pflac->wbuffer ;
|
||||
unsigned i = 0, j, offset, channels, len ;
|
||||
|
||||
if (psf->sf.channels != (int) frame->header.channels)
|
||||
{ psf_log_printf (psf, "Error: FLAC frame changed from %d to %d channels\n"
|
||||
"Nothing to do but to error out.\n" ,
|
||||
psf->sf.channels, frame->header.channels) ;
|
||||
psf->error = SFE_FLAC_CHANNEL_COUNT_CHANGED ;
|
||||
return 0 ;
|
||||
} ;
|
||||
|
||||
/*
|
||||
** frame->header.blocksize is variable and we're using a constant blocksize
|
||||
** of FLAC__MAX_BLOCK_SIZE.
|
||||
|
@ -202,7 +210,6 @@ flac_buffer_copy (SF_PRIVATE *psf)
|
|||
return 0 ;
|
||||
} ;
|
||||
|
||||
|
||||
len = SF_MIN (pflac->len, frame->header.blocksize) ;
|
||||
|
||||
if (pflac->remain % channels != 0)
|
||||
|
@ -430,11 +437,23 @@ sf_flac_meta_get_vorbiscomments (SF_PRIVATE *psf, const FLAC__StreamMetadata *me
|
|||
static void
|
||||
sf_flac_meta_callback (const FLAC__StreamDecoder * UNUSED (decoder), const FLAC__StreamMetadata *metadata, void *client_data)
|
||||
{ SF_PRIVATE *psf = (SF_PRIVATE*) client_data ;
|
||||
FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ;
|
||||
int bitwidth = 0, i ;
|
||||
int bitwidth = 0 ;
|
||||
|
||||
switch (metadata->type)
|
||||
{ case FLAC__METADATA_TYPE_STREAMINFO :
|
||||
if (psf->sf.channels > 0 && psf->sf.channels != (int) metadata->data.stream_info.channels)
|
||||
{ psf_log_printf (psf, "Error: FLAC stream changed from %d to %d channels\n"
|
||||
"Nothing to do but to error out.\n" ,
|
||||
psf->sf.channels, metadata->data.stream_info.channels) ;
|
||||
psf->error = SFE_FLAC_CHANNEL_COUNT_CHANGED ;
|
||||
return ;
|
||||
} ;
|
||||
|
||||
if (psf->sf.channels > 0 && psf->sf.samplerate != (int) metadata->data.stream_info.sample_rate)
|
||||
{ psf_log_printf (psf, "Warning: FLAC stream changed sample rates from %d to %d.\n"
|
||||
"Carrying on as if nothing happened.",
|
||||
psf->sf.samplerate, metadata->data.stream_info.sample_rate) ;
|
||||
} ;
|
||||
psf->sf.channels = metadata->data.stream_info.channels ;
|
||||
psf->sf.samplerate = metadata->data.stream_info.sample_rate ;
|
||||
psf->sf.frames = metadata->data.stream_info.total_samples ;
|
||||
|
@ -468,12 +487,6 @@ sf_flac_meta_callback (const FLAC__StreamDecoder * UNUSED (decoder), const FLAC_
|
|||
|
||||
if (bitwidth > 0)
|
||||
psf_log_printf (psf, " Bit width : %d\n", bitwidth) ;
|
||||
|
||||
|
||||
for (i = 0 ; i < psf->sf.channels ; i++)
|
||||
pflac->rbuffer [i] = calloc (FLAC__MAX_BLOCK_SIZE, sizeof (int32_t)) ;
|
||||
|
||||
pflac->wbuffer = (const int32_t* const*) pflac->rbuffer ;
|
||||
break ;
|
||||
|
||||
case FLAC__METADATA_TYPE_VORBIS_COMMENT :
|
||||
|
@ -835,7 +848,9 @@ flac_read_header (SF_PRIVATE *psf)
|
|||
|
||||
psf_log_printf (psf, "End\n") ;
|
||||
|
||||
if (psf->error == 0)
|
||||
if (psf->error != 0)
|
||||
FLAC__stream_decoder_delete (pflac->fsd) ;
|
||||
else
|
||||
{ FLAC__uint64 position ;
|
||||
|
||||
FLAC__stream_decoder_get_decode_position (pflac->fsd, &position) ;
|
||||
|
|
|
@ -193,7 +193,7 @@ ogg_stream_classify (SF_PRIVATE *psf, OGG_PRIVATE* odata)
|
|||
break ;
|
||||
} ;
|
||||
|
||||
psf_log_printf (psf, "This Ogg bitstream contains some uknown data type.\n") ;
|
||||
psf_log_printf (psf, "This Ogg bitstream contains some unknown data type.\n") ;
|
||||
return SFE_UNIMPLEMENTED ;
|
||||
} /* ogg_stream_classify */
|
||||
|
||||
|
|
11
src/rf64.c
11
src/rf64.c
|
@ -339,6 +339,12 @@ rf64_read_header (SF_PRIVATE *psf, int *blockalign, int *framesperblock)
|
|||
} ;
|
||||
break ;
|
||||
|
||||
case JUNK_MARKER :
|
||||
case PAD_MARKER :
|
||||
psf_log_printf (psf, "%M : %d\n", marker, chunk_size) ;
|
||||
psf_binheader_readf (psf, "j", chunk_size) ;
|
||||
break ;
|
||||
|
||||
default :
|
||||
if (chunk_size >= 0xffff0000)
|
||||
{ psf_log_printf (psf, "*** Unknown chunk marker (%X) at position %D with length %u. Exiting parser.\n", marker, psf_ftell (psf) - 8, chunk_size) ;
|
||||
|
@ -659,7 +665,7 @@ rf64_write_header (SF_PRIVATE *psf, int calc_length)
|
|||
|
||||
if (wpriv->rf64_downgrade && psf->filelength < RIFF_DOWNGRADE_BYTES)
|
||||
{ psf_binheader_writef (psf, "etm8m", RIFF_MARKER, (psf->filelength < 8) ? 8 : psf->filelength - 8, WAVE_MARKER) ;
|
||||
psf_binheader_writef (psf, "m4884", JUNK_MARKER, 20, 0, 0, 0, 0) ;
|
||||
psf_binheader_writef (psf, "m4z", JUNK_MARKER, 24, 24) ;
|
||||
add_fact_chunk = 1 ;
|
||||
}
|
||||
else
|
||||
|
@ -735,9 +741,10 @@ rf64_write_header (SF_PRIVATE *psf, int calc_length)
|
|||
|
||||
#endif
|
||||
|
||||
/* Padding may be needed if string data sizes change. */
|
||||
pad_size = psf->dataoffset - 16 - psf->header.indx ;
|
||||
if (pad_size >= 0)
|
||||
psf_binheader_writef (psf, "m4z", PAD_MARKER, pad_size, make_size_t (pad_size)) ;
|
||||
psf_binheader_writef (psf, "m4z", PAD_MARKER, (unsigned int) pad_size, make_size_t (pad_size)) ;
|
||||
|
||||
if (wpriv->rf64_downgrade && (psf->filelength < RIFF_DOWNGRADE_BYTES))
|
||||
psf_binheader_writef (psf, "tm8", data_MARKER, psf->datalength) ;
|
||||
|
|
|
@ -245,6 +245,7 @@ ErrorStruct SndfileErrors [] =
|
|||
{ SFE_FLAC_INIT_DECODER , "Error : problem with initialization of the flac decoder." },
|
||||
{ SFE_FLAC_LOST_SYNC , "Error : flac decoder lost sync." },
|
||||
{ SFE_FLAC_BAD_SAMPLE_RATE, "Error : flac does not support this sample rate." },
|
||||
{ SFE_FLAC_CHANNEL_COUNT_CHANGED, "Error : flac channel changed mid stream." },
|
||||
{ SFE_FLAC_UNKOWN_ERROR , "Error : unknown error in flac decoder." },
|
||||
|
||||
{ SFE_WVE_NOT_WVE , "Error : not a WVE file." },
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include "sfconfig.h"
|
||||
|
||||
#include <math.h>
|
||||
#include <limits.h>
|
||||
|
||||
#include "sndfile.h"
|
||||
#include "common.h"
|
||||
|
@ -827,7 +828,9 @@ s2ulaw_array (const short *ptr, int count, unsigned char *buffer)
|
|||
static inline void
|
||||
i2ulaw_array (const int *ptr, int count, unsigned char *buffer)
|
||||
{ while (--count >= 0)
|
||||
{ if (ptr [count] >= 0)
|
||||
{ if (ptr [count] == INT_MIN)
|
||||
buffer [count] = ulaw_encode [INT_MAX >> (16 + 2)] ;
|
||||
else if (ptr [count] >= 0)
|
||||
buffer [count] = ulaw_encode [ptr [count] >> (16 + 2)] ;
|
||||
else
|
||||
buffer [count] = 0x7F & ulaw_encode [-ptr [count] >> (16 + 2)] ;
|
||||
|
@ -847,7 +850,9 @@ f2ulaw_array (const float *ptr, int count, unsigned char *buffer, float normfact
|
|||
static inline void
|
||||
d2ulaw_array (const double *ptr, int count, unsigned char *buffer, double normfact)
|
||||
{ while (--count >= 0)
|
||||
{ if (ptr [count] >= 0)
|
||||
{ if (!isfinite (ptr [count]))
|
||||
buffer [count] = 0 ;
|
||||
else if (ptr [count] >= 0)
|
||||
buffer [count] = ulaw_encode [lrint (normfact * ptr [count])] ;
|
||||
else
|
||||
buffer [count] = 0x7F & ulaw_encode [- lrint (normfact * ptr [count])] ;
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
** Copyright (C) 1999-2016 Erik de Castro Lopo <erikd@mega-nerd.com>
|
||||
** Copyright (C) 1999-2019 Erik de Castro Lopo <erikd@mega-nerd.com>
|
||||
** Copyright (C) 2004-2005 David Viens <davidv@plogue.com>
|
||||
**
|
||||
** This program is free software; you can redistribute it and/or modify
|
||||
|
@ -1094,6 +1094,12 @@ wav_write_header (SF_PRIVATE *psf, int calc_length)
|
|||
psf_binheader_writef (psf, "44", 0, 0) ; /* SMTPE format */
|
||||
psf_binheader_writef (psf, "44", psf->instrument->loop_count, 0) ;
|
||||
|
||||
/* Make sure we don't read past the loops array end. */
|
||||
if (psf->instrument->loop_count > ARRAY_LEN (psf->instrument->loops))
|
||||
psf->instrument->loop_count = ARRAY_LEN (psf->instrument->loops) ;
|
||||
|
||||
/* Loop count is signed 16 bit number so we limit it range to something sensible. */
|
||||
psf->instrument->loop_count &= 0x7fff ;
|
||||
for (tmp = 0 ; tmp < psf->instrument->loop_count ; tmp++)
|
||||
{ int type ;
|
||||
|
||||
|
|
|
@ -161,7 +161,7 @@ wavlike_read_fmt_chunk (SF_PRIVATE *psf, int fmtsize)
|
|||
{ psf_log_printf (psf, " Bit Width : 24\n") ;
|
||||
|
||||
psf_log_printf (psf, "\n"
|
||||
" Ambiguous information in 'fmt ' chunk. Possibile file types:\n"
|
||||
" Ambiguous information in 'fmt ' chunk. Possible file types:\n"
|
||||
" 0) Invalid IEEE float file generated by Syntrillium's Cooledit!\n"
|
||||
" 1) File generated by ALSA's arecord containing 24 bit samples in 32 bit containers.\n"
|
||||
" 2) 24 bit file with incorrect Block Align value.\n"
|
||||
|
|
Loading…
Reference in New Issue