eina: handle gracefully eina_*_free with NULL.
authorcedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Thu, 5 Jul 2012 01:12:27 +0000 (01:12 +0000)
committercedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Thu, 5 Jul 2012 01:12:27 +0000 (01:12 +0000)
Patch by Raphael Kubo da Costa <rakuco@freebsd.org>.

git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/eina@73320 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

13 files changed:
ChangeLog
NEWS
src/include/eina_accessor.h
src/include/eina_iterator.h
src/include/eina_model.h
src/lib/eina_accessor.c
src/lib/eina_hash.c
src/lib/eina_inarray.c
src/lib/eina_iterator.c
src/lib/eina_matrixsparse.c
src/lib/eina_model.c
src/lib/eina_simple_xml_parser.c
src/lib/eina_tiler.c

index db8b643..2e73efb 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
        * Fix portability issue of Eina_Value on ARM and PPC.
        * 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
         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
        from configure options, and detect automatically the threading
        Fix bug in the XML parser when a tag was in a comment or a
        cdata
 
-2012-06-08 Mike Blumenkrantz
+2012-06-08  Mike Blumenkrantz
 
         * 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
         passthrough to malloc for debgging purposes and memory footrpint
         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.
diff --git a/NEWS b/NEWS
index a5360b1..43e827b 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -15,7 +15,8 @@ Fixes:
     * Portability issue with Eina_Value test suite when unsigned where not promoted to
     unsigned long (case on Itanium).
     * 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:
     * configure options: --disable-posix-threads, --disable-win32-threads,
index 8665bb9..7d52d19 100644 (file)
@@ -191,7 +191,7 @@ struct _Eina_Accessor
  *
  * 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.
@@ -241,7 +241,7 @@ EAPI void  eina_accessor_over(Eina_Accessor *accessor,
                               Eina_Each_Cb   cb,
                               unsigned int   start,
                               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.
index dd92c90..1f47b6e 100644 (file)
@@ -196,7 +196,7 @@ struct _Eina_Iterator
  *
  * 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.
  */
 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,
                                 Eina_Each_Cb   callback,
-                                const void    *fdata) EINA_ARG_NONNULL(1, 2);
+                                const void    *fdata) EINA_ARG_NONNULL(2);
 
 
 /**
index 0313b85..892a1d5 100644 (file)
@@ -385,7 +385,7 @@ EAPI Eina_Model *eina_model_new(const Eina_Model_Type *type);
  * @see eina_model_new()
  * @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.
index aec44ef..994704d 100644 (file)
@@ -95,8 +95,10 @@ eina_accessor_shutdown(void)
 EAPI void
 eina_accessor_free(Eina_Accessor *accessor)
 {
+   if (!accessor)
+     return;
+
    EINA_MAGIC_CHECK_ACCESSOR(accessor);
-   EINA_SAFETY_ON_NULL_RETURN(accessor);
    EINA_SAFETY_ON_NULL_RETURN(accessor->free);
    accessor->free(accessor);
 }
@@ -133,8 +135,9 @@ eina_accessor_over(Eina_Accessor *accessor,
    void *data;
    unsigned int i;
 
+   if (!accessor) return ;
+
    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_at);
    EINA_SAFETY_ON_NULL_RETURN(cb);
index 8851f25..821d225 100644 (file)
@@ -485,12 +485,9 @@ _eina_hash_del_by_key(Eina_Hash *hash, const void *key, const void *data)
 {
    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);
-   if (!hash)
-     return EINA_FALSE;
-
-   if (!key)
-     return EINA_FALSE;
 
    if (!hash->buckets)
      return EINA_FALSE;
index 73ac47d..8e1c4a0 100644 (file)
@@ -355,6 +355,9 @@ eina_inarray_new(unsigned int member_size, unsigned int step)
 EAPI void
 eina_inarray_free(Eina_Inarray *array)
 {
+   if (!inarray)
+     return;
+
    EINA_MAGIC_CHECK_INARRAY(array);
    free(array->members);
    free(array);
index db1f253..d035873 100644 (file)
@@ -95,8 +95,10 @@ eina_iterator_shutdown(void)
 EAPI void
 eina_iterator_free(Eina_Iterator *iterator)
 {
+   if (!iterator)
+     return;
+
    EINA_MAGIC_CHECK_ITERATOR(iterator);
-   EINA_SAFETY_ON_NULL_RETURN(iterator);
    EINA_SAFETY_ON_NULL_RETURN(iterator->free);
    iterator->free(iterator);
 }
@@ -117,7 +119,6 @@ eina_iterator_next(Eina_Iterator *iterator, void **data)
      return EINA_FALSE;
 
    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(data,           EINA_FALSE);
    return iterator->next(iterator, data);
@@ -131,8 +132,10 @@ eina_iterator_foreach(Eina_Iterator *iterator,
    const void *container;
    void *data;
 
+   if (!iterator)
+     return;
+
    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->next);
    EINA_SAFETY_ON_NULL_RETURN(cb);
index 9575cec..d287545 100644 (file)
@@ -971,6 +971,10 @@ eina_matrixsparse_free(Eina_Matrixsparse *m)
    void *user_data;
 
    Eina_Matrixsparse_Row *r;
+
+   if (!m)
+     return;
+
    EINA_MAGIC_CHECK_MATRIXSPARSE(m);
 
    free_func = m->free.func;
index a0cc6de..ee8e3e9 100644 (file)
@@ -3527,6 +3527,9 @@ _eina_model_unref(Eina_Model *model)
 EAPI void
 eina_model_del(Eina_Model *model)
 {
+   if (!model)
+     return;
+
    EINA_MODEL_INSTANCE_CHECK(model);
    _eina_model_del(model);
    _eina_model_unref(model);
index ba42a9e..0b83594 100644 (file)
@@ -585,6 +585,9 @@ eina_simple_xml_attribute_new(Eina_Simple_XML_Node_Tag *parent, const char *key,
 EAPI void
 eina_simple_xml_attribute_free(Eina_Simple_XML_Attribute *attr)
 {
+   if (!attr)
+     return;
+
    EINA_MAGIC_CHECK_ATTRIBUTE(attr);
 
    if (attr->parent)
@@ -669,6 +672,9 @@ _eina_simple_xml_node_tag_free(Eina_Simple_XML_Node_Tag *tag)
 EAPI void
 eina_simple_xml_node_tag_free(Eina_Simple_XML_Node_Tag *tag)
 {
+   if (!tag)
+     return;
+
    EINA_MAGIC_CHECK_TAG(&tag->base);
    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
 eina_simple_xml_node_data_free(Eina_Simple_XML_Node_Data *node)
 {
+   if (!node)
+     return;
+
    EINA_MAGIC_CHECK_DATA(&node->base);
    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
 eina_simple_xml_node_cdata_free(Eina_Simple_XML_Node_Data *node)
 {
+   if (!node)
+     return;
+
    EINA_MAGIC_CHECK_DATA(&node->base);
    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
 eina_simple_xml_node_processing_free(Eina_Simple_XML_Node_Data *node)
 {
+   if (!node)
+     return;
+
    EINA_MAGIC_CHECK_DATA(&node->base);
    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
 eina_simple_xml_node_doctype_free(Eina_Simple_XML_Node_Data *node)
 {
+   if (!node)
+     return;
+
    EINA_MAGIC_CHECK_DATA(&node->base);
    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
 eina_simple_xml_node_comment_free(Eina_Simple_XML_Node_Data *node)
 {
+   if (!node)
+     return;
+
    EINA_MAGIC_CHECK_DATA(&node->base);
    if (node->base.type != EINA_SIMPLE_XML_NODE_COMMENT)
      {
index 69b944e..155b0e0 100644 (file)
@@ -1127,6 +1127,9 @@ EAPI Eina_Tiler *eina_tiler_new(int w, int h)
 
 EAPI void eina_tiler_free(Eina_Tiler *t)
 {
+   if (!t)
+     return;
+
    EINA_MAGIC_CHECK_TILER(t);
    _splitter_del(t);
    free(t);