diff --git a/legacy/eina/configure.ac b/legacy/eina/configure.ac index ce8b184634..76cf1e18f3 100644 --- a/legacy/eina/configure.ac +++ b/legacy/eina/configure.ac @@ -62,6 +62,27 @@ if test "x${enable_magic_debug}" = "xyes" ; then fi AC_SUBST(EINA_MAGIC_DEBUG) +# Safety checks (avoid crashes on wrong api usage) +want_safety_checks="yes" +AC_MSG_CHECKING(whether to do safety checking on api parameters) +AC_ARG_ENABLE(safety-checks, + AC_HELP_STRING( + [--disable-safety-checks], + [disable safety checks for NULL pointers and like. [[default=enabled]]] + ), + [ want_safety_checks="$enableval" ] +) +AC_MSG_RESULT($want_safety_checks) + +AM_CONDITIONAL(SAFETY_CHECKS, test "x$want_safety_checks" = "xyes") +if test "x$want_safety_checks" = "xyes"; then + AC_DEFINE(SAFETY_CHECKS, 1, [disable safety checks for NULL pointers and like.]) + EINA_SAFETY_CHECKS=1 +else + EINA_SAFETY_CHECKS=0 +fi +AC_SUBST(EINA_SAFETY_CHECKS) + # Choose best memory pool AC_ARG_ENABLE([default-mempool], [AC_HELP_STRING([--enable-default-mempool], [Default memory allocator could be faster for some computer])], diff --git a/legacy/eina/src/include/Makefile.am b/legacy/eina/src/include/Makefile.am index 1fa8c9567b..bb4de5d414 100644 --- a/legacy/eina/src/include/Makefile.am +++ b/legacy/eina/src/include/Makefile.am @@ -1,6 +1,7 @@ MAINTAINERCLEANFILES = Makefile.in EINAHEADERS = \ +eina_safety_checks.h \ eina_error.h \ eina_f16p16.h \ eina_hash.h \ diff --git a/legacy/eina/src/include/eina_config.h.in b/legacy/eina/src/include/eina_config.h.in index 35e8399509..d9bf7ffc11 100644 --- a/legacy/eina/src/include/eina_config.h.in +++ b/legacy/eina/src/include/eina_config.h.in @@ -29,4 +29,9 @@ #define EINA_DEFAULT_MEMPOOL #endif +#undef EINA_SAFETY_CHECKS +#if @EINA_SAFETY_CHECKS@ +#define EINA_SAFETY_CHECKS +#endif + #endif /* EINA_CONFIG_H_ */ diff --git a/legacy/eina/src/include/eina_hash.h b/legacy/eina/src/include/eina_hash.h index 473ef9bad8..5f498f3b71 100644 --- a/legacy/eina/src/include/eina_hash.h +++ b/legacy/eina/src/include/eina_hash.h @@ -115,14 +115,14 @@ EAPI void eina_hash_foreach(const Eina_Hash *hash, /* Paul Hsieh (http://www.azillionmonkeys.com/qed/hash.html) hash function used by WebCore (http://webkit.org/blog/8/hashtables-part-2/) */ -EAPI int eina_hash_superfast(const char *key, int len); +EAPI int eina_hash_superfast(const char *key, int len) EINA_ARG_NONNULL(1); /* Hash function first reported by dan bernstein many years ago in comp.lang.c */ -static inline int eina_hash_djb2(const char *key, int len); +static inline int eina_hash_djb2(const char *key, int len) EINA_ARG_NONNULL(1); /* Hash function from http://www.concentric.net/~Ttwang/tech/inthash.htm */ -static inline int eina_hash_int32(unsigned int *pkey, int len); -static inline int eina_hash_int64(unsigned long int *pkey, int len); +static inline int eina_hash_int32(unsigned int *pkey, int len) EINA_ARG_NONNULL(1); +static inline int eina_hash_int64(unsigned long int *pkey, int len) EINA_ARG_NONNULL(1); #include "eina_inline_hash.x" diff --git a/legacy/eina/src/include/eina_inlist.h b/legacy/eina/src/include/eina_inlist.h index 03b77dad8d..eb20f9620b 100644 --- a/legacy/eina/src/include/eina_inlist.h +++ b/legacy/eina/src/include/eina_inlist.h @@ -41,10 +41,10 @@ struct _Eina_Inlist EAPI Eina_Inlist * eina_inlist_append(Eina_Inlist *in_list, Eina_Inlist *in_item) EINA_ARG_NONNULL(2) EINA_WARN_UNUSED_RESULT; EAPI Eina_Inlist * eina_inlist_prepend(Eina_Inlist *in_list, Eina_Inlist *in_item) EINA_ARG_NONNULL(2) EINA_WARN_UNUSED_RESULT; -EAPI Eina_Inlist * eina_inlist_append_relative(Eina_Inlist *in_list, Eina_Inlist *in_item, Eina_Inlist *in_relative) EINA_ARG_NONNULL(1, 2, 3) EINA_WARN_UNUSED_RESULT; -EAPI Eina_Inlist * eina_inlist_prepend_relative(Eina_Inlist *in_list, Eina_Inlist *in_item, Eina_Inlist *in_relative) EINA_ARG_NONNULL(1, 2, 3) EINA_WARN_UNUSED_RESULT; +EAPI Eina_Inlist * eina_inlist_append_relative(Eina_Inlist *in_list, Eina_Inlist *in_item, Eina_Inlist *in_relative) EINA_ARG_NONNULL(2) EINA_WARN_UNUSED_RESULT; +EAPI Eina_Inlist * eina_inlist_prepend_relative(Eina_Inlist *in_list, Eina_Inlist *in_item, Eina_Inlist *in_relative) EINA_ARG_NONNULL(2) EINA_WARN_UNUSED_RESULT; EAPI Eina_Inlist * eina_inlist_remove(Eina_Inlist *in_list, Eina_Inlist *in_item) EINA_ARG_NONNULL(1, 2) EINA_WARN_UNUSED_RESULT; -EAPI Eina_Inlist * eina_inlist_find(Eina_Inlist *in_list, Eina_Inlist *in_item) EINA_ARG_NONNULL(1, 2) EINA_WARN_UNUSED_RESULT; +EAPI Eina_Inlist * eina_inlist_find(Eina_Inlist *in_list, Eina_Inlist *in_item) EINA_ARG_NONNULL(2) EINA_WARN_UNUSED_RESULT; EAPI Eina_Inlist * eina_inlist_promote(Eina_Inlist *list, Eina_Inlist *item) EINA_ARG_NONNULL(1, 2) EINA_WARN_UNUSED_RESULT; EAPI Eina_Inlist * eina_inlist_demote(Eina_Inlist *list, Eina_Inlist *item) EINA_ARG_NONNULL(1, 2) EINA_WARN_UNUSED_RESULT; diff --git a/legacy/eina/src/include/eina_list.h b/legacy/eina/src/include/eina_list.h index 7e75fd776a..020d57b165 100644 --- a/legacy/eina/src/include/eina_list.h +++ b/legacy/eina/src/include/eina_list.h @@ -81,22 +81,22 @@ EAPI int eina_list_shutdown(void); EAPI Eina_List *eina_list_append (Eina_List *list, const void *data) EINA_ARG_NONNULL(2) EINA_WARN_UNUSED_RESULT; EAPI Eina_List *eina_list_prepend (Eina_List *list, const void *data) EINA_ARG_NONNULL(2) EINA_WARN_UNUSED_RESULT; -EAPI Eina_List *eina_list_append_relative (Eina_List *list, const void *data, const void *relative) EINA_ARG_NONNULL(1, 2, 3) EINA_WARN_UNUSED_RESULT; -EAPI Eina_List *eina_list_append_relative_list (Eina_List *list, const void *data, Eina_List *relative) EINA_ARG_NONNULL(1, 2, 3) EINA_WARN_UNUSED_RESULT; -EAPI Eina_List *eina_list_prepend_relative (Eina_List *list, const void *data, const void *relative) EINA_ARG_NONNULL(1, 2, 3) EINA_WARN_UNUSED_RESULT; -EAPI Eina_List *eina_list_prepend_relative_list (Eina_List *list, const void *data, Eina_List *relative) EINA_ARG_NONNULL(1, 2, 3) EINA_WARN_UNUSED_RESULT; -EAPI Eina_List *eina_list_remove (Eina_List *list, const void *data) EINA_ARG_NONNULL(1, 2) EINA_WARN_UNUSED_RESULT; -EAPI Eina_List *eina_list_remove_list (Eina_List *list, Eina_List *remove_list) EINA_ARG_NONNULL(1, 2) EINA_WARN_UNUSED_RESULT; -EAPI Eina_List *eina_list_promote_list (Eina_List *list, Eina_List *move_list) EINA_ARG_NONNULL(1, 2) EINA_WARN_UNUSED_RESULT; -EAPI void *eina_list_data_find(const Eina_List *list, const void *data) EINA_PURE EINA_ARG_NONNULL(1, 2) EINA_WARN_UNUSED_RESULT; -EAPI Eina_List *eina_list_data_find_list (const Eina_List *list, const void *data) EINA_PURE EINA_ARG_NONNULL(1, 2) EINA_WARN_UNUSED_RESULT; -EAPI Eina_List *eina_list_free (Eina_List *list) EINA_ARG_NONNULL(1); -EAPI void *eina_list_nth(const Eina_List *list, unsigned int n) EINA_PURE EINA_ARG_NONNULL(1) EINA_WARN_UNUSED_RESULT; -EAPI Eina_List *eina_list_nth_list (const Eina_List *list, unsigned int n) EINA_PURE EINA_ARG_NONNULL(1) EINA_WARN_UNUSED_RESULT; -EAPI Eina_List *eina_list_reverse (Eina_List *list) EINA_ARG_NONNULL(1) EINA_WARN_UNUSED_RESULT; -EAPI Eina_List *eina_list_sort (Eina_List *list, unsigned int size, Eina_Compare_Cb func) EINA_ARG_NONNULL(1, 3) EINA_WARN_UNUSED_RESULT; -EAPI Eina_List *eina_list_merge (Eina_List *left, Eina_List *right) EINA_ARG_NONNULL(1, 2) EINA_WARN_UNUSED_RESULT; -EAPI Eina_List *eina_list_sorted_merge(Eina_List *left, Eina_List *right, Eina_Compare_Cb func) EINA_ARG_NONNULL(1, 2, 3) EINA_WARN_UNUSED_RESULT; +EAPI Eina_List *eina_list_append_relative (Eina_List *list, const void *data, const void *relative) EINA_ARG_NONNULL(2) EINA_WARN_UNUSED_RESULT; +EAPI Eina_List *eina_list_append_relative_list (Eina_List *list, const void *data, Eina_List *relative) EINA_ARG_NONNULL(2) EINA_WARN_UNUSED_RESULT; +EAPI Eina_List *eina_list_prepend_relative (Eina_List *list, const void *data, const void *relative) EINA_ARG_NONNULL(2) EINA_WARN_UNUSED_RESULT; +EAPI Eina_List *eina_list_prepend_relative_list (Eina_List *list, const void *data, Eina_List *relative) EINA_ARG_NONNULL(2) EINA_WARN_UNUSED_RESULT; +EAPI Eina_List *eina_list_remove (Eina_List *list, const void *data) EINA_ARG_NONNULL(2) EINA_WARN_UNUSED_RESULT; +EAPI Eina_List *eina_list_remove_list (Eina_List *list, Eina_List *remove_list) EINA_ARG_NONNULL(2) EINA_WARN_UNUSED_RESULT; +EAPI Eina_List *eina_list_promote_list (Eina_List *list, Eina_List *move_list) EINA_ARG_NONNULL(2) EINA_WARN_UNUSED_RESULT; +EAPI void *eina_list_data_find(const Eina_List *list, const void *data) EINA_PURE EINA_ARG_NONNULL(2) EINA_WARN_UNUSED_RESULT; +EAPI Eina_List *eina_list_data_find_list (const Eina_List *list, const void *data) EINA_PURE EINA_ARG_NONNULL(2) EINA_WARN_UNUSED_RESULT; +EAPI Eina_List *eina_list_free (Eina_List *list); +EAPI void *eina_list_nth(const Eina_List *list, unsigned int n) EINA_PURE EINA_WARN_UNUSED_RESULT; +EAPI Eina_List *eina_list_nth_list (const Eina_List *list, unsigned int n) EINA_PURE EINA_WARN_UNUSED_RESULT; +EAPI Eina_List *eina_list_reverse (Eina_List *list) EINA_WARN_UNUSED_RESULT; +EAPI Eina_List *eina_list_sort (Eina_List *list, unsigned int size, Eina_Compare_Cb func) EINA_ARG_NONNULL(3) EINA_WARN_UNUSED_RESULT; +EAPI Eina_List *eina_list_merge (Eina_List *left, Eina_List *right) EINA_WARN_UNUSED_RESULT; +EAPI Eina_List *eina_list_sorted_merge(Eina_List *left, Eina_List *right, Eina_Compare_Cb func) EINA_ARG_NONNULL(3) EINA_WARN_UNUSED_RESULT; static inline Eina_List *eina_list_last (const Eina_List *list) EINA_PURE EINA_WARN_UNUSED_RESULT; diff --git a/legacy/eina/src/include/eina_rbtree.h b/legacy/eina/src/include/eina_rbtree.h index 75f5ca50d5..88eac6dc0a 100644 --- a/legacy/eina/src/include/eina_rbtree.h +++ b/legacy/eina/src/include/eina_rbtree.h @@ -56,10 +56,10 @@ typedef void (*Eina_Rbtree_Free_Cb)(Eina_Rbtree *node, void *data); #define EINA_RBTREE_FREE_CB(Function) ((Eina_Rbtree_Free_Cb) Function) EAPI Eina_Rbtree *eina_rbtree_inline_insert(Eina_Rbtree *root, Eina_Rbtree *node, Eina_Rbtree_Cmp_Node_Cb cmp, const void *data) EINA_ARG_NONNULL(2, 3) EINA_WARN_UNUSED_RESULT; -EAPI Eina_Rbtree *eina_rbtree_inline_remove(Eina_Rbtree *root, Eina_Rbtree *node, Eina_Rbtree_Cmp_Node_Cb cmp, const void *data) EINA_ARG_NONNULL(1, 2, 3) EINA_WARN_UNUSED_RESULT; -EAPI void eina_rbtree_delete(Eina_Rbtree *root, Eina_Rbtree_Free_Cb func, void *data) EINA_ARG_NONNULL(1, 2); +EAPI Eina_Rbtree *eina_rbtree_inline_remove(Eina_Rbtree *root, Eina_Rbtree *node, Eina_Rbtree_Cmp_Node_Cb cmp, const void *data) EINA_ARG_NONNULL(2, 3) EINA_WARN_UNUSED_RESULT; +EAPI void eina_rbtree_delete(Eina_Rbtree *root, Eina_Rbtree_Free_Cb func, void *data) EINA_ARG_NONNULL(2); -static inline Eina_Rbtree *eina_rbtree_inline_lookup(const Eina_Rbtree *root, const void *key, int length, Eina_Rbtree_Cmp_Key_Cb cmp, const void *data) EINA_PURE EINA_ARG_NONNULL(1, 2, 4) EINA_WARN_UNUSED_RESULT; +static inline Eina_Rbtree *eina_rbtree_inline_lookup(const Eina_Rbtree *root, const void *key, int length, Eina_Rbtree_Cmp_Key_Cb cmp, const void *data) EINA_PURE EINA_ARG_NONNULL(2, 4) EINA_WARN_UNUSED_RESULT; EAPI Eina_Iterator *eina_rbtree_iterator_prefix(const Eina_Rbtree *root) EINA_MALLOC EINA_WARN_UNUSED_RESULT; EAPI Eina_Iterator *eina_rbtree_iterator_infix(const Eina_Rbtree *root) EINA_MALLOC EINA_WARN_UNUSED_RESULT; diff --git a/legacy/eina/src/include/eina_safety_checks.h b/legacy/eina/src/include/eina_safety_checks.h new file mode 100644 index 0000000000..620eb20930 --- /dev/null +++ b/legacy/eina/src/include/eina_safety_checks.h @@ -0,0 +1,119 @@ +/* EINA - EFL data type library + * Copyright (C) 2008 Gustavo Sverzut Barbieri + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; + * if not, see . + */ + +#ifndef EINA_SAFETY_CHECKS_H_ +#define EINA_SAFETY_CHECKS_H_ +#ifdef EINA_SAFETY_CHECKS + +#include "eina_error.h" + +#define EINA_SAFETY_ON_NULL_RETURN(exp) \ + do \ + { \ + if (EINA_UNLIKELY((exp) == NULL)) \ + { \ + EINA_ERROR_PERR("%s", "safety check failed: " #exp " == NULL\n"); \ + return; \ + } \ + } \ + while (0) + +#define EINA_SAFETY_ON_NULL_RETURN_VAL(exp, val) \ + do \ + { \ + if (EINA_UNLIKELY((exp) == NULL)) \ + { \ + EINA_ERROR_PERR("%s", "safety check failed: " #exp " == NULL\n"); \ + return (val); \ + } \ + } \ + while (0) + +#define EINA_SAFETY_ON_TRUE_RETURN(exp) \ + do \ + { \ + if (EINA_UNLIKELY(exp)) \ + { \ + EINA_ERROR_PERR("%s", "safety check failed: " #exp " is true\n"); \ + return; \ + } \ + } \ + while (0) + +#define EINA_SAFETY_ON_TRUE_RETURN_VAL(exp, val) \ + do \ + { \ + if (EINA_UNLIKELY(exp)) \ + { \ + EINA_ERROR_PERR("%s", "safety check failed: " #exp " is true\n"); \ + return val; \ + } \ + } \ + while (0) + +#define EINA_SAFETY_ON_FALSE_RETURN(exp) \ + do \ + { \ + if (EINA_UNLIKELY(!(exp))) \ + { \ + EINA_ERROR_PERR("%s", "safety check failed: " #exp " is false\n"); \ + return; \ + } \ + } \ + while (0) + +#define EINA_SAFETY_ON_FALSE_RETURN_VAL(exp, val) \ + do \ + { \ + if (EINA_UNLIKELY(!(exp))) \ + { \ + EINA_ERROR_PERR("%s", "safety check failed: " #exp " is false\n"); \ + return val; \ + } \ + } \ + while (0) + +#ifdef EINA_ARG_NONNULL +/* make EINA_ARG_NONNULL void so GCC does not optimize safety checks */ +#undef EINA_ARG_NONNULL +#define EINA_ARG_NONNULL(idx, ...) +#endif + + +#else /* no safety checks */ + +#define EINA_SAFETY_ON_NULL_RETURN(exp) \ + do { (void)((exp) == NULL) } while (0) + +#define EINA_SAFETY_ON_NULL_RETURN_VAL(exp, val) \ + do { if (0 && (exp) == NULL) (void)val; } while (0) + +#define EINA_SAFETY_ON_TRUE_RETURN(exp) \ + do { (void)(exp) } while (0) + +#define EINA_SAFETY_ON_TRUE_RETURN_VAL(exp, val) \ + do { if (0 && (exp)) (void)val; } while (0) + +#define EINA_SAFETY_ON_FALSE_RETURN(exp) \ + do { (void)((!exp)) } while (0) + +#define EINA_SAFETY_ON_FALSE_RETURN_VAL(exp, val) \ + do { if (0 && !(exp)) (void)val; } while (0) + +#endif /* safety checks macros */ +#endif /* EINA_SAFETY_CHECKS_H_ */ diff --git a/legacy/eina/src/include/eina_types.h b/legacy/eina/src/include/eina_types.h index 253d03edde..400a869999 100644 --- a/legacy/eina/src/include/eina_types.h +++ b/legacy/eina/src/include/eina_types.h @@ -69,6 +69,12 @@ #ifdef EINA_CONST # undef EINA_CONST #endif +#ifdef EINA_UNLIKELY +# undef EINA_UNLIKELY +#endif +#ifdef EINA_LIKELY +# undef EINA_LIKELY +#endif #ifdef HAVE___ATTRIBUTE__ # ifdef __GNUC__ @@ -78,7 +84,7 @@ # define EINA_WARN_UNUSED_RESULT # endif -# if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) +# if (!defined(EINA_SAFETY_CHECKS)) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)) # define EINA_ARG_NONNULL(idx, ...) __attribute__ ((nonnull(idx, ## __VA_ARGS__))) # else # define EINA_ARG_NONNULL(idx, ...) @@ -97,11 +103,15 @@ # define EINA_SCANF(fmt, arg) __attribute__((format (scanf, fmt, arg))) # define EINA_FORMAT(fmt) __attribute__((format_arg(fmt))) # define EINA_CONST __attribute__((const)) +# define EINA_UNLIKELY(exp) __builtin_expect((exp), 0) +# define EINA_LIKELY(exp) __builtin_expect((exp), 1) # else # define EINA_PRINTF(fmt, arg) # define EINA_SCANF(fmt, arg) # define EINA_FORMAT(fmt) # define EINA_CONST +# define EINA_UNLIKELY(exp) +# define EINA_LIKELY(exp) # endif # else /* no __GNUC__ */ # define EINA_WARN_UNUSED_RESULT @@ -112,6 +122,8 @@ # define EINA_SCANF(fmt, arg) # define EINA_FORMAT(fmt) # define EINA_CONST +# define EINA_UNLIKELY(exp) +# define EINA_LIKELY(exp) # endif #else /* no HAVE___ATTRIBUTE__ */ # define EINA_WARN_UNUSED_RESULT @@ -122,6 +134,8 @@ # define EINA_SCANF(fmt, arg) # define EINA_FORMAT(fmt) # define EINA_CONST +# define EINA_UNLIKELY(exp) +# define EINA_LIKELY(exp) #endif diff --git a/legacy/eina/src/lib/eina_accessor.c b/legacy/eina/src/lib/eina_accessor.c index 16b3e89034..520ec092bd 100644 --- a/legacy/eina/src/lib/eina_accessor.c +++ b/legacy/eina/src/lib/eina_accessor.c @@ -28,6 +28,7 @@ #include "eina_private.h" #include "eina_accessor.h" +#include "eina_safety_checks.h" /*============================================================================* * Local * @@ -92,7 +93,9 @@ EAPI void eina_accessor_free(Eina_Accessor *accessor) { EINA_MAGIC_CHECK_ACCESSOR(accessor); - if (accessor) accessor->free(accessor); + EINA_SAFETY_ON_NULL_RETURN(accessor); + EINA_SAFETY_ON_NULL_RETURN(accessor->free); + accessor->free(accessor); } /** @@ -108,7 +111,8 @@ EAPI void * eina_accessor_container_get(Eina_Accessor *accessor) { EINA_MAGIC_CHECK_ACCESSOR(accessor); - if (!accessor) return NULL; + EINA_SAFETY_ON_NULL_RETURN_VAL(accessor, NULL); + EINA_SAFETY_ON_NULL_RETURN_VAL(accessor->get_container, NULL); return accessor->get_container(accessor); } @@ -129,7 +133,9 @@ EAPI Eina_Bool eina_accessor_data_get(Eina_Accessor *accessor, unsigned int position, void **data) { EINA_MAGIC_CHECK_ACCESSOR(accessor); - if (!accessor) return EINA_FALSE; + EINA_SAFETY_ON_NULL_RETURN_VAL(accessor, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(accessor->get_at, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(data, EINA_FALSE); return accessor->get_at(accessor, position, data); } @@ -156,16 +162,18 @@ eina_accessor_over(Eina_Accessor *accessor, unsigned int end, const void *fdata) { - void *container; + const void *container; void *data; unsigned int i; 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); + EINA_SAFETY_ON_FALSE_RETURN(start < end); - if (!accessor) return ; - if (!(start < end)) return ; - - container = eina_accessor_container_get(accessor); + container = accessor->get_container(accessor); for (i = start; i < end && accessor->get_at(accessor, i, &data) == EINA_TRUE; ++i) if (cb(container, data, (void*) fdata) != EINA_TRUE) return ; } diff --git a/legacy/eina/src/lib/eina_array.c b/legacy/eina/src/lib/eina_array.c index 5932ea936f..207eaeb147 100644 --- a/legacy/eina/src/lib/eina_array.c +++ b/legacy/eina/src/lib/eina_array.c @@ -39,6 +39,7 @@ #include "eina_array.h" #include "eina_inline_array.x" #include "eina_private.h" +#include "eina_safety_checks.h" /*============================================================================* * Local * @@ -148,6 +149,7 @@ eina_array_grow(Eina_Array *array) unsigned int total; EINA_MAGIC_CHECK_ARRAY(array); + EINA_SAFETY_ON_NULL_RETURN_VAL(array, EINA_FALSE); total = array->total + array->step; eina_error_set(0); @@ -318,6 +320,7 @@ eina_array_free(Eina_Array *array) eina_array_flush(array); EINA_MAGIC_CHECK_ARRAY(array); + EINA_SAFETY_ON_NULL_RETURN(array); MAGIC_FREE(array); } @@ -334,6 +337,7 @@ eina_array_free(Eina_Array *array) EAPI void eina_array_step_set(Eina_Array *array, unsigned int step) { + EINA_SAFETY_ON_NULL_RETURN(array); array->data = NULL; array->total = 0; array->count = 0; @@ -354,6 +358,7 @@ EAPI void eina_array_clean(Eina_Array *array) { EINA_MAGIC_CHECK_ARRAY(array); + EINA_SAFETY_ON_NULL_RETURN(array); array->count = 0; } @@ -371,10 +376,12 @@ EAPI void eina_array_flush(Eina_Array *array) { EINA_MAGIC_CHECK_ARRAY(array); + EINA_SAFETY_ON_NULL_RETURN(array); array->count = 0; array->total = 0; - if (array->data) free(array->data); + if (!array->data) return; + free(array->data); array->data = NULL; } @@ -405,6 +412,9 @@ eina_array_remove(Eina_Array *array, Eina_Bool (*keep)(void *data, void *gdata), unsigned int i; EINA_MAGIC_CHECK_ARRAY(array); + EINA_SAFETY_ON_NULL_RETURN_VAL(array, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(keep, EINA_FALSE); + if (array->total == 0) return EINA_TRUE; for (i = 0; i < array->count; ++i) @@ -492,7 +502,9 @@ eina_array_iterator_new(const Eina_Array *array) { Eina_Iterator_Array *it; - if (!array) return NULL; + EINA_MAGIC_CHECK_ARRAY(array); + EINA_SAFETY_ON_NULL_RETURN_VAL(array, NULL); + if (eina_array_count_get(array) <= 0) return NULL; eina_error_set(0); @@ -531,7 +543,8 @@ eina_array_accessor_new(const Eina_Array *array) { Eina_Accessor_Array *it; - if (!array) return NULL; + EINA_MAGIC_CHECK_ARRAY(array); + EINA_SAFETY_ON_NULL_RETURN_VAL(array, NULL); eina_error_set(0); it = calloc(1, sizeof (Eina_Accessor_Array)); diff --git a/legacy/eina/src/lib/eina_convert.c b/legacy/eina/src/lib/eina_convert.c index 04d0bf79db..7b13ba7c7e 100644 --- a/legacy/eina/src/lib/eina_convert.c +++ b/legacy/eina/src/lib/eina_convert.c @@ -25,6 +25,7 @@ #include #include "eina_convert.h" +#include "eina_safety_checks.h" /*============================================================================* * Local * @@ -277,6 +278,8 @@ eina_convert_itoa(int n, char *s) int i = 0; int r = 0; + EINA_SAFETY_ON_NULL_RETURN_VAL(s, 0); + if (n < 0) { n = -n; @@ -316,6 +319,8 @@ eina_convert_xtoa(unsigned int n, char *s) { int i; + EINA_SAFETY_ON_NULL_RETURN_VAL(s, 0); + i = 0; do { s[i++] = look_up_table[n & 0xF]; @@ -379,6 +384,10 @@ eina_convert_atod(const char *src, int length, long long *m, long *e) int nbr_decimals = 0; int sign = 1; + EINA_SAFETY_ON_NULL_RETURN_VAL(src, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(m, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(e, EINA_FALSE); + if (length <= 0) goto on_length_error; /* Compute the mantisse. */ @@ -487,6 +496,8 @@ eina_convert_dtoa(double d, char *des) int p; int i; + EINA_SAFETY_ON_NULL_RETURN_VAL(des, EINA_FALSE); + if (d < 0.0) { *(des++) = '-'; diff --git a/legacy/eina/src/lib/eina_counter.c b/legacy/eina/src/lib/eina_counter.c index 8ddc0313af..992e8185b0 100644 --- a/legacy/eina/src/lib/eina_counter.c +++ b/legacy/eina/src/lib/eina_counter.c @@ -36,6 +36,7 @@ #include "eina_inlist.h" #include "eina_error.h" #include "eina_private.h" +#include "eina_safety_checks.h" /*============================================================================* * Local * @@ -299,7 +300,7 @@ eina_counter_add(const char *name) Eina_Counter *counter; int length; - if (!name) return NULL; + EINA_SAFETY_ON_NULL_RETURN_VAL(name, NULL); length = strlen(name) + 1; @@ -330,7 +331,7 @@ eina_counter_add(const char *name) EAPI void eina_counter_delete(Eina_Counter *counter) { - if (!counter) return; + EINA_SAFETY_ON_NULL_RETURN(counter); while (counter->clocks) { @@ -365,7 +366,7 @@ eina_counter_start(Eina_Counter *counter) Eina_Clock *clk; Eina_Nano_Time tp; - if (!counter) return; + EINA_SAFETY_ON_NULL_RETURN(counter); if (_eina_counter_time_get(&tp) != 0) return; eina_error_set(0); @@ -400,7 +401,7 @@ eina_counter_stop(Eina_Counter *counter, int specimen) Eina_Clock *clk; Eina_Nano_Time tp; - if (!counter) return; + EINA_SAFETY_ON_NULL_RETURN(counter); if (_eina_counter_time_get(&tp) != 0) return; clk = (Eina_Clock *) counter->clocks; @@ -436,7 +437,7 @@ eina_counter_dump(Eina_Counter *counter) char *result = NULL; int position = 0; - if (!counter) return NULL; + EINA_SAFETY_ON_NULL_RETURN_VAL(counter, NULL); result = _eina_counter_asiprintf(result, &position, "# specimen\texperiment time\tstarting time\tending time\n"); if (!result) return NULL; diff --git a/legacy/eina/src/lib/eina_error.c b/legacy/eina/src/lib/eina_error.c index 3e9e881b53..1f0adec95f 100644 --- a/legacy/eina/src/lib/eina_error.c +++ b/legacy/eina/src/lib/eina_error.c @@ -361,6 +361,7 @@ #include "eina_error.h" #include "eina_inlist.h" #include "eina_private.h" +#include "eina_safety_checks.h" /* TODO * + printing errors to stdout or stderr can be implemented @@ -588,6 +589,8 @@ EAPI Eina_Error eina_error_msg_register(const char *msg) Eina_Inlist *tmp; int length; + EINA_SAFETY_ON_NULL_RETURN_VAL(msg, 0); + length = strlen(msg) + 1; tmp = malloc(sizeof (Eina_Inlist) + length); @@ -686,6 +689,10 @@ EAPI void eina_error_print(Eina_Error_Level level, const char *file, if (level > _error_level) return; + EINA_SAFETY_ON_NULL_RETURN(file); + EINA_SAFETY_ON_NULL_RETURN(fnc); + EINA_SAFETY_ON_NULL_RETURN(fmt); + va_start(args, fmt); _print_cb(level, file, fnc, line, fmt, _print_cb_data, args); va_end(args); diff --git a/legacy/eina/src/lib/eina_file.c b/legacy/eina/src/lib/eina_file.c index cd1f2e6ef7..131dd5da25 100644 --- a/legacy/eina/src/lib/eina_file.c +++ b/legacy/eina/src/lib/eina_file.c @@ -60,6 +60,7 @@ void *alloca (size_t); #include "eina_file.h" #include "eina_private.h" +#include "eina_safety_checks.h" /*============================================================================* * Global * @@ -114,12 +115,14 @@ void *alloca (size_t); EAPI Eina_Bool eina_file_dir_list(const char *dir, Eina_Bool recursive, Eina_File_Dir_List_Cb cb, void *data) { + EINA_SAFETY_ON_NULL_RETURN_VAL(cb, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(dir, EINA_FALSE); + EINA_SAFETY_ON_TRUE_RETURN_VAL(dir[0] == '\0', EINA_FALSE); + #ifndef _WIN32 struct dirent *de; DIR *d; - if (!cb) return EINA_FALSE; - d = opendir(dir); if (!d) return EINA_FALSE; @@ -166,9 +169,6 @@ eina_file_dir_list(const char *dir, Eina_Bool recursive, Eina_File_Dir_List_Cb c TCHAR *tdir; int length_dir; - if (!cb) return EINA_FALSE; - if (!dir || (*dir == '\0')) return EINA_FALSE; - length_dir = strlen(dir); new_dir = (char *)alloca(length_dir + 5); if (!new_dir) return EINA_FALSE; @@ -248,7 +248,7 @@ eina_file_split(char *path) char *current; int length; - if (!path) return NULL; + EINA_SAFETY_ON_NULL_RETURN_VAL(path, NULL); ea = eina_array_new(16); diff --git a/legacy/eina/src/lib/eina_hash.c b/legacy/eina/src/lib/eina_hash.c index 7f6ce48bb1..1fe87438c4 100644 --- a/legacy/eina/src/lib/eina_hash.c +++ b/legacy/eina/src/lib/eina_hash.c @@ -29,6 +29,7 @@ #include "eina_rbtree.h" #include "eina_error.h" #include "eina_private.h" +#include "eina_safety_checks.h" /*============================================================================* * Local * @@ -190,7 +191,9 @@ eina_hash_add_alloc_by_hash(Eina_Hash *hash, int hash_num; EINA_MAGIC_CHECK_HASH(hash); - if ((!hash) || (!key) || (!data)) goto on_error; + EINA_SAFETY_ON_NULL_RETURN_VAL(hash, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(key, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(data, EINA_FALSE); error = EINA_ERROR_OUT_OF_MEMORY; /* Apply eina mask to hash. */ @@ -385,8 +388,9 @@ _eina_hash_del_by_key_hash(Eina_Hash *hash, const void *key, int key_length, int Eina_Hash_Tuple tuple; EINA_MAGIC_CHECK_HASH(hash); - if (!hash) return EINA_FALSE; - if (!key) return EINA_FALSE; + EINA_SAFETY_ON_NULL_RETURN_VAL(hash, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(key, EINA_FALSE); + if (!hash->buckets) return EINA_FALSE; tuple.key = (void *) key; @@ -676,6 +680,7 @@ eina_hash_shutdown(void) eina_error_shutdown(); return --_eina_hash_init_count; } + EAPI Eina_Hash * eina_hash_new(Eina_Key_Length key_length_cb, Eina_Key_Cmp key_cmp_cb, @@ -687,8 +692,11 @@ eina_hash_new(Eina_Key_Length key_length_cb, Eina_Hash *new; eina_error_set(0); - if (!key_length_cb || !key_cmp_cb || !key_hash_cb) return NULL; - if (buckets_power_size < 3 || buckets_power_size > 16) return NULL; + EINA_SAFETY_ON_NULL_RETURN_VAL(key_length_cb, NULL); + EINA_SAFETY_ON_NULL_RETURN_VAL(key_cmp_cb, NULL); + EINA_SAFETY_ON_NULL_RETURN_VAL(key_hash_cb, NULL); + EINA_SAFETY_ON_TRUE_RETURN_VAL(buckets_power_size < 3, NULL); + EINA_SAFETY_ON_TRUE_RETURN_VAL(buckets_power_size > 16, NULL); new = malloc(sizeof (Eina_Hash)); if (!new) goto on_error; @@ -789,7 +797,7 @@ EAPI int eina_hash_population(const Eina_Hash *hash) { EINA_MAGIC_CHECK_HASH(hash); - if (!hash) return 0; + EINA_SAFETY_ON_NULL_RETURN_VAL(hash, 0); return hash->population; } @@ -817,7 +825,7 @@ eina_hash_free(Eina_Hash *hash) int i; EINA_MAGIC_CHECK_HASH(hash); - if (!hash) return; + EINA_SAFETY_ON_NULL_RETURN(hash); if (hash->buckets) for (i = 0; i < hash->size; i++) @@ -916,7 +924,11 @@ eina_hash_add(Eina_Hash *hash, const void *key, const void *data) int key_hash; EINA_MAGIC_CHECK_HASH(hash); - if ((!hash) || (!key) || (!data)) return EINA_FALSE; + EINA_SAFETY_ON_NULL_RETURN_VAL(hash, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(hash->key_length_cb, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(hash->key_hash_cb, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(key, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(data, EINA_FALSE); key_length = hash->key_length_cb(key); key_hash = hash->key_hash_cb(key, key_length); @@ -951,7 +963,11 @@ eina_hash_direct_add(Eina_Hash *hash, const void *key, const void *data) int key_hash; EINA_MAGIC_CHECK_HASH(hash); - if ((!hash) || (!key) || (!data)) return EINA_FALSE; + EINA_SAFETY_ON_NULL_RETURN_VAL(hash, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(hash->key_length_cb, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(hash->key_hash_cb, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(key, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(data, EINA_FALSE); key_length = hash->key_length_cb(key); key_hash = hash->key_hash_cb(key, key_length); @@ -976,6 +992,8 @@ eina_hash_direct_add(Eina_Hash *hash, const void *key, const void *data) EAPI Eina_Bool eina_hash_del_by_key_hash(Eina_Hash *hash, const void *key, int key_length, int key_hash) { + EINA_SAFETY_ON_NULL_RETURN_VAL(hash, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(key, EINA_FALSE); return _eina_hash_del_by_key_hash(hash, key, key_length, key_hash, NULL); } @@ -996,6 +1014,8 @@ eina_hash_del_by_key_hash(Eina_Hash *hash, const void *key, int key_length, int EAPI Eina_Bool eina_hash_del_by_key(Eina_Hash *hash, const void *key) { + EINA_SAFETY_ON_NULL_RETURN_VAL(hash, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(key, EINA_FALSE); return _eina_hash_del_by_key(hash, key, NULL); } @@ -1019,8 +1039,8 @@ eina_hash_del_by_data(Eina_Hash *hash, const void *data) int key_hash; EINA_MAGIC_CHECK_HASH(hash); - if (!hash) return EINA_FALSE; - if (!data) return EINA_FALSE; + EINA_SAFETY_ON_NULL_RETURN_VAL(hash, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(data, EINA_FALSE); el = _eina_hash_find_by_data(hash, data, &key_hash, &eh); if (!el) return EINA_FALSE; @@ -1051,6 +1071,8 @@ eina_hash_del_by_data(Eina_Hash *hash, const void *data) EAPI Eina_Bool eina_hash_del_by_hash(Eina_Hash *hash, const void *key, int key_length, int key_hash, const void *data) { + EINA_MAGIC_CHECK_HASH(hash); + EINA_SAFETY_ON_NULL_RETURN_VAL(hash, EINA_FALSE); if (key) return _eina_hash_del_by_key_hash(hash, key, key_length, key_hash, data); else return eina_hash_del_by_data(hash, data); } @@ -1077,6 +1099,8 @@ eina_hash_del_by_hash(Eina_Hash *hash, const void *key, int key_length, int key_ EAPI Eina_Bool eina_hash_del(Eina_Hash *hash, const void *key, const void *data) { + EINA_MAGIC_CHECK_HASH(hash); + EINA_SAFETY_ON_NULL_RETURN_VAL(hash, EINA_FALSE); if (key) return _eina_hash_del_by_key(hash, key, data); else return eina_hash_del_by_data(hash, data); } @@ -1097,8 +1121,9 @@ eina_hash_find_by_hash(const Eina_Hash *hash, const void *key, int key_length, i Eina_Hash_El *el; Eina_Hash_Tuple tuple; - if ((!hash) || (!key)) return NULL; EINA_MAGIC_CHECK_HASH(hash); + EINA_SAFETY_ON_NULL_RETURN_VAL(hash, NULL); + EINA_SAFETY_ON_NULL_RETURN_VAL(key, NULL); tuple.key = key; tuple.key_length = key_length; @@ -1122,8 +1147,11 @@ eina_hash_find(const Eina_Hash *hash, const void *key) int key_length; int hash_num; - if ((!hash) || (!key)) return NULL; EINA_MAGIC_CHECK_HASH(hash); + EINA_SAFETY_ON_NULL_RETURN_VAL(hash, NULL); + EINA_SAFETY_ON_NULL_RETURN_VAL(hash->key_length_cb, NULL); + EINA_SAFETY_ON_NULL_RETURN_VAL(hash->key_hash_cb, NULL); + EINA_SAFETY_ON_NULL_RETURN_VAL(key, NULL); key_length = hash->key_length_cb(key); hash_num = hash->key_hash_cb(key, key_length); @@ -1151,7 +1179,10 @@ eina_hash_modify_by_hash(Eina_Hash *hash, const void *key, int key_length, int k Eina_Hash_Tuple tuple; EINA_MAGIC_CHECK_HASH(hash); - if (!hash) return NULL; + EINA_SAFETY_ON_NULL_RETURN_VAL(hash, NULL); + EINA_SAFETY_ON_NULL_RETURN_VAL(key, NULL); + EINA_SAFETY_ON_NULL_RETURN_VAL(data, NULL); + tuple.key = key; tuple.key_length = key_length; tuple.data = NULL; @@ -1182,7 +1213,11 @@ eina_hash_modify(Eina_Hash *hash, const void *key, const void *data) int hash_num; EINA_MAGIC_CHECK_HASH(hash); - if (!hash) return NULL; + EINA_SAFETY_ON_NULL_RETURN_VAL(hash, NULL); + EINA_SAFETY_ON_NULL_RETURN_VAL(hash->key_length_cb, NULL); + EINA_SAFETY_ON_NULL_RETURN_VAL(hash->key_hash_cb, NULL); + EINA_SAFETY_ON_NULL_RETURN_VAL(key, NULL); + EINA_SAFETY_ON_NULL_RETURN_VAL(data, NULL); key_length = hash->key_length_cb(key); hash_num = hash->key_hash_cb(key, key_length); @@ -1235,7 +1270,8 @@ eina_hash_foreach(const Eina_Hash *hash, Eina_Hash_Foreach_Data foreach; EINA_MAGIC_CHECK_HASH(hash); - if (!hash) return; + EINA_SAFETY_ON_NULL_RETURN(hash); + EINA_SAFETY_ON_NULL_RETURN(func); foreach.cb = func; foreach.fdata = fdata; @@ -1253,8 +1289,7 @@ eina_hash_iterator_data_new(const Eina_Hash *hash) Eina_Iterator_Hash *it; EINA_MAGIC_CHECK_HASH(hash); - if (!hash) return NULL; - if (hash->population <= 0) return NULL; + EINA_SAFETY_ON_NULL_RETURN_VAL(hash, NULL); it = calloc(1, sizeof (Eina_Iterator_Hash)); if (!it) return NULL; @@ -1278,8 +1313,7 @@ eina_hash_iterator_key_new(const Eina_Hash *hash) Eina_Iterator_Hash *it; EINA_MAGIC_CHECK_HASH(hash); - if (!hash) return NULL; - if (hash->population <= 0) return NULL; + EINA_SAFETY_ON_NULL_RETURN_VAL(hash, NULL); it = calloc(1, sizeof (Eina_Iterator_Hash)); if (!it) return NULL; @@ -1303,8 +1337,7 @@ eina_hash_iterator_tuple_new(const Eina_Hash *hash) Eina_Iterator_Hash *it; EINA_MAGIC_CHECK_HASH(hash); - if (!hash) return NULL; - if (hash->population <= 0) return NULL; + EINA_SAFETY_ON_NULL_RETURN_VAL(hash, NULL); it = calloc(1, sizeof (Eina_Iterator_Hash)); if (!it) return NULL; diff --git a/legacy/eina/src/lib/eina_inlist.c b/legacy/eina/src/lib/eina_inlist.c index afe06352c1..463579a486 100644 --- a/legacy/eina/src/lib/eina_inlist.c +++ b/legacy/eina/src/lib/eina_inlist.c @@ -26,6 +26,7 @@ #include "eina_inlist.h" #include "eina_error.h" #include "eina_private.h" +#include "eina_safety_checks.h" /* FIXME: TODO please, refactor this :) */ @@ -142,6 +143,8 @@ eina_inlist_append(Eina_Inlist *list, Eina_Inlist *new_l) { Eina_Inlist *l; + EINA_SAFETY_ON_NULL_RETURN_VAL(new_l, list); + new_l->next = NULL; if (!list) { new_l->prev = NULL; @@ -165,6 +168,8 @@ eina_inlist_append(Eina_Inlist *list, Eina_Inlist *new_l) EAPI Eina_Inlist * eina_inlist_prepend(Eina_Inlist *list, Eina_Inlist *new_l) { + EINA_SAFETY_ON_NULL_RETURN_VAL(new_l, list); + new_l->prev = NULL; if (!list) { new_l->next = NULL; @@ -186,6 +191,8 @@ eina_inlist_append_relative(Eina_Inlist *list, Eina_Inlist *new_l, Eina_Inlist *relative) { + EINA_SAFETY_ON_NULL_RETURN_VAL(new_l, list); + if (relative) { if (relative->next) { new_l->next = relative->next; @@ -209,6 +216,8 @@ eina_inlist_prepend_relative(Eina_Inlist *list, Eina_Inlist *new_l, Eina_Inlist *relative) { + EINA_SAFETY_ON_NULL_RETURN_VAL(new_l, list); + if (relative) { new_l->prev = relative->prev; new_l->next = relative; @@ -239,8 +248,8 @@ eina_inlist_remove(Eina_Inlist *list, Eina_Inlist *item) Eina_Inlist *return_l; /* checkme */ - if (!list) return list; - if (!item) return list; + EINA_SAFETY_ON_NULL_RETURN_VAL(list, NULL); + EINA_SAFETY_ON_NULL_RETURN_VAL(item, list); if (item->next) item->next->prev = item->prev; @@ -266,8 +275,10 @@ eina_inlist_remove(Eina_Inlist *list, Eina_Inlist *item) EAPI Eina_Inlist * eina_inlist_promote(Eina_Inlist *list, Eina_Inlist *item) { + EINA_SAFETY_ON_NULL_RETURN_VAL(list, NULL); + EINA_SAFETY_ON_NULL_RETURN_VAL(item, list); + if (item == list) return list; - if (!item || !list) return list; if (item->next) item->next->prev = item->prev; @@ -294,7 +305,9 @@ eina_inlist_demote(Eina_Inlist *list, Eina_Inlist *item) { Eina_Inlist *l; - if (!item || !list) return list; + EINA_SAFETY_ON_NULL_RETURN_VAL(list, NULL); + EINA_SAFETY_ON_NULL_RETURN_VAL(item, list); + if (list->last == item) return list; if (!list->last) @@ -339,8 +352,6 @@ eina_inlist_iterator_new(const Eina_Inlist *list) { Eina_Iterator_Inlist *it; - if (!list) return NULL; - eina_error_set(0); it = calloc(1, sizeof (Eina_Iterator_Inlist)); if (!it) { @@ -365,8 +376,6 @@ eina_inlist_accessor_new(const Eina_Inlist *list) { Eina_Accessor_Inlist *it; - if (!list) return NULL; - eina_error_set(0); it = calloc(1, sizeof (Eina_Accessor_Inlist)); if (!it) { diff --git a/legacy/eina/src/lib/eina_iterator.c b/legacy/eina/src/lib/eina_iterator.c index 786a4c8785..b2f7383a66 100644 --- a/legacy/eina/src/lib/eina_iterator.c +++ b/legacy/eina/src/lib/eina_iterator.c @@ -28,6 +28,7 @@ #include "eina_private.h" #include "eina_iterator.h" +#include "eina_safety_checks.h" /*============================================================================* * Local * @@ -93,7 +94,9 @@ EAPI void eina_iterator_free(Eina_Iterator *iterator) { EINA_MAGIC_CHECK_ITERATOR(iterator); - if (iterator) iterator->free(iterator); + EINA_SAFETY_ON_NULL_RETURN(iterator); + EINA_SAFETY_ON_NULL_RETURN(iterator->free); + iterator->free(iterator); } /** @@ -109,7 +112,8 @@ EAPI void * eina_iterator_container_get(Eina_Iterator *iterator) { EINA_MAGIC_CHECK_ITERATOR(iterator); - if (!iterator) return NULL; + EINA_SAFETY_ON_NULL_RETURN_VAL(iterator, NULL); + EINA_SAFETY_ON_NULL_RETURN_VAL(iterator->get_container, NULL); return iterator->get_container(iterator); } @@ -130,6 +134,9 @@ eina_iterator_next(Eina_Iterator *iterator, void **data) { if (!iterator) 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); } @@ -150,12 +157,14 @@ eina_iterator_foreach(Eina_Iterator *iterator, Eina_Each cb, const void *fdata) { - void *container; + 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); container = iterator->get_container(iterator); while (iterator->next(iterator, &data) == EINA_TRUE) { diff --git a/legacy/eina/src/lib/eina_lalloc.c b/legacy/eina/src/lib/eina_lalloc.c index 50f5699a21..3ca9cf4e04 100644 --- a/legacy/eina/src/lib/eina_lalloc.c +++ b/legacy/eina/src/lib/eina_lalloc.c @@ -24,6 +24,7 @@ #include "eina_lalloc.h" #include "eina_private.h" +#include "eina_safety_checks.h" /*============================================================================* * Local * @@ -65,6 +66,9 @@ EAPI Eina_Lalloc * eina_lalloc_new(void *data, Eina_Lalloc_Alloc alloc_cb, Eina_ { Eina_Lalloc *a; + EINA_SAFETY_ON_NULL_RETURN_VAL(alloc_cb, NULL); + EINA_SAFETY_ON_NULL_RETURN_VAL(free_cb, NULL); + a = calloc(1, sizeof(Eina_Lalloc)); a->data = data; a->alloc_cb = alloc_cb; @@ -79,12 +83,17 @@ EAPI Eina_Lalloc * eina_lalloc_new(void *data, Eina_Lalloc_Alloc alloc_cb, Eina_ EAPI void eina_lalloc_delete(Eina_Lalloc *a) { + EINA_SAFETY_ON_NULL_RETURN(a); + EINA_SAFETY_ON_NULL_RETURN(a->free_cb); a->free_cb(a->data); free(a); } EAPI Eina_Bool eina_lalloc_element_add(Eina_Lalloc *a) { + EINA_SAFETY_ON_NULL_RETURN_VAL(a, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(a->alloc_cb, EINA_FALSE); + if (a->num_elements == a->num_allocated) { if (a->alloc_cb(a->data, (1 << a->acc)) == EINA_TRUE) @@ -104,6 +113,9 @@ EAPI Eina_Bool eina_lalloc_elements_add(Eina_Lalloc *a, int num) { int tmp; + EINA_SAFETY_ON_NULL_RETURN_VAL(a, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(a->alloc_cb, EINA_FALSE); + tmp = a->num_elements + num; if (tmp > a->num_allocated) { diff --git a/legacy/eina/src/lib/eina_list.c b/legacy/eina/src/lib/eina_list.c index d82afedc74..fec8b6f1b9 100644 --- a/legacy/eina/src/lib/eina_list.c +++ b/legacy/eina/src/lib/eina_list.c @@ -76,6 +76,8 @@ #include "eina_list.h" #include "eina_mempool.h" #include "eina_private.h" +#include "eina_safety_checks.h" + /*============================================================================* * Local * @@ -498,7 +500,7 @@ eina_list_shutdown(void) * @param data The data to append. * @return A list pointer. * - * This function appends @p data to @p list. If @p data is @c NULL, a + * This function appends @p data to @p list. If @p list is @c NULL, a * new list is returned. On success, a new list pointer that should be * used in place of the one given to this function is * returned. Otherwise, the old pointer is returned. @@ -553,7 +555,7 @@ eina_list_append(Eina_List *list, const void *data) * @param data The data to prepend. * @return A list pointer. * - * This function prepends @p data to @p list. If @p data is @c NULL, a + * This function prepends @p data to @p list. If @p list is @c NULL, a * new list is returned. On success, a new list pointer that should be * used in place of the one given to this function is * returned. Otherwise, the old pointer is returned. @@ -1242,8 +1244,8 @@ eina_list_sort(Eina_List *list, unsigned int size, Eina_Compare_Cb func) Eina_List *unsort = NULL; Eina_List *stack[EINA_LIST_SORT_STACK_SIZE]; - if (!list || !func) return NULL; - + EINA_SAFETY_ON_NULL_RETURN_VAL(func, list); + if (!list) return NULL; EINA_MAGIC_CHECK_LIST(list); /* if the caller specified an invalid size, sort the whole list */ @@ -1376,9 +1378,10 @@ eina_list_sorted_merge(Eina_List *left, Eina_List *right, Eina_Compare_Cb func) Eina_List *ret; Eina_List *current; + EINA_SAFETY_ON_NULL_RETURN_VAL(func, NULL); + if (!left) return right; if (!right) return left; - if (!func) return NULL; if (func(left->data, right->data) < 0) { @@ -1460,8 +1463,6 @@ eina_list_iterator_new(const Eina_List *list) { Eina_Iterator_List *it; - if (!list) return NULL; - eina_error_set(0); it = calloc(1, sizeof (Eina_Iterator_List)); if (!it) { @@ -1499,8 +1500,6 @@ eina_list_accessor_new(const Eina_List *list) { Eina_Accessor_List *it; - if (!list) return NULL; - eina_error_set(0); it = calloc(1, sizeof (Eina_Accessor_List)); if (!it) { diff --git a/legacy/eina/src/lib/eina_mempool.c b/legacy/eina/src/lib/eina_mempool.c index a796d2d5be..3a0f2f209d 100644 --- a/legacy/eina/src/lib/eina_mempool.c +++ b/legacy/eina/src/lib/eina_mempool.c @@ -29,6 +29,7 @@ #include "eina_hash.h" #include "eina_module.h" #include "eina_private.h" +#include "eina_safety_checks.h" /*============================================================================* * Local * @@ -202,7 +203,7 @@ eina_mempool_new(const char *name, const char *context, const char *options, ... Eina_Mempool *mp; va_list args; - if (!name) return NULL; + EINA_SAFETY_ON_NULL_RETURN_VAL(name, NULL); va_start(args, options); mp = _new_from_buffer(name, context, options, args); @@ -216,24 +217,22 @@ eina_mempool_new(const char *name, const char *context, const char *options, ... */ EAPI void eina_mempool_delete(Eina_Mempool *mp) { - if (!mp) return ; - + EINA_SAFETY_ON_NULL_RETURN(mp); + EINA_SAFETY_ON_NULL_RETURN(mp->backend.shutdown); mp->backend.shutdown(mp->backend_data); free(mp); } EAPI void eina_mempool_gc(Eina_Mempool *mp) { - assert(mp); - assert(mp->backend.garbage_collect); - + EINA_SAFETY_ON_NULL_RETURN(mp); + EINA_SAFETY_ON_NULL_RETURN(mp->backend.garbage_collect); mp->backend.garbage_collect(mp->backend_data); } EAPI void eina_mempool_statistics(Eina_Mempool *mp) { - assert(mp); - assert(mp->backend.statistics); - + EINA_SAFETY_ON_NULL_RETURN(mp); + EINA_SAFETY_ON_NULL_RETURN(mp->backend.statistics); mp->backend.statistics(mp->backend_data); } diff --git a/legacy/eina/src/lib/eina_module.c b/legacy/eina/src/lib/eina_module.c index cf35e83556..a8cce154dc 100644 --- a/legacy/eina/src/lib/eina_module.c +++ b/legacy/eina/src/lib/eina_module.c @@ -39,6 +39,7 @@ #include "eina_module.h" #include "eina_file.h" #include "eina_private.h" +#include "eina_safety_checks.h" /*============================================================================* * Local * @@ -177,6 +178,8 @@ EAPI Eina_Bool eina_module_load(Eina_Module *m) void *dl_handle; Eina_Module_Init *initcall; + EINA_SAFETY_ON_NULL_RETURN_VAL(m, EINA_FALSE); + if (m->handle) goto loaded; eina_error_set(EINA_ERROR_WRONG_MODULE); @@ -209,7 +212,7 @@ loaded: EAPI Eina_Bool eina_module_unload(Eina_Module *m) { Eina_Module_Shutdown *shut; - if (!m) return EINA_FALSE; + EINA_SAFETY_ON_NULL_RETURN_VAL(m, EINA_FALSE); m->ref--; if (!m->ref) @@ -231,6 +234,7 @@ EAPI Eina_Module * eina_module_new(const char *file) { Eina_Module *m; + EINA_SAFETY_ON_NULL_RETURN_VAL(file, NULL); /* TODO check that the file exists */ m = malloc(sizeof(Eina_Module)); @@ -247,7 +251,7 @@ EAPI Eina_Module * eina_module_new(const char *file) */ EAPI Eina_Bool eina_module_delete(Eina_Module *m) { - if (!m) return EINA_FALSE; + EINA_SAFETY_ON_NULL_RETURN_VAL(m, EINA_FALSE); if (m->handle) { @@ -264,9 +268,8 @@ EAPI Eina_Bool eina_module_delete(Eina_Module *m) */ EAPI void * eina_module_symbol_get(Eina_Module *m, const char *symbol) { - if ((!m) || (!m->handle)) - return NULL; - + EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL); + EINA_SAFETY_ON_NULL_RETURN_VAL(m->handle, NULL); return dlsym(m->handle, symbol); } /** @@ -275,13 +278,14 @@ EAPI void * eina_module_symbol_get(Eina_Module *m, const char *symbol) */ EAPI const char * eina_module_file_get(Eina_Module *m) { - if (!m) return NULL; - + EINA_SAFETY_ON_NULL_RETURN_VAL(m, NULL); return m->file; } EAPI char *eina_module_symbol_path_get(const void *symbol, const char *sub_dir) { + EINA_SAFETY_ON_NULL_RETURN_VAL(symbol, NULL); + #ifdef HAVE_DLADDR Dl_info eina_dl; @@ -318,6 +322,8 @@ EAPI char *eina_module_environment_path_get(const char *env, const char *sub_dir { const char *env_dir; + EINA_SAFETY_ON_NULL_RETURN_VAL(env, NULL); + env_dir = getenv(env); if (env_dir) { @@ -358,8 +364,7 @@ EAPI Eina_Array * eina_module_list_get(Eina_Array *array, const char *path, unsi Dir_List_Get_Cb_Data list_get_cb_data; Dir_List_Cb_Data list_cb_data; - if (!path) - return array; + EINA_SAFETY_ON_NULL_RETURN_VAL(path, NULL); list_get_cb_data.array = array ? array : eina_array_new(4); list_get_cb_data.cb = cb; @@ -382,6 +387,8 @@ EAPI void eina_module_list_load(Eina_Array *array) Eina_Module *m; unsigned int i; + EINA_SAFETY_ON_NULL_RETURN(array); + EINA_ARRAY_ITER_NEXT(array, i, m, iterator) eina_module_load(m); } @@ -395,6 +402,8 @@ EAPI void eina_module_list_unload(Eina_Array *array) Eina_Module *m; unsigned int i; + EINA_SAFETY_ON_NULL_RETURN(array); + EINA_ARRAY_ITER_NEXT(array, i, m, iterator) eina_module_unload(m); } @@ -408,6 +417,8 @@ EAPI void eina_module_list_delete(Eina_Array *array) Eina_Module *m; unsigned int i; + EINA_SAFETY_ON_NULL_RETURN(array); + EINA_ARRAY_ITER_NEXT(array, i, m, iterator) eina_module_delete(m); } diff --git a/legacy/eina/src/lib/eina_rbtree.c b/legacy/eina/src/lib/eina_rbtree.c index d56bae363f..b245757a06 100644 --- a/legacy/eina/src/lib/eina_rbtree.c +++ b/legacy/eina/src/lib/eina_rbtree.c @@ -27,6 +27,7 @@ #include "eina_rbtree.h" #include "eina_array.h" #include "eina_private.h" +#include "eina_safety_checks.h" /*============================================================================* * Local * @@ -161,8 +162,6 @@ _eina_rbtree_iterator_build(const Eina_Rbtree *root, unsigned char mask) Eina_Iterator_Rbtree_List *first; Eina_Iterator_Rbtree *it; - if (!root) return NULL; - it = calloc(1, sizeof (Eina_Iterator_Rbtree)); if (!it) return NULL; @@ -249,6 +248,9 @@ eina_rbtree_inline_insert(Eina_Rbtree *root, Eina_Rbtree *node, Eina_Rbtree_Cmp_ Eina_Rbtree *p, *q; /* Iterator & parent */ Eina_Rbtree_Direction dir, last; + EINA_SAFETY_ON_NULL_RETURN_VAL(node, root); + EINA_SAFETY_ON_NULL_RETURN_VAL(cmp, root); + if (!node) return root; _eina_rbtree_node_init(node); @@ -328,6 +330,9 @@ eina_rbtree_inline_remove(Eina_Rbtree *root, Eina_Rbtree *node, Eina_Rbtree_Cmp_ Eina_Rbtree *f = NULL; Eina_Rbtree_Direction dir; + EINA_SAFETY_ON_NULL_RETURN_VAL(node, root); + EINA_SAFETY_ON_NULL_RETURN_VAL(cmp, root); + if (!root || !node) return root; memset(&head, 0, sizeof(Eina_Rbtree)); @@ -455,6 +460,8 @@ eina_rbtree_delete(Eina_Rbtree *root, Eina_Rbtree_Free_Cb func, void *data) { if (!root) return ; + EINA_SAFETY_ON_NULL_RETURN(func); + eina_rbtree_delete(root->son[0], func, data); eina_rbtree_delete(root->son[1], func, data); func(root, data); diff --git a/legacy/eina/src/lib/eina_rectangle.c b/legacy/eina/src/lib/eina_rectangle.c index 05a9dd794f..aaee6012c6 100644 --- a/legacy/eina/src/lib/eina_rectangle.c +++ b/legacy/eina/src/lib/eina_rectangle.c @@ -26,6 +26,7 @@ #include "eina_magic.h" #include "eina_inlist.h" #include "eina_private.h" +#include "eina_safety_checks.h" /*============================================================================* * Local * @@ -223,7 +224,7 @@ eina_rectangle_pool_delete(Eina_Rectangle_Pool *pool) { Eina_Rectangle_Alloc *del; - if (!pool) return ; + EINA_SAFETY_ON_NULL_RETURN(pool); while (pool->head) { del = (Eina_Rectangle_Alloc*) pool->head; @@ -239,7 +240,7 @@ eina_rectangle_pool_delete(Eina_Rectangle_Pool *pool) EAPI int eina_rectangle_pool_count(Eina_Rectangle_Pool *pool) { - if (!pool) return 0; + EINA_SAFETY_ON_NULL_RETURN_VAL(pool, 0); return pool->references; } @@ -252,7 +253,8 @@ eina_rectangle_pool_request(Eina_Rectangle_Pool *pool, int w, int h) int x; int y; - if (!pool) return NULL; + EINA_SAFETY_ON_NULL_RETURN_VAL(pool, NULL); + if (w > pool->w || h > pool->h) return NULL; test = _eina_rectangle_pool_find((Eina_Rectangle_Alloc*) pool->head, pool->w, pool->h, w, h, &x, &y); @@ -279,6 +281,8 @@ eina_rectangle_pool_release(Eina_Rectangle *rect) { Eina_Rectangle_Alloc *era = ((Eina_Rectangle_Alloc *) rect) - 1; + EINA_SAFETY_ON_NULL_RETURN(rect); + EINA_MAGIC_CHECK_RECTANGLE_ALLOC(era); EINA_MAGIC_CHECK_RECTANGLE_POOL(era->pool); @@ -293,7 +297,7 @@ eina_rectangle_pool_get(Eina_Rectangle *rect) { Eina_Rectangle_Alloc *era = ((Eina_Rectangle_Alloc *) rect) - 1; - if (!rect) return NULL; + EINA_SAFETY_ON_NULL_RETURN_VAL(rect, NULL); EINA_MAGIC_CHECK_RECTANGLE_ALLOC(era); EINA_MAGIC_CHECK_RECTANGLE_POOL(era->pool); @@ -304,9 +308,8 @@ eina_rectangle_pool_get(Eina_Rectangle *rect) EAPI void eina_rectangle_pool_data_set(Eina_Rectangle_Pool *pool, const void *data) { - if (!pool) return ; - EINA_MAGIC_CHECK_RECTANGLE_POOL(pool); + EINA_SAFETY_ON_NULL_RETURN(pool); pool->data = (void*) data; } @@ -314,9 +317,8 @@ eina_rectangle_pool_data_set(Eina_Rectangle_Pool *pool, const void *data) EAPI void * eina_rectangle_pool_data_get(Eina_Rectangle_Pool *pool) { - if (!pool) return NULL; - EINA_MAGIC_CHECK_RECTANGLE_POOL(pool); + EINA_SAFETY_ON_NULL_RETURN_VAL(pool, NULL); return pool->data; } @@ -327,6 +329,7 @@ eina_rectangle_pool_geometry_get(Eina_Rectangle_Pool *pool, int *w, int *h) if (!pool) return EINA_FALSE; EINA_MAGIC_CHECK_RECTANGLE_POOL(pool); + EINA_SAFETY_ON_NULL_RETURN_VAL(pool, EINA_FALSE); if (w) *w = pool->w; if (h) *h = pool->h; diff --git a/legacy/eina/src/lib/eina_stringshare.c b/legacy/eina/src/lib/eina_stringshare.c index deefe0e839..e97cadf6d8 100644 --- a/legacy/eina/src/lib/eina_stringshare.c +++ b/legacy/eina/src/lib/eina_stringshare.c @@ -80,6 +80,7 @@ #include "eina_error.h" #include "eina_private.h" #include "eina_magic.h" +#include "eina_safety_checks.h" /*============================================================================* * Local *