apply patches

This commit is contained in:
openKylinBot 2022-05-14 01:20:23 +08:00
commit cd5d347e6a
15 changed files with 74 additions and 27 deletions

View File

@ -31,7 +31,7 @@
<UL> <UL>
<LI> Compilation problems on new platforms. <LI> Compilation problems on new platforms.
<LI> Errors being detected during the `make check' process. <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> libsndfile hanging when opening a file.
<LI> Supported sound file types being incorrectly read or written. <LI> Supported sound file types being incorrectly read or written.
<LI> Omissions, errors or spelling mistakes in the documentation. <LI> Omissions, errors or spelling mistakes in the documentation.

View File

@ -317,7 +317,7 @@ main (int argc, char * argv [])
if ((sfinfo.format & SF_FORMAT_SUBMASK) == SF_FORMAT_GSM610 && sfinfo.samplerate != 8000) if ((sfinfo.format & SF_FORMAT_SUBMASK) == SF_FORMAT_GSM610 && sfinfo.samplerate != 8000)
{ printf ( { printf (
"WARNING: GSM 6.10 data format only supports 8kHz sample rate. The converted\n" "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" "but not re-sampled.\n"
) ; ) ;
} ; } ;

View File

@ -89,6 +89,13 @@ main (int argc, char **argv)
exit (1) ; 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 ; state.channels = sfinfo.channels ;
sfinfo.channels = 1 ; sfinfo.channels = 1 ;

View File

@ -1905,7 +1905,7 @@ aiff_read_chanmap (SF_PRIVATE * psf, unsigned dword)
psf_binheader_readf (psf, "j", dword - bytesread) ; psf_binheader_readf (psf, "j", dword - bytesread) ;
if (map_info->channel_map != NULL) 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) ; free (psf->channel_map) ;

View File

@ -19,6 +19,7 @@
#include "sfconfig.h" #include "sfconfig.h"
#include <math.h> #include <math.h>
#include <limits.h>
#include "sndfile.h" #include "sndfile.h"
#include "common.h" #include "common.h"
@ -326,7 +327,9 @@ s2alaw_array (const short *ptr, int count, unsigned char *buffer)
static inline void static inline void
i2alaw_array (const int *ptr, int count, unsigned char *buffer) i2alaw_array (const int *ptr, int count, unsigned char *buffer)
{ while (--count >= 0) { 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)] ; buffer [count] = alaw_encode [ptr [count] >> (16 + 4)] ;
else else
buffer [count] = 0x7F & alaw_encode [- ptr [count] >> (16 + 4)] ; 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 static inline void
d2alaw_array (const double *ptr, int count, unsigned char *buffer, double normfact) d2alaw_array (const double *ptr, int count, unsigned char *buffer, double normfact)
{ while (--count >= 0) { 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])] ; buffer [count] = alaw_encode [lrint (normfact * ptr [count])] ;
else else
buffer [count] = 0x7F & alaw_encode [- lrint (normfact * ptr [count])] ; buffer [count] = 0x7F & alaw_encode [- lrint (normfact * ptr [count])] ;

View File

@ -675,15 +675,15 @@ psf_binheader_writef (SF_PRIVATE *psf, const char *format, ...)
/* Write a C string (guaranteed to have a zero terminator). */ /* Write a C string (guaranteed to have a zero terminator). */
strptr = va_arg (argptr, char *) ; strptr = va_arg (argptr, char *) ;
size = strlen (strptr) + 1 ; 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 ; return count ;
if (psf->rwf_endian == SF_ENDIAN_BIG) if (psf->rwf_endian == SF_ENDIAN_BIG)
header_put_be_int (psf, size) ; header_put_be_int (psf, size + (size & 1)) ;
else 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) ; memcpy (&(psf->header.ptr [psf->header.indx]), strptr, size) ;
psf->header.indx += size ; psf->header.indx += size ;
psf->header.ptr [psf->header.indx - 1] = 0 ; psf->header.ptr [psf->header.indx - 1] = 0 ;

View File

@ -725,6 +725,7 @@ enum
SFE_FLAC_INIT_DECODER, SFE_FLAC_INIT_DECODER,
SFE_FLAC_LOST_SYNC, SFE_FLAC_LOST_SYNC,
SFE_FLAC_BAD_SAMPLE_RATE, SFE_FLAC_BAD_SAMPLE_RATE,
SFE_FLAC_CHANNEL_COUNT_CHANGED,
SFE_FLAC_UNKOWN_ERROR, SFE_FLAC_UNKOWN_ERROR,
SFE_WVE_NOT_WVE, SFE_WVE_NOT_WVE,

View File

@ -91,7 +91,7 @@ int
double64_init (SF_PRIVATE *psf) double64_init (SF_PRIVATE *psf)
{ static int double64_caps ; { 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) ; { psf_log_printf (psf, "double64_init : internal error : channels = %d\n", psf->sf.channels) ;
return SFE_INTERNAL ; return SFE_INTERNAL ;
} ; } ;

View File

@ -169,6 +169,14 @@ flac_buffer_copy (SF_PRIVATE *psf)
const int32_t* const *buffer = pflac->wbuffer ; const int32_t* const *buffer = pflac->wbuffer ;
unsigned i = 0, j, offset, channels, len ; 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 ** frame->header.blocksize is variable and we're using a constant blocksize
** of FLAC__MAX_BLOCK_SIZE. ** of FLAC__MAX_BLOCK_SIZE.
@ -202,7 +210,6 @@ flac_buffer_copy (SF_PRIVATE *psf)
return 0 ; return 0 ;
} ; } ;
len = SF_MIN (pflac->len, frame->header.blocksize) ; len = SF_MIN (pflac->len, frame->header.blocksize) ;
if (pflac->remain % channels != 0) if (pflac->remain % channels != 0)
@ -430,11 +437,23 @@ sf_flac_meta_get_vorbiscomments (SF_PRIVATE *psf, const FLAC__StreamMetadata *me
static void static void
sf_flac_meta_callback (const FLAC__StreamDecoder * UNUSED (decoder), const FLAC__StreamMetadata *metadata, void *client_data) sf_flac_meta_callback (const FLAC__StreamDecoder * UNUSED (decoder), const FLAC__StreamMetadata *metadata, void *client_data)
{ SF_PRIVATE *psf = (SF_PRIVATE*) client_data ; { SF_PRIVATE *psf = (SF_PRIVATE*) client_data ;
FLAC_PRIVATE* pflac = (FLAC_PRIVATE*) psf->codec_data ; int bitwidth = 0 ;
int bitwidth = 0, i ;
switch (metadata->type) switch (metadata->type)
{ case FLAC__METADATA_TYPE_STREAMINFO : { 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.channels = metadata->data.stream_info.channels ;
psf->sf.samplerate = metadata->data.stream_info.sample_rate ; psf->sf.samplerate = metadata->data.stream_info.sample_rate ;
psf->sf.frames = metadata->data.stream_info.total_samples ; 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) if (bitwidth > 0)
psf_log_printf (psf, " Bit width : %d\n", bitwidth) ; 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 ; break ;
case FLAC__METADATA_TYPE_VORBIS_COMMENT : case FLAC__METADATA_TYPE_VORBIS_COMMENT :
@ -835,7 +848,9 @@ flac_read_header (SF_PRIVATE *psf)
psf_log_printf (psf, "End\n") ; 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__uint64 position ;
FLAC__stream_decoder_get_decode_position (pflac->fsd, &position) ; FLAC__stream_decoder_get_decode_position (pflac->fsd, &position) ;

View File

@ -193,7 +193,7 @@ ogg_stream_classify (SF_PRIVATE *psf, OGG_PRIVATE* odata)
break ; 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 ; return SFE_UNIMPLEMENTED ;
} /* ogg_stream_classify */ } /* ogg_stream_classify */

View File

@ -339,6 +339,12 @@ rf64_read_header (SF_PRIVATE *psf, int *blockalign, int *framesperblock)
} ; } ;
break ; 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 : default :
if (chunk_size >= 0xffff0000) 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) ; { 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) 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, "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 ; add_fact_chunk = 1 ;
} }
else else
@ -735,9 +741,10 @@ rf64_write_header (SF_PRIVATE *psf, int calc_length)
#endif #endif
/* Padding may be needed if string data sizes change. */
pad_size = psf->dataoffset - 16 - psf->header.indx ; pad_size = psf->dataoffset - 16 - psf->header.indx ;
if (pad_size >= 0) 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)) if (wpriv->rf64_downgrade && (psf->filelength < RIFF_DOWNGRADE_BYTES))
psf_binheader_writef (psf, "tm8", data_MARKER, psf->datalength) ; psf_binheader_writef (psf, "tm8", data_MARKER, psf->datalength) ;

View File

@ -245,6 +245,7 @@ ErrorStruct SndfileErrors [] =
{ SFE_FLAC_INIT_DECODER , "Error : problem with initialization of the flac decoder." }, { SFE_FLAC_INIT_DECODER , "Error : problem with initialization of the flac decoder." },
{ SFE_FLAC_LOST_SYNC , "Error : flac decoder lost sync." }, { SFE_FLAC_LOST_SYNC , "Error : flac decoder lost sync." },
{ SFE_FLAC_BAD_SAMPLE_RATE, "Error : flac does not support this sample rate." }, { 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_FLAC_UNKOWN_ERROR , "Error : unknown error in flac decoder." },
{ SFE_WVE_NOT_WVE , "Error : not a WVE file." }, { SFE_WVE_NOT_WVE , "Error : not a WVE file." },

View File

@ -19,6 +19,7 @@
#include "sfconfig.h" #include "sfconfig.h"
#include <math.h> #include <math.h>
#include <limits.h>
#include "sndfile.h" #include "sndfile.h"
#include "common.h" #include "common.h"
@ -827,7 +828,9 @@ s2ulaw_array (const short *ptr, int count, unsigned char *buffer)
static inline void static inline void
i2ulaw_array (const int *ptr, int count, unsigned char *buffer) i2ulaw_array (const int *ptr, int count, unsigned char *buffer)
{ while (--count >= 0) { 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)] ; buffer [count] = ulaw_encode [ptr [count] >> (16 + 2)] ;
else else
buffer [count] = 0x7F & ulaw_encode [-ptr [count] >> (16 + 2)] ; 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 static inline void
d2ulaw_array (const double *ptr, int count, unsigned char *buffer, double normfact) d2ulaw_array (const double *ptr, int count, unsigned char *buffer, double normfact)
{ while (--count >= 0) { 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])] ; buffer [count] = ulaw_encode [lrint (normfact * ptr [count])] ;
else else
buffer [count] = 0x7F & ulaw_encode [- lrint (normfact * ptr [count])] ; buffer [count] = 0x7F & ulaw_encode [- lrint (normfact * ptr [count])] ;

View File

@ -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> ** Copyright (C) 2004-2005 David Viens <davidv@plogue.com>
** **
** This program is free software; you can redistribute it and/or modify ** 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", 0, 0) ; /* SMTPE format */
psf_binheader_writef (psf, "44", psf->instrument->loop_count, 0) ; 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++) for (tmp = 0 ; tmp < psf->instrument->loop_count ; tmp++)
{ int type ; { int type ;

View File

@ -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, " Bit Width : 24\n") ;
psf_log_printf (psf, "\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" " 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" " 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" " 2) 24 bit file with incorrect Block Align value.\n"