Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/thirdpin/libopencm3.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarl Palsson <karlp@tweak.net.au>2018-07-26 01:11:25 +0300
committerKarl Palsson <karlp@tweak.net.au>2018-08-17 03:15:01 +0300
commitf4bbe7c5bb39086a748810e83220e4e5a336bf50 (patch)
treeab8974ad03fc6825f82075e976ca4ae12525dbaf
parentc55ec70f496d61c8731ccc08e15af500ab61beee (diff)
usb: prevent registering duplicate config callbacks
Originally discussed at https://github.com/libopencm3/libopencm3/pull/722
-rw-r--r--include/libopencm3/usb/usbd.h3
-rw-r--r--lib/usb/usb_standard.c3
2 files changed, 5 insertions, 1 deletions
diff --git a/include/libopencm3/usb/usbd.h b/include/libopencm3/usb/usbd.h
index 04b22c84..96d2c1d5 100644
--- a/include/libopencm3/usb/usbd.h
+++ b/include/libopencm3/usb/usbd.h
@@ -139,7 +139,8 @@ extern int usbd_register_control_callback(usbd_device *usbd_dev, uint8_t type,
/* <usb_standard.c> */
/** Registers a "Set Config" callback
- * @return 0 if successful
+ * @return 0 if successful or already existed.
+ * @return -1 if no more space was available for callbacks.
*/
extern int usbd_register_set_config_callback(usbd_device *usbd_dev,
usbd_set_config_callback callback);
diff --git a/lib/usb/usb_standard.c b/lib/usb/usb_standard.c
index fbe89d05..4ce7a8b1 100644
--- a/lib/usb/usb_standard.c
+++ b/lib/usb/usb_standard.c
@@ -46,6 +46,9 @@ int usbd_register_set_config_callback(usbd_device *usbd_dev,
for (i = 0; i < MAX_USER_SET_CONFIG_CALLBACK; i++) {
if (usbd_dev->user_callback_set_config[i]) {
+ if (usbd_dev->user_callback_set_config[i] == callback) {
+ return 0;
+ }
continue;
}