]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
main/devicestate: Prevent duplicate registration of device state providers 84/784/2
authorMatt Jordan <mjordan@digium.com>
Sat, 27 Jun 2015 22:51:43 +0000 (17:51 -0500)
committerMatt Jordan <mjordan@digium.com>
Sat, 11 Jul 2015 15:24:39 +0000 (10:24 -0500)
Currently, the device state provider API will allow you to register a
device state provider with the same case insensitive name more than
once. This could cause strange issues, as the duplicate device state
providers will not be queried when a device's state has to be polled.
This patch updates the API such that a device state provider with the
same name as one that has already registered will be rejected.

Change-Id: I4a418a12280b7b6e4960bd44f302e27cd036ceb2

main/devicestate.c

index 7eb9e3057de764fb1fd11d28c9c2493f8d24aa07..2983ee99296fa289adae6eb7661a2dca1e44091d 100644 (file)
@@ -397,6 +397,7 @@ enum ast_device_state ast_device_state(const char *device)
 /*! \brief Add device state provider */
 int ast_devstate_prov_add(const char *label, ast_devstate_prov_cb_type callback)
 {
+       struct devstate_prov *devcb;
        struct devstate_prov *devprov;
 
        if (!callback || !(devprov = ast_calloc(1, sizeof(*devprov))))
@@ -406,6 +407,14 @@ int ast_devstate_prov_add(const char *label, ast_devstate_prov_cb_type callback)
        ast_copy_string(devprov->label, label, sizeof(devprov->label));
 
        AST_RWLIST_WRLOCK(&devstate_provs);
+       AST_RWLIST_TRAVERSE(&devstate_provs, devcb, list) {
+               if (!strcasecmp(devcb->label, label)) {
+                       ast_log(LOG_WARNING, "Device state provider '%s' already registered\n", label);
+                       ast_free(devprov);
+                       AST_RWLIST_UNLOCK(&devstate_provs);
+                       return -1;
+               }
+       }
        AST_RWLIST_INSERT_HEAD(&devstate_provs, devprov, list);
        AST_RWLIST_UNLOCK(&devstate_provs);