diff -r bce0d7f2912b -r 23bb65cbf7a4 ucx/map.c --- a/ucx/map.c Tue Feb 21 01:13:17 2012 +0100 +++ b/ucx/map.c Fri Feb 24 15:53:50 2012 +0100 @@ -29,11 +29,13 @@ if (elem != NULL) { do { UcxMapElement *next = elem->next; + free(elem->key.data); free(elem); elem = next; } while (elem != NULL); } } + free(map->map); free(map); } @@ -41,12 +43,6 @@ if(key.hash == 0) { key.hash = ucx_hash((char*)key.data, key.len); } - void *kd = malloc(key.len); - if (kd == NULL) { - return -1; - } - memcpy(kd, key.data, key.len); - key.data = kd; size_t slot = key.hash%map->size; UcxMapElement *elm = map->map[slot]; @@ -62,6 +58,7 @@ if(e == NULL) { return -1; } + e->key.data = NULL; if (prev == NULL) { map->map[slot] = e; } else { @@ -71,7 +68,15 @@ elm = e; } - elm->key = key; + if(elm->key.data == NULL) { + void *kd = malloc(key.len); + if (kd == NULL) { + return -1; + } + memcpy(kd, key.data, key.len); + key.data = kd; + elm->key = key; + } elm->data = data; return 0;