zephyr: serial_adapter: preserve buffer list against lock
It was possible that free_queue locks on the self referencing
node.
This patch introduce check for this issue
Signed-off-by: Andrzej Puzdrowski <andrzej.puzdrowski@nordicsemi.no>
Signed-off-by: Carles Cufi <carles.cufi@nordicsemi.no>
diff --git a/boot/zephyr/serial_adapter.c b/boot/zephyr/serial_adapter.c
index f51dc94..7ba4adb 100644
--- a/boot/zephyr/serial_adapter.c
+++ b/boot/zephyr/serial_adapter.c
@@ -157,17 +157,23 @@
{
static struct line_input *cmd;
sys_snode_t *node;
+ int key;
+ key = irq_lock();
/* Recycle cmd buffer returned previous time */
if (cmd != NULL) {
- sys_slist_append(&free_queue, &cmd->node);
+ if (sys_slist_peek_tail(&free_queue) != &cmd->node) {
+ sys_slist_append(&free_queue, &cmd->node);
+ }
}
node = sys_slist_get(&used_queue);
+ irq_unlock(key);
if (node == NULL) {
cmd = NULL;
*line = NULL;
+
return 0;
}