91 lines
2.9 KiB
Text
91 lines
2.9 KiB
Text
https://marc.info/?l=oss-security&m=167571683504082&w=2
|
|
|
|
unbreak wav gsm
|
|
see:
|
|
https://marc.info/?l=oss-security&m=167882517702862&w=2
|
|
https://marc.info/?l=oss-security&m=168026419507884&w=2
|
|
|
|
Index: src/wav.c
|
|
--- src/wav.c.orig
|
|
+++ src/wav.c
|
|
@@ -654,6 +654,15 @@ static int wav_read_fmt(sox_format_t *ft, uint32_t len
|
|
if (err)
|
|
return SOX_EOF;
|
|
|
|
+ if (wav->bitsPerSample == 0
|
|
+#ifdef HAVE_LIBGSM
|
|
+ && wav->formatTag != WAVE_FORMAT_GSM610
|
|
+#endif
|
|
+ ){
|
|
+ lsx_fail_errno(ft, SOX_EHDR, "WAV file bits per sample is zero");
|
|
+ return SOX_EOF;
|
|
+ }
|
|
+
|
|
/* non-PCM formats except alaw and mulaw formats have extended fmt chunk.
|
|
* Check for those cases.
|
|
*/
|
|
@@ -963,7 +972,11 @@ static int startread(sox_format_t *ft)
|
|
#endif
|
|
}
|
|
|
|
- if (!wav->numSamples)
|
|
+ if (!wav->numSamples
|
|
+#ifdef HAVE_LIBGSM
|
|
+ && wav->formatTag != WAVE_FORMAT_GSM610
|
|
+#endif
|
|
+ )
|
|
wav->numSamples = div_bits(qwDataLength, ft->encoding.bits_per_sample)
|
|
/ ft->signal.channels;
|
|
|
|
@@ -1348,8 +1361,10 @@ static int wavwritehdr(sox_format_t * ft, int second_h
|
|
(dwSamplesWritten + wSamplesPerBlock - 1) / wSamplesPerBlock;
|
|
dwDataLength = blocksWritten * wBlockAlign;
|
|
|
|
+#ifdef HAVE_LIBGSM
|
|
if (wFormatTag == WAVE_FORMAT_GSM610)
|
|
dwDataLength = (dwDataLength+1) & ~1u; /* round up to even */
|
|
+#endif
|
|
|
|
if (wFormatTag == WAVE_FORMAT_PCM && (wBitsPerSample > 16 || wChannels > 2)
|
|
&& strcmp(ft->filetype, "wavpcm")) {
|
|
@@ -1444,9 +1459,11 @@ static int wavwritehdr(sox_format_t * ft, int second_h
|
|
lsx_writew(ft, (uint16_t)(lsx_ms_adpcm_i_coef[i][1]));
|
|
}
|
|
break;
|
|
+#ifdef HAVE_LIBGSM
|
|
case WAVE_FORMAT_GSM610:
|
|
lsx_writew(ft, wSamplesPerBlock);
|
|
break;
|
|
+#endif
|
|
default:
|
|
break;
|
|
}
|
|
@@ -1554,7 +1571,9 @@ static int stopwrite(sox_format_t * ft)
|
|
|
|
/* Add a pad byte if the number of data bytes is odd.
|
|
See wavwritehdr() above for the calculation. */
|
|
+#ifdef HAVE_LIBGSM
|
|
if (wav->formatTag != WAVE_FORMAT_GSM610)
|
|
+#endif
|
|
lsx_padbytes(ft, (size_t)((wav->numSamples + wav->samplesPerBlock - 1)/wav->samplesPerBlock*wav->blockAlign) % 2);
|
|
|
|
free(wav->packet);
|
|
@@ -1594,6 +1613,7 @@ static int seek(sox_format_t * ft, uint64_t offset)
|
|
|
|
if (ft->encoding.bits_per_sample & 7)
|
|
lsx_fail_errno(ft, SOX_ENOTSUP, "seeking not supported with this encoding");
|
|
+#ifdef HAVE_LIBGSM
|
|
else if (wav->formatTag == WAVE_FORMAT_GSM610) {
|
|
int alignment;
|
|
size_t gsmoff;
|
|
@@ -1613,7 +1633,9 @@ static int seek(sox_format_t * ft, uint64_t offset)
|
|
new_offset += (wav->samplesPerBlock - alignment);
|
|
wav->numSamples = ft->signal.length - (new_offset / ft->signal.channels);
|
|
}
|
|
- } else {
|
|
+ }
|
|
+#endif /* HAVE_LIBGSM */
|
|
+ else {
|
|
double wide_sample = offset - (offset % ft->signal.channels);
|
|
double to_d = wide_sample * ft->encoding.bits_per_sample / 8;
|
|
off_t to = to_d;
|