chan_vpb: Fix a gcc 7 out-of-bounds complaint
[asterisk/asterisk.git] / addons / chan_mobile.c
index 3304702..8f04af7 100644 (file)
@@ -42,8 +42,6 @@
 
 #include "asterisk.h"
 
-ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
-
 #include <pthread.h>
 #include <signal.h>
 
@@ -902,7 +900,7 @@ static struct ast_channel *mbl_request(const char *type, struct ast_format_cap *
        }
 
        if (ast_format_cap_iscompatible_format(cap, DEVICE_FRAME_FORMAT) == AST_FORMAT_CMP_NOT_EQUAL) {
-               struct ast_str *codec_buf = ast_str_alloca(64);
+               struct ast_str *codec_buf = ast_str_alloca(AST_FORMAT_CAP_NAMES_LEN);
                ast_log(LOG_WARNING, "Asked to get a channel of unsupported format '%s'\n", ast_format_cap_get_names(cap, &codec_buf));
                *cause = AST_CAUSE_FACILITY_NOT_IMPLEMENTED;
                return NULL;
@@ -3855,10 +3853,7 @@ static void *do_monitor_phone(void *data)
                }
 
                if ((at_msg = at_read_full(hfp->rsock, buf, sizeof(buf))) < 0) {
-                       /* XXX gnu specific strerror_r is assummed here, this
-                        * is not really safe.  See the strerror(3) man page
-                        * for more info. */
-                       ast_debug(1, "[%s] error reading from device: %s (%d)\n", pvt->id, strerror_r(errno, buf, sizeof(buf)), errno);
+                       ast_debug(1, "[%s] error reading from device: %s (%d)\n", pvt->id, strerror(errno), errno);
                        break;
                }
 
@@ -3995,7 +3990,7 @@ static void *do_monitor_phone(void *data)
                        ast_debug(1, "[%s] error parsing message\n", pvt->id);
                        goto e_cleanup;
                case AT_READ_ERROR:
-                       ast_debug(1, "[%s] error reading from device: %s (%d)\n", pvt->id, strerror_r(errno, buf, sizeof(buf)), errno);
+                       ast_debug(1, "[%s] error reading from device: %s (%d)\n", pvt->id, strerror(errno), errno);
                        goto e_cleanup;
                default:
                        break;
@@ -4073,11 +4068,7 @@ static void *do_monitor_headset(void *data)
                        continue;
 
                if ((at_msg = at_read_full(pvt->rfcomm_socket, buf, sizeof(buf))) < 0) {
-                       if (strerror_r(errno, buf, sizeof(buf)))
-                               ast_debug(1, "[%s] error reading from device\n", pvt->id);
-                       else
-                               ast_debug(1, "[%s] error reading from device: %s (%d)\n", pvt->id, buf, errno);
-
+                       ast_debug(1, "[%s] error reading from device: %s (%d)\n", pvt->id, strerror(errno), errno);
                        goto e_cleanup;
                }
                ast_debug(1, "[%s] %s\n", pvt->id, buf);
@@ -4713,9 +4704,13 @@ static int load_module(void)
        ast_format_cap_append(mbl_tech.capabilities, DEVICE_FRAME_FORMAT, 0);
        /* Check if we have Bluetooth, no point loading otherwise... */
        dev_id = hci_get_route(NULL);
+
        s = hci_open_dev(dev_id);
        if (dev_id < 0 || s < 0) {
                ast_log(LOG_ERROR, "No Bluetooth devices found. Not loading module.\n");
+               ao2_ref(mbl_tech.capabilities, -1);
+               mbl_tech.capabilities = NULL;
+               hci_close_dev(s);
                return AST_MODULE_LOAD_DECLINE;
        }
 
@@ -4723,6 +4718,8 @@ static int load_module(void)
 
        if (mbl_load_config()) {
                ast_log(LOG_ERROR, "Errors reading config file %s. Not loading module.\n", MBL_CONFIG);
+               ao2_ref(mbl_tech.capabilities, -1);
+               mbl_tech.capabilities = NULL;
                return AST_MODULE_LOAD_DECLINE;
        }
 
@@ -4747,15 +4744,14 @@ static int load_module(void)
        return AST_MODULE_LOAD_SUCCESS;
 
 e_cleanup:
-       if (sdp_session)
-               sdp_close(sdp_session);
+       unload_module();
 
-       return AST_MODULE_LOAD_FAILURE;
+       return AST_MODULE_LOAD_DECLINE;
 }
 
 AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "Bluetooth Mobile Device Channel Driver",
-               .support_level = AST_MODULE_SUPPORT_EXTENDED,
-               .load = load_module,
-               .unload = unload_module,
-               .load_pri = AST_MODPRI_CHANNEL_DRIVER,
+       .support_level = AST_MODULE_SUPPORT_EXTENDED,
+       .load = load_module,
+       .unload = unload_module,
+       .load_pri = AST_MODPRI_CHANNEL_DRIVER,
 );