diff --git a/include/search.h b/include/search.h index 17079439d36..20fa93fbd3b 100644 --- a/include/search.h +++ b/include/search.h @@ -35,7 +35,8 @@ typedef struct entry typedef enum { FIND, - ENTER + ENTER, + DELETE } ACTION; struct hsearch_data diff --git a/libs/libc/search/hcreate_r.c b/libs/libc/search/hcreate_r.c index c133b89b759..6c35e78032e 100644 --- a/libs/libc/search/hcreate_r.c +++ b/libs/libc/search/hcreate_r.c @@ -191,6 +191,7 @@ void hdestroy_r(FAR struct hsearch_data *htab) ie = SLIST_FIRST(&(htab->htable[idx])); SLIST_REMOVE_HEAD(&(htab->htable[idx]), link); lib_free(ie->ent.key); + lib_free(ie->ent.data); lib_free(ie); } } @@ -239,7 +240,20 @@ int hsearch_r(ENTRY item, ACTION action, FAR ENTRY **retval, ie = SLIST_NEXT(ie, link); } - if (ie != NULL) + if (action == DELETE) + { + if (ie != NULL) + { + SLIST_REMOVE(head, ie, internal_entry, link); + lib_free(ie->ent.key); + lib_free(ie->ent.data); + lib_free(ie); + return 1; + } + + return 0; + } + else if (ie != NULL) { *retval = &ie->ent; return 1;