Devo implementare una funz. void free_List (list_t ** pt) che libera l'area di memoria occupata da una lista.

la struttura dati lista è così definita:
codice:
typedef struct {
  /** la testa della lista */
  elem_t * head;
  /** la funzione per confrontare due chiavi */
  int (* compare) (void *, void *);
  /** la funzione per copiare una chiave */
  void * (* copyk) (void *);
  /** la funzione per copiare un payload*/
  void * (* copyp) (void *);
} list_t;

typedef struct elem {
  /** chiave */
  void * key;
  /** informazione */
  void * payload;
  /** puntatore elemento successivo */
  struct elem * next;
} elem_t;
la mia implementazione della freeList è la seguente:
codice:
void free_List (list_t ** pt){
if(!(*pt))
	 errno = EINVAL;
else{
	/**Se la lista non è vuota libera l'area di memoria occupata da tutti i suoi elementi*/	
	if ((*pt)->head!=NULL)
		liberalista((*pt)->head);
	
	free(*pt);
	(*pt)=NULL;}
return;
	
}

void liberalista (elem_t  *e){
        
	  elem_t* tmp = e->next;
	  free(e->key);
          free(e->payload);
          free(e);
     if(tmp!=NULL) liberalista(tmp);
}
non sono sicuro della sua correttezza in quanto un utilizzo della stessa in un programma che lavora su tabelle hash che risolvono collisioni con le liste non va a buon fine.
sapreste dirmi se c'è qualche problema? grazie.