Quick general purpose linked list in C
The list_free has a small error.
Whether the function should free the list is up to the API design. Maybe you did not want dangling pointers. Then the name should be better list_clear.

void list_free(struct list_handler *list)
{
    struct list_node *current = list-&gt;head;
    struct list_node *previous;

    while (current != NULL)
    {
        previous = current;
        current = current-&gt;next;

        //- free(current);
        free(previous); //+

        list-&gt;head = current;
        --list-&gt;count;
    }

    list-&gt;tail = NULL;
    free(list); //+
}


Freeing the data is a non-list issue, misleading, especially with a void*.

void list_free_data(void *data)
{
    //int *temp = (int*) data;
    //free(temp);
    //data = NULL;
    free(data);
}


Assigning NULL to data has no effect.

However if you want to free the list with freeing the data:

list_foreach(list, free);
list_free(list);
free(list);


The list_foreach is limited as it must work with side-effects, storing results or other context in global variables. Better provide a for-each with an additional parameter. So bad coding style is not inevitable.

For the remainder: I like APIs to provide a full set of operations, that is with a remove too.