eina: handle gracefully eina_*_free with NULL.

Patch by Raphael Kubo da Costa <rakuco@freebsd.org>.



SVN revision: 73320
This commit is contained in:
Cedric BAIL 2012-07-05 01:12:27 +00:00
parent 60ded53507
commit d8ad05920b
13 changed files with 67 additions and 25 deletions

View File

@ -280,12 +280,12 @@
* Fix portability issue of Eina_Value on ARM and PPC. * Fix portability issue of Eina_Value on ARM and PPC.
* Fix portability issue of Eina_Value test on Itanium. * Fix portability issue of Eina_Value test on Itanium.
2012-05-23 Carsten Haitzler (The Rasterman) 2012-05-23 Carsten Haitzler (The Rasterman)
* Fix global_faulty faulty flag in eina_file to be set to 0 * Fix global_faulty faulty flag in eina_file to be set to 0
initially rather than be random memory garbage. initially rather than be random memory garbage.
2012-05-29 Vincent Torri 2012-05-29 Vincent Torri
* remove --disable-posix-threads and --disable-win32-threads * remove --disable-posix-threads and --disable-win32-threads
from configure options, and detect automatically the threading from configure options, and detect automatically the threading
@ -293,20 +293,24 @@
Fix bug in the XML parser when a tag was in a comment or a Fix bug in the XML parser when a tag was in a comment or a
cdata cdata
2012-06-08 Mike Blumenkrantz 2012-06-08 Mike Blumenkrantz
* Fixed eina_str_split_full() to behave properly and be much faster * Fixed eina_str_split_full() to behave properly and be much faster
2012-06-17 Carsten Haitzler (The Rasterman) 2012-06-17 Carsten Haitzler (The Rasterman)
* Add env var EINA_MEMPOOL_PASS to force mempool to try use * Add env var EINA_MEMPOOL_PASS to force mempool to try use
passthrough to malloc for debgging purposes and memory footrpint passthrough to malloc for debgging purposes and memory footrpint
comparisons at runtime. comparisons at runtime.
2012-07-01 Vincent Torri 2012-07-01 Vincent Torri
* remove --enable-coverage from configure options, * Remove --enable-coverage from configure options,
2012-07-04 Vincent Torri 2012-07-04 Vincent Torri
* implement eina_file_map_lines() on Windows * Implement eina_file_map_lines() on Windows.
2012-07-05 Raphael Kubo da Costa
* Handle NULL in all eina_*_free function.

View File

@ -15,7 +15,8 @@ Fixes:
* Portability issue with Eina_Value test suite when unsigned where not promoted to * Portability issue with Eina_Value test suite when unsigned where not promoted to
unsigned long (case on Itanium). unsigned long (case on Itanium).
* Fix issue in the XML parser when a tag was in a comment or a CDATA. * Fix issue in the XML parser when a tag was in a comment or a CDATA.
* Implement eina_file_map_lines() on Windows * Implement eina_file_map_lines() on Windows.
* Handle NULL in all eina_*_free function.
Removal: Removal:
* configure options: --disable-posix-threads, --disable-win32-threads, * configure options: --disable-posix-threads, --disable-win32-threads,

View File

@ -191,7 +191,7 @@ struct _Eina_Accessor
* *
* This function frees @p accessor if it is not @c NULL; * This function frees @p accessor if it is not @c NULL;
*/ */
EAPI void eina_accessor_free(Eina_Accessor *accessor) EINA_ARG_NONNULL(1); EAPI void eina_accessor_free(Eina_Accessor *accessor);
/** /**
* @brief Retrieve the data of an accessor at a given position. * @brief Retrieve the data of an accessor at a given position.
@ -241,7 +241,7 @@ EAPI void eina_accessor_over(Eina_Accessor *accessor,
Eina_Each_Cb cb, Eina_Each_Cb cb,
unsigned int start, unsigned int start,
unsigned int end, unsigned int end,
const void *fdata) EINA_ARG_NONNULL(1, 2); const void *fdata) EINA_ARG_NONNULL(2);
/** /**
* @brief Lock the container of the accessor. * @brief Lock the container of the accessor.

View File

@ -196,7 +196,7 @@ struct _Eina_Iterator
* *
* This function frees @p iterator if it is not @c NULL; * This function frees @p iterator if it is not @c NULL;
*/ */
EAPI void eina_iterator_free(Eina_Iterator *iterator) EINA_ARG_NONNULL(1); EAPI void eina_iterator_free(Eina_Iterator *iterator);
/** /**
@ -223,7 +223,7 @@ EAPI void *eina_iterator_container_get(Eina_Iterator *iterator) EINA_ARG_NON
* returned, otherwise #EINA_TRUE is returned. * returned, otherwise #EINA_TRUE is returned.
*/ */
EAPI Eina_Bool eina_iterator_next(Eina_Iterator *iterator, EAPI Eina_Bool eina_iterator_next(Eina_Iterator *iterator,
void **data) EINA_ARG_NONNULL(1, 2) EINA_WARN_UNUSED_RESULT; void **data) EINA_ARG_NONNULL(2) EINA_WARN_UNUSED_RESULT;
/** /**
@ -242,7 +242,7 @@ EAPI Eina_Bool eina_iterator_next(Eina_Iterator *iterator,
*/ */
EAPI void eina_iterator_foreach(Eina_Iterator *iterator, EAPI void eina_iterator_foreach(Eina_Iterator *iterator,
Eina_Each_Cb callback, Eina_Each_Cb callback,
const void *fdata) EINA_ARG_NONNULL(1, 2); const void *fdata) EINA_ARG_NONNULL(2);
/** /**

View File

@ -385,7 +385,7 @@ EAPI Eina_Model *eina_model_new(const Eina_Model_Type *type);
* @see eina_model_new() * @see eina_model_new()
* @since 1.2 * @since 1.2
*/ */
EAPI void eina_model_del(Eina_Model *model) EINA_ARG_NONNULL(1); EAPI void eina_model_del(Eina_Model *model);
/** /**
* @brief Returns the type of @a model. * @brief Returns the type of @a model.

View File

@ -95,8 +95,10 @@ eina_accessor_shutdown(void)
EAPI void EAPI void
eina_accessor_free(Eina_Accessor *accessor) eina_accessor_free(Eina_Accessor *accessor)
{ {
if (!accessor)
return;
EINA_MAGIC_CHECK_ACCESSOR(accessor); EINA_MAGIC_CHECK_ACCESSOR(accessor);
EINA_SAFETY_ON_NULL_RETURN(accessor);
EINA_SAFETY_ON_NULL_RETURN(accessor->free); EINA_SAFETY_ON_NULL_RETURN(accessor->free);
accessor->free(accessor); accessor->free(accessor);
} }
@ -133,8 +135,9 @@ eina_accessor_over(Eina_Accessor *accessor,
void *data; void *data;
unsigned int i; unsigned int i;
if (!accessor) return ;
EINA_MAGIC_CHECK_ACCESSOR(accessor); EINA_MAGIC_CHECK_ACCESSOR(accessor);
EINA_SAFETY_ON_NULL_RETURN(accessor);
EINA_SAFETY_ON_NULL_RETURN(accessor->get_container); EINA_SAFETY_ON_NULL_RETURN(accessor->get_container);
EINA_SAFETY_ON_NULL_RETURN(accessor->get_at); EINA_SAFETY_ON_NULL_RETURN(accessor->get_at);
EINA_SAFETY_ON_NULL_RETURN(cb); EINA_SAFETY_ON_NULL_RETURN(cb);

View File

@ -485,12 +485,9 @@ _eina_hash_del_by_key(Eina_Hash *hash, const void *key, const void *data)
{ {
int key_length, key_hash; int key_length, key_hash;
EINA_SAFETY_ON_NULL_RETURN_VAL(hash, EINA_FALSE);
EINA_SAFETY_ON_NULL_RETURN_VAL(key, EINA_FALSE);
EINA_MAGIC_CHECK_HASH(hash); EINA_MAGIC_CHECK_HASH(hash);
if (!hash)
return EINA_FALSE;
if (!key)
return EINA_FALSE;
if (!hash->buckets) if (!hash->buckets)
return EINA_FALSE; return EINA_FALSE;

View File

@ -355,6 +355,9 @@ eina_inarray_new(unsigned int member_size, unsigned int step)
EAPI void EAPI void
eina_inarray_free(Eina_Inarray *array) eina_inarray_free(Eina_Inarray *array)
{ {
if (!inarray)
return;
EINA_MAGIC_CHECK_INARRAY(array); EINA_MAGIC_CHECK_INARRAY(array);
free(array->members); free(array->members);
free(array); free(array);

View File

@ -95,8 +95,10 @@ eina_iterator_shutdown(void)
EAPI void EAPI void
eina_iterator_free(Eina_Iterator *iterator) eina_iterator_free(Eina_Iterator *iterator)
{ {
if (!iterator)
return;
EINA_MAGIC_CHECK_ITERATOR(iterator); EINA_MAGIC_CHECK_ITERATOR(iterator);
EINA_SAFETY_ON_NULL_RETURN(iterator);
EINA_SAFETY_ON_NULL_RETURN(iterator->free); EINA_SAFETY_ON_NULL_RETURN(iterator->free);
iterator->free(iterator); iterator->free(iterator);
} }
@ -117,7 +119,6 @@ eina_iterator_next(Eina_Iterator *iterator, void **data)
return EINA_FALSE; return EINA_FALSE;
EINA_MAGIC_CHECK_ITERATOR(iterator); EINA_MAGIC_CHECK_ITERATOR(iterator);
EINA_SAFETY_ON_NULL_RETURN_VAL(iterator, EINA_FALSE);
EINA_SAFETY_ON_NULL_RETURN_VAL(iterator->next, EINA_FALSE); EINA_SAFETY_ON_NULL_RETURN_VAL(iterator->next, EINA_FALSE);
EINA_SAFETY_ON_NULL_RETURN_VAL(data, EINA_FALSE); EINA_SAFETY_ON_NULL_RETURN_VAL(data, EINA_FALSE);
return iterator->next(iterator, data); return iterator->next(iterator, data);
@ -131,8 +132,10 @@ eina_iterator_foreach(Eina_Iterator *iterator,
const void *container; const void *container;
void *data; void *data;
if (!iterator)
return;
EINA_MAGIC_CHECK_ITERATOR(iterator); EINA_MAGIC_CHECK_ITERATOR(iterator);
EINA_SAFETY_ON_NULL_RETURN(iterator);
EINA_SAFETY_ON_NULL_RETURN(iterator->get_container); EINA_SAFETY_ON_NULL_RETURN(iterator->get_container);
EINA_SAFETY_ON_NULL_RETURN(iterator->next); EINA_SAFETY_ON_NULL_RETURN(iterator->next);
EINA_SAFETY_ON_NULL_RETURN(cb); EINA_SAFETY_ON_NULL_RETURN(cb);

View File

@ -971,6 +971,10 @@ eina_matrixsparse_free(Eina_Matrixsparse *m)
void *user_data; void *user_data;
Eina_Matrixsparse_Row *r; Eina_Matrixsparse_Row *r;
if (!m)
return;
EINA_MAGIC_CHECK_MATRIXSPARSE(m); EINA_MAGIC_CHECK_MATRIXSPARSE(m);
free_func = m->free.func; free_func = m->free.func;

View File

@ -3527,6 +3527,9 @@ _eina_model_unref(Eina_Model *model)
EAPI void EAPI void
eina_model_del(Eina_Model *model) eina_model_del(Eina_Model *model)
{ {
if (!model)
return;
EINA_MODEL_INSTANCE_CHECK(model); EINA_MODEL_INSTANCE_CHECK(model);
_eina_model_del(model); _eina_model_del(model);
_eina_model_unref(model); _eina_model_unref(model);

View File

@ -585,6 +585,9 @@ eina_simple_xml_attribute_new(Eina_Simple_XML_Node_Tag *parent, const char *key,
EAPI void EAPI void
eina_simple_xml_attribute_free(Eina_Simple_XML_Attribute *attr) eina_simple_xml_attribute_free(Eina_Simple_XML_Attribute *attr)
{ {
if (!attr)
return;
EINA_MAGIC_CHECK_ATTRIBUTE(attr); EINA_MAGIC_CHECK_ATTRIBUTE(attr);
if (attr->parent) if (attr->parent)
@ -669,6 +672,9 @@ _eina_simple_xml_node_tag_free(Eina_Simple_XML_Node_Tag *tag)
EAPI void EAPI void
eina_simple_xml_node_tag_free(Eina_Simple_XML_Node_Tag *tag) eina_simple_xml_node_tag_free(Eina_Simple_XML_Node_Tag *tag)
{ {
if (!tag)
return;
EINA_MAGIC_CHECK_TAG(&tag->base); EINA_MAGIC_CHECK_TAG(&tag->base);
if (tag->base.type != EINA_SIMPLE_XML_NODE_TAG) if (tag->base.type != EINA_SIMPLE_XML_NODE_TAG)
{ {
@ -716,6 +722,9 @@ eina_simple_xml_node_data_new(Eina_Simple_XML_Node_Tag *parent, const char *cont
EAPI void EAPI void
eina_simple_xml_node_data_free(Eina_Simple_XML_Node_Data *node) eina_simple_xml_node_data_free(Eina_Simple_XML_Node_Data *node)
{ {
if (!node)
return;
EINA_MAGIC_CHECK_DATA(&node->base); EINA_MAGIC_CHECK_DATA(&node->base);
if (node->base.type != EINA_SIMPLE_XML_NODE_DATA) if (node->base.type != EINA_SIMPLE_XML_NODE_DATA)
{ {
@ -735,6 +744,9 @@ eina_simple_xml_node_cdata_new(Eina_Simple_XML_Node_Tag *parent, const char *con
EAPI void EAPI void
eina_simple_xml_node_cdata_free(Eina_Simple_XML_Node_Data *node) eina_simple_xml_node_cdata_free(Eina_Simple_XML_Node_Data *node)
{ {
if (!node)
return;
EINA_MAGIC_CHECK_DATA(&node->base); EINA_MAGIC_CHECK_DATA(&node->base);
if (node->base.type != EINA_SIMPLE_XML_NODE_CDATA) if (node->base.type != EINA_SIMPLE_XML_NODE_CDATA)
{ {
@ -754,6 +766,9 @@ eina_simple_xml_node_processing_new(Eina_Simple_XML_Node_Tag *parent, const char
EAPI void EAPI void
eina_simple_xml_node_processing_free(Eina_Simple_XML_Node_Data *node) eina_simple_xml_node_processing_free(Eina_Simple_XML_Node_Data *node)
{ {
if (!node)
return;
EINA_MAGIC_CHECK_DATA(&node->base); EINA_MAGIC_CHECK_DATA(&node->base);
if (node->base.type != EINA_SIMPLE_XML_NODE_PROCESSING) if (node->base.type != EINA_SIMPLE_XML_NODE_PROCESSING)
{ {
@ -773,6 +788,9 @@ eina_simple_xml_node_doctype_new(Eina_Simple_XML_Node_Tag *parent, const char *c
EAPI void EAPI void
eina_simple_xml_node_doctype_free(Eina_Simple_XML_Node_Data *node) eina_simple_xml_node_doctype_free(Eina_Simple_XML_Node_Data *node)
{ {
if (!node)
return;
EINA_MAGIC_CHECK_DATA(&node->base); EINA_MAGIC_CHECK_DATA(&node->base);
if (node->base.type != EINA_SIMPLE_XML_NODE_DOCTYPE) if (node->base.type != EINA_SIMPLE_XML_NODE_DOCTYPE)
{ {
@ -792,6 +810,9 @@ eina_simple_xml_node_comment_new(Eina_Simple_XML_Node_Tag *parent, const char *c
EAPI void EAPI void
eina_simple_xml_node_comment_free(Eina_Simple_XML_Node_Data *node) eina_simple_xml_node_comment_free(Eina_Simple_XML_Node_Data *node)
{ {
if (!node)
return;
EINA_MAGIC_CHECK_DATA(&node->base); EINA_MAGIC_CHECK_DATA(&node->base);
if (node->base.type != EINA_SIMPLE_XML_NODE_COMMENT) if (node->base.type != EINA_SIMPLE_XML_NODE_COMMENT)
{ {

View File

@ -1127,6 +1127,9 @@ EAPI Eina_Tiler *eina_tiler_new(int w, int h)
EAPI void eina_tiler_free(Eina_Tiler *t) EAPI void eina_tiler_free(Eina_Tiler *t)
{ {
if (!t)
return;
EINA_MAGIC_CHECK_TILER(t); EINA_MAGIC_CHECK_TILER(t);
_splitter_del(t); _splitter_del(t);
free(t); free(t);