From e3a9e5e57cdaeb4b71112cff014f6e6d90e5a94f Mon Sep 17 00:00:00 2001
From: Sebastien Douheret <sebastien.douheret@iot.bzh>
Date: Sun, 3 Jun 2018 21:52:11 +0200
Subject: Fixed bug when searching tail of list

When searching tail of list, you cannot use directly input parameter
(*l) , you should use a local variable instead (here new_elt).

Change-Id: I13fc042f85580342ecf33cca2067a37ee55f4799
Signed-off-by: Sebastien Douheret <sebastien.douheret@iot.bzh>
---
 src/utils/list.c | 129 ++++++++++++++++++++++++++-----------------------------
 1 file changed, 62 insertions(+), 67 deletions(-)

(limited to 'src')

diff --git a/src/utils/list.c b/src/utils/list.c
index d47f761..c5152a3 100644
--- a/src/utils/list.c
+++ b/src/utils/list.c
@@ -17,96 +17,91 @@
 
 #include "list.h"
 #include "string.h"
+#include <stdio.h>
+#include <stdlib.h>
 
-void destroy_list(struct list *l)
+void destroy_list(struct list* l)
 {
-	struct list *save;
-	while(l != NULL) {
-		save = l->next;
-		free(l);
-		l = save;
-	}
+    struct list* save;
+    while (l != NULL) {
+        save = l->next;
+        free(l);
+        l = save;
+    }
 }
 
-void add_elt(struct list **l, const char *key, json_object *value)
+void add_elt(struct list** l, const char* key, json_object* value)
 {
-	struct list *new_elt = malloc(sizeof(struct list));
-	new_elt->key = key;
-	new_elt->value = value;
-	new_elt->next = NULL;
+    struct list* new_elt;
 
-	if(*l) {
-		while((*l)->next != NULL) {
-			*l = (*l)->next;
-		}
-		(*l)->next = new_elt;
-	}
-	else {
-		*l = new_elt;
-	}
+    // search tail
+    new_elt = *l;
+    while (new_elt != NULL) {
+        l = &new_elt->next;
+        new_elt = new_elt->next;
+    }
+
+    // alloc new elem
+    new_elt = malloc(sizeof(struct list));
+    if (!new_elt) {
+        fprintf(stderr, "OUT of memory");
+        exit(1);
+    }
+
+    *l = new_elt;
+    new_elt->key = key;
+    new_elt->value = value;
+    new_elt->next = NULL;
 }
 
-void add_key(struct list **l, const char *key)
+void add_key(struct list** l, const char* key)
 {
-	struct list *new_elt = malloc(sizeof(struct list));
-	new_elt->key = key;
-	new_elt->value = NULL;
-	new_elt->next = NULL;
-
-	if(*l) {
-		while((*l)->next != NULL) {
-			*l = (*l)->next;
-		}
-		(*l)->next = new_elt;
-	}
-	else {
-		*l = new_elt;
-	}
+    add_elt(l, key, NULL);
 }
 
-int set_value(struct list *l, json_object *val, int index)
+int set_value(struct list* l, json_object* val, int index)
 {
-	int i;
+    int i;
 
-	for (i = 0; i < index; i++) {
-		l = l->next;
-		if ( l == NULL )
-			return -1;
-	}
+    for (i = 0; i < index; i++) {
+        l = l->next;
+        if (l == NULL)
+            return -1;
+    }
 
-	l->value = val;
-	return 0;
+    l->value = val;
+    return 0;
 }
 
-struct list *get_elt(struct list *l, int index)
+struct list* get_elt(struct list* l, int index)
 {
-	int i;
+    int i;
 
-	for (i = 0; i < index; i++) {
-		l = l->next;
-		if ( l == NULL )
-			return NULL;
-	}
+    for (i = 0; i < index; i++) {
+        l = l->next;
+        if (l == NULL)
+            return NULL;
+    }
 
-	return l;
+    return l;
 }
 
-struct list *find_elt_from_key(struct list *l, const char *key)
+struct list* find_elt_from_key(struct list* l, const char* key)
 {
-	while(l != NULL) {
-		if(strcasecmp(l->key, key) == 0)
-			return l;
-		l = l->next;
-	}
-	return NULL;
+    while (l != NULL) {
+        if (strcasecmp(l->key, key) == 0)
+            return l;
+        l = l->next;
+    }
+    return NULL;
 }
 
-json_object *find_key_value(struct list *l, const char *key)
+json_object* find_key_value(struct list* l, const char* key)
 {
-	while(l != NULL) {
-		if(strcasecmp(l->key, key) == 0)
-			return l->value;
-		l = l->next;
-	}
-	return NULL;
+    while (l != NULL) {
+        if (strcasecmp(l->key, key) == 0)
+            return l->value;
+        l = l->next;
+    }
+    return NULL;
 }
-- 
cgit