Takashi Iwai
c349a7f6d8
- Backport upstream fixes: buffer overflow fixes in aplay, segfault in aplaymidi, etc: 0008-topology-include-locale.h.patch 0009-nhlt-dmic-info.c-include-sys-types.h.patch 0010-topology-pre-processor-Add-support-for-enum-controls.patch 0011-configure.ac-fix-UMP-support-detection.patch 0012-bat-really-skip-analysis-of-the-first-period-and-upd.patch 0013-topology-add-include-for-ENABLE_NLS-on-musl.patch 0014-nhlt-use-stdint.h-types.patch 0015-Revert-nhlt-dmic-info.c-include-sys-types.h.patch 0016-aplay-use-stdint.h-types-instead-u_int-u_short-u_cha.patch 0017-alsa-restore.rules-use-devnode-instead-number-atribu.patch 0018-nhlt-Revert-SSP_ANALOG-device_type-field.patch 0019-alsactl-fix-potential-buffer-overwrite.patch 0020-aplay-fix-buffer-overflow-and-tainted-format-string.patch 0021-misc-fix-incorrect-usages-of-strerror.patch 0022-aplay-Add-option-for-specifying-subformat.patch 0023-aplay-allow-to-compile-with-older-alsa-lib-subformat.patch 0024-aplay-log-pcm-status-before-reporting-a-fatal-error.patch 0025-aplay-enable-timestamps-by-default.patch 0026-aplay-status-dumps-are-called-only-in-verbose-mode.patch 0027-aplaymidi-Set-event-completely-for-tempo-event.patch OBS-URL: https://build.opensuse.org/request/show/1137523 OBS-URL: https://build.opensuse.org/package/show/multimedia:libs/alsa-utils?expand=0&rev=210
452 lines
14 KiB
Diff
452 lines
14 KiB
Diff
From 37447085c6fc975d191ecb508931a67bce79233d Mon Sep 17 00:00:00 2001
|
|
From: Jaroslav Kysela <perex@perex.cz>
|
|
Date: Tue, 17 Oct 2023 13:44:03 +0200
|
|
Subject: [PATCH] aplay: use stdint.h types instead u_int/u_short/u_char
|
|
|
|
Closes: https://github.com/alsa-project/alsa-utils/pull/234
|
|
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
|
|
---
|
|
aplay/aplay.c | 92 ++++++++++++++++++++++++-------------------------
|
|
aplay/formats.h | 70 ++++++++++++++++++-------------------
|
|
2 files changed, 81 insertions(+), 81 deletions(-)
|
|
|
|
diff --git a/aplay/aplay.c b/aplay/aplay.c
|
|
index f180d42b5516..9cf36dee2d9d 100644
|
|
--- a/aplay/aplay.c
|
|
+++ b/aplay/aplay.c
|
|
@@ -29,6 +29,7 @@
|
|
#define _GNU_SOURCE
|
|
#include "aconfig.h"
|
|
#include <stdio.h>
|
|
+#include <stdint.h>
|
|
#if HAVE_MALLOC_H
|
|
#include <malloc.h>
|
|
#endif
|
|
@@ -50,7 +51,6 @@
|
|
#include <sys/uio.h>
|
|
#include <sys/time.h>
|
|
#include <sys/stat.h>
|
|
-#include <sys/types.h>
|
|
#include <endian.h>
|
|
#include "gettext.h"
|
|
#include "formats.h"
|
|
@@ -114,7 +114,7 @@ static int mmap_flag = 0;
|
|
static int interleaved = 1;
|
|
static int nonblock = 0;
|
|
static volatile sig_atomic_t in_aborting = 0;
|
|
-static u_char *audiobuf = NULL;
|
|
+static uint8_t *audiobuf = NULL;
|
|
static snd_pcm_uframes_t chunk_size = 0;
|
|
static unsigned period_time = 0;
|
|
static unsigned buffer_time = 0;
|
|
@@ -859,7 +859,7 @@ int main(int argc, char *argv[])
|
|
chunk_size = 1024;
|
|
hwparams = rhwparams;
|
|
|
|
- audiobuf = (u_char *)malloc(1024);
|
|
+ audiobuf = (uint8_t *)malloc(1024);
|
|
if (audiobuf == NULL) {
|
|
error(_("not enough memory"));
|
|
return 1;
|
|
@@ -970,7 +970,7 @@ static int test_vocfile(void *buffer)
|
|
* helper for test_wavefile
|
|
*/
|
|
|
|
-static size_t test_wavefile_read(int fd, u_char *buffer, size_t *size, size_t reqsize, int line)
|
|
+static size_t test_wavefile_read(int fd, uint8_t *buffer, size_t *size, size_t reqsize, int line)
|
|
{
|
|
if (*size >= reqsize)
|
|
return *size;
|
|
@@ -995,17 +995,17 @@ static size_t test_wavefile_read(int fd, u_char *buffer, size_t *size, size_t re
|
|
* == 0 if not
|
|
* Value returned is bytes to be discarded.
|
|
*/
|
|
-static ssize_t test_wavefile(int fd, u_char *_buffer, size_t size)
|
|
+static ssize_t test_wavefile(int fd, uint8_t *_buffer, size_t size)
|
|
{
|
|
WaveHeader *h = (WaveHeader *)_buffer;
|
|
- u_char *buffer = NULL;
|
|
+ uint8_t *buffer = NULL;
|
|
size_t blimit = 0;
|
|
WaveFmtBody *f;
|
|
WaveChunkHeader *c;
|
|
- u_int type, len;
|
|
+ uint32_t type, len;
|
|
unsigned short format, channels;
|
|
int big_endian, native_format;
|
|
- u_char vbps = 0;
|
|
+ uint8_t vbps = 0;
|
|
|
|
if (size < sizeof(WaveHeader))
|
|
return -1;
|
|
@@ -1044,7 +1044,7 @@ static ssize_t test_wavefile(int fd, u_char *_buffer, size_t size)
|
|
|
|
if (len < sizeof(WaveFmtBody)) {
|
|
error(_("unknown length of 'fmt ' chunk (read %u, should be %u at least)"),
|
|
- len, (u_int)sizeof(WaveFmtBody));
|
|
+ len, (uint32_t)sizeof(WaveFmtBody));
|
|
prg_exit(EXIT_FAILURE);
|
|
}
|
|
check_wavefile_space(buffer, len, blimit);
|
|
@@ -1055,7 +1055,7 @@ static ssize_t test_wavefile(int fd, u_char *_buffer, size_t size)
|
|
WaveFmtExtensibleBody *fe = (WaveFmtExtensibleBody*)buffer;
|
|
if (len < sizeof(WaveFmtExtensibleBody)) {
|
|
error(_("unknown length of extensible 'fmt ' chunk (read %u, should be %u at least)"),
|
|
- len, (u_int)sizeof(WaveFmtExtensibleBody));
|
|
+ len, (unsigned int)sizeof(WaveFmtExtensibleBody));
|
|
prg_exit(EXIT_FAILURE);
|
|
}
|
|
if (memcmp(fe->guid_tag, WAV_GUID_TAG, 14) != 0) {
|
|
@@ -1167,7 +1167,7 @@ static ssize_t test_wavefile(int fd, u_char *_buffer, size_t size)
|
|
size -= len;
|
|
|
|
while (1) {
|
|
- u_int type, len;
|
|
+ uint32_t type, len;
|
|
|
|
check_wavefile_space(buffer, sizeof(WaveChunkHeader), blimit);
|
|
test_wavefile_read(fd, buffer, &size, sizeof(WaveChunkHeader), __LINE__);
|
|
@@ -1809,7 +1809,7 @@ static void print_vu_meter(signed int *perc, signed int *maxperc)
|
|
}
|
|
|
|
/* peak handler */
|
|
-static void compute_max_peak(u_char *data, size_t samples)
|
|
+static void compute_max_peak(uint8_t *data, size_t samples)
|
|
{
|
|
signed int val, max, perc[2], max_peak[2];
|
|
static int run = 0;
|
|
@@ -2054,9 +2054,9 @@ static void do_test_position(void)
|
|
/*
|
|
*/
|
|
#ifdef CONFIG_SUPPORT_CHMAP
|
|
-static u_char *remap_data(u_char *data, size_t count)
|
|
+static uint8_t *remap_data(uint8_t *data, size_t count)
|
|
{
|
|
- static u_char *tmp, *src, *dst;
|
|
+ static uint8_t *tmp, *src, *dst;
|
|
static size_t tmp_size;
|
|
size_t sample_bytes = bits_per_sample / 8;
|
|
size_t step = bits_per_frame / 8;
|
|
@@ -2090,9 +2090,9 @@ static u_char *remap_data(u_char *data, size_t count)
|
|
return tmp;
|
|
}
|
|
|
|
-static u_char **remap_datav(u_char **data, size_t count ATTRIBUTE_UNUSED)
|
|
+static uint8_t **remap_datav(uint8_t **data, size_t count ATTRIBUTE_UNUSED)
|
|
{
|
|
- static u_char **tmp;
|
|
+ static uint8_t **tmp;
|
|
unsigned int ch;
|
|
|
|
if (!hw_map)
|
|
@@ -2118,7 +2118,7 @@ static u_char **remap_datav(u_char **data, size_t count ATTRIBUTE_UNUSED)
|
|
* write function
|
|
*/
|
|
|
|
-static ssize_t pcm_write(u_char *data, size_t count)
|
|
+static ssize_t pcm_write(uint8_t *data, size_t count)
|
|
{
|
|
ssize_t r;
|
|
ssize_t result = 0;
|
|
@@ -2157,7 +2157,7 @@ static ssize_t pcm_write(u_char *data, size_t count)
|
|
return result;
|
|
}
|
|
|
|
-static ssize_t pcm_writev(u_char **data, unsigned int channels, size_t count)
|
|
+static ssize_t pcm_writev(uint8_t **data, unsigned int channels, size_t count)
|
|
{
|
|
ssize_t r;
|
|
size_t result = 0;
|
|
@@ -2210,7 +2210,7 @@ static ssize_t pcm_writev(u_char **data, unsigned int channels, size_t count)
|
|
* read function
|
|
*/
|
|
|
|
-static ssize_t pcm_read(u_char *data, size_t rcount)
|
|
+static ssize_t pcm_read(uint8_t *data, size_t rcount)
|
|
{
|
|
ssize_t r;
|
|
size_t result = 0;
|
|
@@ -2252,7 +2252,7 @@ abort:
|
|
return result > rcount ? rcount : result;
|
|
}
|
|
|
|
-static ssize_t pcm_readv(u_char **data, unsigned int channels, size_t rcount)
|
|
+static ssize_t pcm_readv(uint8_t **data, unsigned int channels, size_t rcount)
|
|
{
|
|
ssize_t r;
|
|
size_t result = 0;
|
|
@@ -2304,7 +2304,7 @@ abort:
|
|
* ok, let's play a .voc file
|
|
*/
|
|
|
|
-static ssize_t voc_pcm_write(u_char *data, size_t count)
|
|
+static ssize_t voc_pcm_write(uint8_t *data, size_t count)
|
|
{
|
|
ssize_t result = count, r;
|
|
size_t size;
|
|
@@ -2329,9 +2329,9 @@ static ssize_t voc_pcm_write(u_char *data, size_t count)
|
|
static void voc_write_silence(unsigned x)
|
|
{
|
|
unsigned l;
|
|
- u_char *buf;
|
|
+ uint8_t *buf;
|
|
|
|
- buf = (u_char *) malloc(chunk_bytes);
|
|
+ buf = (uint8_t *) malloc(chunk_bytes);
|
|
if (buf == NULL) {
|
|
error(_("can't allocate buffer for silence"));
|
|
return; /* not fatal error */
|
|
@@ -2372,15 +2372,15 @@ static void voc_play(int fd, int ofs, char *name)
|
|
VocVoiceData *vd;
|
|
VocExtBlock *eb;
|
|
size_t nextblock, in_buffer;
|
|
- u_char *data, *buf;
|
|
+ uint8_t *data, *buf;
|
|
char was_extended = 0, output = 0;
|
|
- u_short *sp, repeat = 0;
|
|
+ uint16_t *sp, repeat = 0;
|
|
off_t filepos = 0;
|
|
|
|
#define COUNT(x) nextblock -= x; in_buffer -= x; data += x
|
|
#define COUNT1(x) in_buffer -= x; data += x
|
|
|
|
- data = buf = (u_char *)malloc(64 * 1024);
|
|
+ data = buf = (uint8_t *)malloc(64 * 1024);
|
|
buffer_pos = 0;
|
|
if (data == NULL) {
|
|
error(_("malloc error"));
|
|
@@ -2472,8 +2472,8 @@ static void voc_play(int fd, int ofs, char *name)
|
|
#endif
|
|
break;
|
|
case 3: /* a silence block, no data, only a count */
|
|
- sp = (u_short *) data;
|
|
- COUNT1(sizeof(u_short));
|
|
+ sp = (uint16_t *) data;
|
|
+ COUNT1(sizeof(uint16_t));
|
|
hwparams.rate = (int) (*data);
|
|
COUNT1(1);
|
|
hwparams.rate = 1000000 / (256 - hwparams.rate);
|
|
@@ -2488,8 +2488,8 @@ static void voc_play(int fd, int ofs, char *name)
|
|
voc_write_silence(*sp);
|
|
break;
|
|
case 4: /* a marker for syncronisation, no effect */
|
|
- sp = (u_short *) data;
|
|
- COUNT1(sizeof(u_short));
|
|
+ sp = (uint16_t *) data;
|
|
+ COUNT1(sizeof(uint16_t));
|
|
#if 0
|
|
d_printf("Marker %d\n", *sp);
|
|
#endif
|
|
@@ -2503,8 +2503,8 @@ static void voc_play(int fd, int ofs, char *name)
|
|
case 6: /* repeat marker, says repeatcount */
|
|
/* my specs don't say it: maybe this can be recursive, but
|
|
I don't think somebody use it */
|
|
- repeat = *(u_short *) data;
|
|
- COUNT1(sizeof(u_short));
|
|
+ repeat = *(uint16_t *) data;
|
|
+ COUNT1(sizeof(uint16_t));
|
|
#if 0
|
|
d_printf("Repeat loop %d times\n", repeat);
|
|
#endif
|
|
@@ -2649,14 +2649,14 @@ static void begin_voc(int fd, size_t cnt)
|
|
}
|
|
bt.type = 1;
|
|
cnt += sizeof(VocVoiceData); /* Channel_data block follows */
|
|
- bt.datalen = (u_char) (cnt & 0xFF);
|
|
- bt.datalen_m = (u_char) ((cnt & 0xFF00) >> 8);
|
|
- bt.datalen_h = (u_char) ((cnt & 0xFF0000) >> 16);
|
|
+ bt.datalen = (uint8_t) (cnt & 0xFF);
|
|
+ bt.datalen_m = (uint8_t) ((cnt & 0xFF00) >> 8);
|
|
+ bt.datalen_h = (uint8_t) ((cnt & 0xFF0000) >> 16);
|
|
if (xwrite(fd, &bt, sizeof(VocBlockType)) != sizeof(VocBlockType)) {
|
|
error(_("write error"));
|
|
prg_exit(EXIT_FAILURE);
|
|
}
|
|
- vd.tc = (u_char) (256 - (1000000 / hwparams.rate));
|
|
+ vd.tc = (uint8_t) (256 - (1000000 / hwparams.rate));
|
|
vd.pack = 0;
|
|
if (xwrite(fd, &vd, sizeof(VocVoiceData)) != sizeof(VocVoiceData)) {
|
|
error(_("write error"));
|
|
@@ -2671,8 +2671,8 @@ static void begin_wave(int fd, size_t cnt)
|
|
WaveFmtBody f;
|
|
WaveChunkHeader cf, cd;
|
|
int bits;
|
|
- u_int tmp;
|
|
- u_short tmp2;
|
|
+ uint32_t tmp;
|
|
+ uint16_t tmp2;
|
|
|
|
/* WAVE cannot handle greater than 32bit (signed?) int */
|
|
if (cnt == (size_t)-2)
|
|
@@ -2715,11 +2715,11 @@ static void begin_wave(int fd, size_t cnt)
|
|
#if 0
|
|
tmp2 = (samplesize == 8) ? 1 : 2;
|
|
f.byte_p_spl = LE_SHORT(tmp2);
|
|
- tmp = dsp_speed * hwparams.channels * (u_int) tmp2;
|
|
+ tmp = dsp_speed * hwparams.channels * (uint32_t) tmp2;
|
|
#else
|
|
tmp2 = hwparams.channels * snd_pcm_format_physical_width(hwparams.format) / 8;
|
|
f.byte_p_spl = LE_SHORT(tmp2);
|
|
- tmp = (u_int) tmp2 * hwparams.rate;
|
|
+ tmp = (uint32_t) tmp2 * hwparams.rate;
|
|
#endif
|
|
f.byte_p_sec = LE_INT(tmp);
|
|
f.bit_p_spl = LE_SHORT(bits);
|
|
@@ -2786,9 +2786,9 @@ static void end_voc(int fd)
|
|
cnt += sizeof(VocVoiceData); /* Channel_data block follows */
|
|
if (cnt > 0x00ffffff)
|
|
cnt = 0x00ffffff;
|
|
- bt.datalen = (u_char) (cnt & 0xFF);
|
|
- bt.datalen_m = (u_char) ((cnt & 0xFF00) >> 8);
|
|
- bt.datalen_h = (u_char) ((cnt & 0xFF0000) >> 16);
|
|
+ bt.datalen = (uint8_t) (cnt & 0xFF);
|
|
+ bt.datalen_m = (uint8_t) ((cnt & 0xFF00) >> 8);
|
|
+ bt.datalen_h = (uint8_t) ((cnt & 0xFF0000) >> 16);
|
|
if (lseek(fd, length_seek, SEEK_SET) == length_seek)
|
|
xwrite(fd, &bt, sizeof(VocBlockType));
|
|
}
|
|
@@ -2798,7 +2798,7 @@ static void end_wave(int fd)
|
|
WaveChunkHeader cd;
|
|
off_t length_seek;
|
|
off_t filelen;
|
|
- u_int rifflen;
|
|
+ uint32_t rifflen;
|
|
|
|
length_seek = sizeof(WaveHeader) +
|
|
sizeof(WaveChunkHeader) +
|
|
@@ -3339,7 +3339,7 @@ static void playbackv_go(int* fds, unsigned int channels, size_t loaded, off_t c
|
|
size_t vsize;
|
|
|
|
unsigned int channel;
|
|
- u_char *bufs[channels];
|
|
+ uint8_t *bufs[channels];
|
|
|
|
header(rtype, names[0]);
|
|
set_params();
|
|
@@ -3393,7 +3393,7 @@ static void capturev_go(int* fds, unsigned int channels, off_t count, int rtype,
|
|
ssize_t r;
|
|
unsigned int channel;
|
|
size_t vsize;
|
|
- u_char *bufs[channels];
|
|
+ uint8_t *bufs[channels];
|
|
|
|
header(rtype, names[0]);
|
|
set_params();
|
|
diff --git a/aplay/formats.h b/aplay/formats.h
|
|
index 093ab809382e..d82505e4626f 100644
|
|
--- a/aplay/formats.h
|
|
+++ b/aplay/formats.h
|
|
@@ -17,28 +17,28 @@
|
|
((u_long)(bp->datalen_h) << 16) )
|
|
|
|
typedef struct voc_header {
|
|
- u_char magic[20]; /* must be MAGIC_STRING */
|
|
- u_short headerlen; /* Headerlength, should be 0x1A */
|
|
- u_short version; /* VOC-file version */
|
|
- u_short coded_ver; /* 0x1233-version */
|
|
+ uint8_t magic[20]; /* must be MAGIC_STRING */
|
|
+ uint16_t headerlen; /* Headerlength, should be 0x1A */
|
|
+ uint16_t version; /* VOC-file version */
|
|
+ uint16_t coded_ver; /* 0x1233-version */
|
|
} VocHeader;
|
|
|
|
typedef struct voc_blocktype {
|
|
- u_char type;
|
|
- u_char datalen; /* low-byte */
|
|
- u_char datalen_m; /* medium-byte */
|
|
- u_char datalen_h; /* high-byte */
|
|
+ uint8_t type;
|
|
+ uint8_t datalen; /* low-byte */
|
|
+ uint8_t datalen_m; /* medium-byte */
|
|
+ uint8_t datalen_h; /* high-byte */
|
|
} VocBlockType;
|
|
|
|
typedef struct voc_voice_data {
|
|
- u_char tc;
|
|
- u_char pack;
|
|
+ uint8_t tc;
|
|
+ uint8_t pack;
|
|
} VocVoiceData;
|
|
|
|
typedef struct voc_ext_block {
|
|
- u_short tc;
|
|
- u_char pack;
|
|
- u_char mode;
|
|
+ uint16_t tc;
|
|
+ uint8_t pack;
|
|
+ uint8_t mode;
|
|
} VocExtBlock;
|
|
|
|
/* Definitions for Microsoft WAVE format */
|
|
@@ -85,32 +85,32 @@ typedef struct voc_ext_block {
|
|
it works on all WAVE-file I have
|
|
*/
|
|
typedef struct {
|
|
- u_int magic; /* 'RIFF' */
|
|
- u_int length; /* filelen */
|
|
- u_int type; /* 'WAVE' */
|
|
+ uint32_t magic; /* 'RIFF' */
|
|
+ uint32_t length; /* filelen */
|
|
+ uint32_t type; /* 'WAVE' */
|
|
} WaveHeader;
|
|
|
|
typedef struct {
|
|
- u_short format; /* see WAV_FMT_* */
|
|
- u_short channels;
|
|
- u_int sample_fq; /* frequence of sample */
|
|
- u_int byte_p_sec;
|
|
- u_short byte_p_spl; /* samplesize; 1 or 2 bytes */
|
|
- u_short bit_p_spl; /* 8, 12 or 16 bit */
|
|
+ uint16_t format; /* see WAV_FMT_* */
|
|
+ uint16_t channels;
|
|
+ uint32_t sample_fq; /* frequence of sample */
|
|
+ uint32_t byte_p_sec;
|
|
+ uint16_t byte_p_spl; /* samplesize; 1 or 2 bytes */
|
|
+ uint16_t bit_p_spl; /* 8, 12 or 16 bit */
|
|
} WaveFmtBody;
|
|
|
|
typedef struct {
|
|
WaveFmtBody format;
|
|
- u_short ext_size;
|
|
- u_short bit_p_spl;
|
|
- u_int channel_mask;
|
|
- u_short guid_format; /* WAV_FMT_* */
|
|
- u_char guid_tag[14]; /* WAV_GUID_TAG */
|
|
+ uint16_t ext_size;
|
|
+ uint16_t bit_p_spl;
|
|
+ uint32_t channel_mask;
|
|
+ uint16_t guid_format; /* WAV_FMT_* */
|
|
+ uint8_t guid_tag[14]; /* WAV_GUID_TAG */
|
|
} WaveFmtExtensibleBody;
|
|
|
|
typedef struct {
|
|
- u_int type; /* 'data' */
|
|
- u_int length; /* samplecount */
|
|
+ uint32_t type; /* 'data' */
|
|
+ uint32_t length; /* samplecount */
|
|
} WaveChunkHeader;
|
|
|
|
/* Definitions for Sparc .au header */
|
|
@@ -122,12 +122,12 @@ typedef struct {
|
|
#define AU_FMT_LIN16 3
|
|
|
|
typedef struct au_header {
|
|
- u_int magic; /* '.snd' */
|
|
- u_int hdr_size; /* size of header (min 24) */
|
|
- u_int data_size; /* size of data */
|
|
- u_int encoding; /* see to AU_FMT_XXXX */
|
|
- u_int sample_rate; /* sample rate */
|
|
- u_int channels; /* number of channels (voices) */
|
|
+ uint32_t magic; /* '.snd' */
|
|
+ uint32_t hdr_size; /* size of header (min 24) */
|
|
+ uint32_t data_size; /* size of data */
|
|
+ uint32_t encoding; /* see to AU_FMT_XXXX */
|
|
+ uint32_t sample_rate; /* sample rate */
|
|
+ uint32_t channels; /* number of channels (voices) */
|
|
} AuHeader;
|
|
|
|
#endif /* FORMATS */
|
|
--
|
|
2.35.3
|
|
|