Commit 9f441f25 authored by Eric Wong's avatar Eric Wong Committed by Max Kellermann

oss: avoid heap allocations when configuring mixer

Noticed-by: Courtney Cavin
parent d095d52e
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#ifdef HAVE_ALSA #ifdef HAVE_ALSA
#include <alsa/asoundlib.h> #include <alsa/asoundlib.h>
#endif #endif
#include <alloca.h>
#define VOLUME_MIXER_TYPE_SOFTWARE 0 #define VOLUME_MIXER_TYPE_SOFTWARE 0
#define VOLUME_MIXER_TYPE_OSS 1 #define VOLUME_MIXER_TYPE_OSS 1
...@@ -75,6 +76,8 @@ static int volume_alsaSet = -1; ...@@ -75,6 +76,8 @@ static int volume_alsaSet = -1;
#ifdef HAVE_OSS #ifdef HAVE_OSS
#include <alloca.h> /* only alloca user in mpd atm, may change ... */
static void closeOssMixer(void) static void closeOssMixer(void)
{ {
while (close(volume_ossFd) && errno == EINTR) ; while (close(volume_ossFd) && errno == EINTR) ;
...@@ -90,12 +93,9 @@ static int prepOssMixer(const char *device) ...@@ -90,12 +93,9 @@ static int prepOssMixer(const char *device)
return -1; return -1;
} }
param = getConfigParam(CONF_MIXER_CONTROL); if ((param = getConfigParam(CONF_MIXER_CONTROL))) {
if (param) {
const char *labels[SOUND_MIXER_NRDEVICES] = SOUND_DEVICE_LABELS; const char *labels[SOUND_MIXER_NRDEVICES] = SOUND_DEVICE_LABELS;
char *duplicated; int i;
int i, j;
int devmask = 0; int devmask = 0;
if (ioctl(volume_ossFd, SOUND_MIXER_READ_DEVMASK, &devmask) < 0) { if (ioctl(volume_ossFd, SOUND_MIXER_READ_DEVMASK, &devmask) < 0) {
...@@ -105,17 +105,17 @@ static int prepOssMixer(const char *device) ...@@ -105,17 +105,17 @@ static int prepOssMixer(const char *device)
} }
for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) { for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) {
duplicated = xstrdup(labels[i]); ssize_t len = strlen(labels[i]);
char *duplicated = alloca(len + 1);
/* eliminate spaces at the end */ /* eliminate spaces at the end */
j = strlen(duplicated) - 1; memcpy(duplicated, labels[i], len + 1);
while (j >= 0 && duplicated[j] == ' ') len -= 2;
duplicated[j--] = '\0'; while (len >= 0 && duplicated[len] == ' ')
if (strcasecmp(duplicated, param->value) == 0) { duplicated[len--] = '\0';
free(duplicated); if (strcasecmp(duplicated, param->value) == 0)
break; break;
} }
free(duplicated);
}
if (i >= SOUND_MIXER_NRDEVICES) { if (i >= SOUND_MIXER_NRDEVICES) {
WARNING("mixer control \"%s\" not found at line %i\n", WARNING("mixer control \"%s\" not found at line %i\n",
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment