From 1ee2f01f62572aeec728e5413a89527e24ba8cfb Mon Sep 17 00:00:00 2001 From: George Joseph Date: Mon, 17 Jun 2019 11:11:49 -0600 Subject: [PATCH] chan_dahdi: Address gcc9 issues Fixed format-truncation issues in chan_dahdi.c and sig_analog.c. Since they're related to fields provided by dahdi-tools we can't change the buffer sizes so we're just checking the return from snprintf and printing an errior if we overflow. Change-Id: Idc1f3c1565b88a7d145332a0196074b5832864e5 --- channels/chan_dahdi.c | 12 ++++++++++-- channels/sig_analog.c | 7 ++++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c index 29d3b91a93..f428530821 100644 --- a/channels/chan_dahdi.c +++ b/channels/chan_dahdi.c @@ -7673,8 +7673,16 @@ static struct ast_frame *dahdi_handle_event(struct ast_channel *ast) c++; else c = p->dialdest; - if (*c) snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "M*0%s#", c); - else ast_copy_string(p->dop.dialstr,"M*2#", sizeof(p->dop.dialstr)); + + if (*c) { + int numchars = snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "M*0%s#", c); + if (numchars >= sizeof(p->dop.dialstr)) { + ast_log(LOG_WARNING, "Dial string '%s' truncated\n", c); + } + } else { + ast_copy_string(p->dop.dialstr,"M*2#", sizeof(p->dop.dialstr)); + } + if (strlen(p->dop.dialstr) > 4) { memset(p->echorest, 'w', sizeof(p->echorest) - 1); strcpy(p->echorest + (p->echotraining / 401) + 1, p->dop.dialstr + strlen(p->dop.dialstr) - 2); diff --git a/channels/sig_analog.c b/channels/sig_analog.c index 74b4789be0..4356e02378 100644 --- a/channels/sig_analog.c +++ b/channels/sig_analog.c @@ -2968,11 +2968,16 @@ static struct ast_frame *__analog_handle_event(struct analog_pvt *p, struct ast_ } else { c = p->dialdest; } + if (*c) { - snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "M*0%s#", c); + int numchars = snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "M*0%s#", c); + if (numchars >= sizeof(p->dop.dialstr)) { + ast_log(LOG_WARNING, "Dial string '%s' truncated\n", c); + } } else { ast_copy_string(p->dop.dialstr,"M*2#", sizeof(p->dop.dialstr)); } + if (strlen(p->dop.dialstr) > 4) { memset(p->echorest, 'w', sizeof(p->echorest) - 1); strcpy(p->echorest + (p->echotraining / 401) + 1, p->dop.dialstr + strlen(p->dop.dialstr) - 2);