changeset 38:f69408c0441a

Modified FOREACH function for more security
author David Demelier <markand@malikania.fr>
date Sun, 02 Oct 2011 10:53:48 +0200
parents 7119508e78ac
children 70a7bbe96b1d
files parray.h
diffstat 1 files changed, 9 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/parray.h	Sun Oct 02 10:10:16 2011 +0200
+++ b/parray.h	Sun Oct 02 10:53:48 2011 +0200
@@ -52,22 +52,19 @@
 void	parray_clear(struct parray *);
 void	parray_free(struct parray *);
 
-#define PARRAY_FOREACH(a, var)							\
-	for ((a)->_i = 0, var = (a)->datas[0];					\
-	    (a)->_i < (a)->length; ++(a)->_i,					\
-	    var = (a)->datas[((a)->_i >= (a)->length) ?				\
-		(a)->length - 1 : (a)->_i])
-
-#define PARRAY_FOREACH_R(a, var)						\
-	for ((a)->_i = (a)->length - 1, var = (a)->datas[(a)->_i];		\
-	    (a)->_i >= 0;							\
-	    --(a)->_i, var = (a)->datas[((a)->_i < 0)  ? 0 : (a)->_i])
-
 #define PARRAY_HEAD(a)								\
 	a->datas[0]
 #define PARRAY_TAIL(a)								\
 	a->datas[a->length - 1]
 #define PARRAY_INDEX(a, i)							\
-	a->datas[(i >= a->length) ? (a->length - 1) : i]
+	a->datas[(i < 0 || i >= (a)->length) ? 0 : i]
+
+#define PARRAY_FOREACH_R(a, var)						\
+	for ((a)->_i = (a)->length - 1, var = PARRAY_INDEX((a), (a)->_i);	\
+	    (a)->_i >= 0; --(a)->_i, var = PARRAY_INDEX((a), (a)->_i))
+
+#define PARRAY_FOREACH(a, var)							\
+	for ((a)->_i = 0, var = PARRAY_INDEX((a), (a)->_i);			\
+	    (a)->_i < (a)->length; ++(a)->_i, var = PARRAY_INDEX((a), (a)->_i))
 
 #endif /* _PARRAY_H_ */