isl_point_get_coordinate: check validity of "pos" argument
authorSven Verdoolaege <skimo@kotnet.org>
Fri, 14 Oct 2011 10:10:13 +0000 (12:10 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Fri, 14 Oct 2011 10:10:13 +0000 (12:10 +0200)
Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>
doc/user.pod
include/isl/point.h
isl_point.c

index accd9b1..a22d43c 100644 (file)
@@ -3118,7 +3118,7 @@ The zero point (the origin) can be created using
 The coordinates of a point can be inspected, set and changed
 using
 
-       void isl_point_get_coordinate(__isl_keep isl_point *pnt,
+       int isl_point_get_coordinate(__isl_keep isl_point *pnt,
                enum isl_dim_type type, int pos, isl_int *v);
        __isl_give isl_point *isl_point_set_coordinate(
                __isl_take isl_point *pnt,
index 7d95db1..5d845e9 100644 (file)
@@ -18,7 +18,7 @@ __isl_give isl_point *isl_point_zero(__isl_take isl_space *dim);
 __isl_give isl_point *isl_point_copy(__isl_keep isl_point *pnt);
 void isl_point_free(__isl_take isl_point *pnt);
 
-void isl_point_get_coordinate(__isl_keep isl_point *pnt,
+int isl_point_get_coordinate(__isl_keep isl_point *pnt,
        enum isl_dim_type type, int pos, isl_int *v);
 __isl_give isl_point *isl_point_set_coordinate(__isl_take isl_point *pnt,
        enum isl_dim_type type, int pos, isl_int v);
index 53419be..00514a9 100644 (file)
@@ -125,14 +125,21 @@ int isl_point_is_void(__isl_keep isl_point *pnt)
        return pnt->vec->size == 0;
 }
 
-void isl_point_get_coordinate(__isl_keep isl_point *pnt,
+int isl_point_get_coordinate(__isl_keep isl_point *pnt,
        enum isl_dim_type type, int pos, isl_int *v)
 {
        if (!pnt || isl_point_is_void(pnt))
-               return;
+               return -1;
+
+       if (pos < 0 || pos >= isl_space_dim(pnt->dim, type))
+               isl_die(isl_point_get_ctx(pnt), isl_error_invalid,
+                       "position out of bounds", return -1);
+
        if (type == isl_dim_set)
                pos += isl_space_dim(pnt->dim, isl_dim_param);
        isl_int_set(*v, pnt->vec->el[1 + pos]);
+
+       return 0;
 }
 
 __isl_give isl_point *isl_point_set_coordinate(__isl_take isl_point *pnt,