chan_dahdi: Address gcc9 issues
authorGeorge Joseph <gjoseph@digium.com>
Mon, 17 Jun 2019 17:11:49 +0000 (11:11 -0600)
committerGeorge Joseph <gjoseph@digium.com>
Mon, 17 Jun 2019 18:58:48 +0000 (12:58 -0600)
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
channels/sig_analog.c

index 29d3b91..f428530 100644 (file)
@@ -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);
index 74b4789..4356e02 100644 (file)
@@ -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);