diff options
author | Eric Wong <normalperson@yhbt.net> | 2008-09-23 20:47:53 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2008-09-23 20:47:53 +0200 |
commit | 9f441f25384c6c9ad5266c34c114535c788ced11 (patch) | |
tree | e35cc51dc0af732ba971569ab558a0c795dc75f6 /src/volume.c | |
parent | d095d52ed4aadd916bd025e1c39bbe2977da3997 (diff) | |
download | mpd-9f441f25384c6c9ad5266c34c114535c788ced11.tar.gz mpd-9f441f25384c6c9ad5266c34c114535c788ced11.tar.xz mpd-9f441f25384c6c9ad5266c34c114535c788ced11.zip |
oss: avoid heap allocations when configuring mixer
Noticed-by: Courtney Cavin
Diffstat (limited to 'src/volume.c')
-rw-r--r-- | src/volume.c | 26 |
1 files changed, 13 insertions, 13 deletions
diff --git a/src/volume.c b/src/volume.c index 71fe098ac..e319afdd9 100644 --- a/src/volume.c +++ b/src/volume.c @@ -31,6 +31,7 @@ #ifdef HAVE_ALSA #include <alsa/asoundlib.h> #endif +#include <alloca.h> #define VOLUME_MIXER_TYPE_SOFTWARE 0 #define VOLUME_MIXER_TYPE_OSS 1 @@ -75,6 +76,8 @@ static int volume_alsaSet = -1; #ifdef HAVE_OSS +#include <alloca.h> /* only alloca user in mpd atm, may change ... */ + static void closeOssMixer(void) { while (close(volume_ossFd) && errno == EINTR) ; @@ -90,12 +93,9 @@ static int prepOssMixer(const char *device) return -1; } - param = getConfigParam(CONF_MIXER_CONTROL); - - if (param) { + if ((param = getConfigParam(CONF_MIXER_CONTROL))) { const char *labels[SOUND_MIXER_NRDEVICES] = SOUND_DEVICE_LABELS; - char *duplicated; - int i, j; + int i; int devmask = 0; if (ioctl(volume_ossFd, SOUND_MIXER_READ_DEVMASK, &devmask) < 0) { @@ -105,16 +105,16 @@ static int prepOssMixer(const char *device) } 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 */ - j = strlen(duplicated) - 1; - while (j >= 0 && duplicated[j] == ' ') - duplicated[j--] = '\0'; - if (strcasecmp(duplicated, param->value) == 0) { - free(duplicated); + memcpy(duplicated, labels[i], len + 1); + len -= 2; + while (len >= 0 && duplicated[len] == ' ') + duplicated[len--] = '\0'; + if (strcasecmp(duplicated, param->value) == 0) break; - } - free(duplicated); } if (i >= SOUND_MIXER_NRDEVICES) { |