summaryrefslogtreecommitdiff
path: root/pjmedia/src/pjmedia-audiodev/alsa_dev.c
diff options
context:
space:
mode:
Diffstat (limited to 'pjmedia/src/pjmedia-audiodev/alsa_dev.c')
-rw-r--r--pjmedia/src/pjmedia-audiodev/alsa_dev.c29
1 files changed, 23 insertions, 6 deletions
diff --git a/pjmedia/src/pjmedia-audiodev/alsa_dev.c b/pjmedia/src/pjmedia-audiodev/alsa_dev.c
index efda3190..997b5894 100644
--- a/pjmedia/src/pjmedia-audiodev/alsa_dev.c
+++ b/pjmedia/src/pjmedia-audiodev/alsa_dev.c
@@ -171,7 +171,7 @@ static void alsa_error_handler (const char *file,
...)
{
char err_msg[128];
- int index;
+ int index, len;
va_list arg;
#ifndef NDEBUG
@@ -180,13 +180,30 @@ static void alsa_error_handler (const char *file,
#else
index = snprintf (err_msg, sizeof(err_msg), "ALSA lib: ");
#endif
+ if (index < 1 || index >= (int)sizeof(err_msg)) {
+ index = sizeof(err_msg)-1;
+ err_msg[index] = '\0';
+ goto print_msg;
+ }
+
va_start (arg, fmt);
- if (index < sizeof(err_msg)-1)
- index += vsnprintf (err_msg+index, sizeof(err_msg)-index, fmt, arg);
+ if (index < sizeof(err_msg)-1) {
+ len = vsnprintf( err_msg+index, sizeof(err_msg)-index, fmt, arg);
+ if (len < 1 || len >= (int)sizeof(err_msg)-index)
+ len = sizeof(err_msg)-index-1;
+ index += len;
+ err_msg[index] = '\0';
+ }
va_end(arg);
- if (err && index < sizeof(err_msg)-1)
- index += snprintf (err_msg+index, sizeof(err_msg)-index, ": %s",
- snd_strerror(err));
+ if (err && index < sizeof(err_msg)-1) {
+ len = snprintf( err_msg+index, sizeof(err_msg)-index, ": %s",
+ snd_strerror(err));
+ if (len < 1 || len >= (int)sizeof(err_msg)-index)
+ len = sizeof(err_msg)-index-1;
+ index += len;
+ err_msg[index] = '\0';
+ }
+print_msg:
PJ_LOG (4,(THIS_FILE, "%s", err_msg));
}