fix bounds checks for the last element of bv-*-{ref,set}
[bpt/guile.git] / libguile / vm-i-scheme.c
index 5de39a2..42f8bac 100644 (file)
@@ -281,7 +281,7 @@ VM_DEFINE_INSTRUCTION (108, slot_set, "slot-set", 0, 3, 0)
 
 VM_DEFINE_FUNCTION (109, vector_ref, "vector-ref", 2)
 {
-  long i;
+  long i = 0;
   ARGS2 (vect, idx);
   if (SCM_LIKELY (SCM_I_IS_VECTOR (vect)
                   && SCM_I_INUMP (idx)
@@ -294,7 +294,7 @@ VM_DEFINE_FUNCTION (109, vector_ref, "vector-ref", 2)
 
 VM_DEFINE_INSTRUCTION (110, vector_set, "vector-set", 0, 3, 0)
 {
-  long i;
+  long i = 0;
   SCM vect, idx, val;
   POP (val); POP (idx); POP (vect);
   if (SCM_LIKELY (SCM_I_IS_VECTOR (vect)
@@ -346,12 +346,12 @@ BV_REF_WITH_ENDIANNESS (f64, ieee_double)
 
 #define BV_FIXABLE_INT_REF(stem, fn_stem, type, size)                   \
 {                                                                       \
-  long i;                                                               \
+  long i = 0;                                                           \
   ARGS2 (bv, idx);                                                      \
   VM_VALIDATE_BYTEVECTOR (bv);                                          \
   if (SCM_LIKELY (SCM_I_INUMP (idx)                                     \
                   && ((i = SCM_I_INUM (idx)) >= 0)                        \
-                  && (i < SCM_BYTEVECTOR_LENGTH (bv))                   \
+                  && (i + size <= SCM_BYTEVECTOR_LENGTH (bv))           \
                   && (i % size == 0)))                                  \
     RETURN (SCM_I_MAKINUM (*(scm_t_##type*)                             \
                            (SCM_BYTEVECTOR_CONTENTS (bv) + i)));        \
@@ -361,12 +361,12 @@ BV_REF_WITH_ENDIANNESS (f64, ieee_double)
 
 #define BV_INT_REF(stem, type, size)                                    \
 {                                                                       \
-  long i;                                                               \
+  long i = 0;                                                           \
   ARGS2 (bv, idx);                                                      \
   VM_VALIDATE_BYTEVECTOR (bv);                                          \
   if (SCM_LIKELY (SCM_I_INUMP (idx)                                     \
-                  && ((i = SCM_I_INUM (idx)) >= 0)                        \
-                  && (i < SCM_BYTEVECTOR_LENGTH (bv))                   \
+                  && ((i = SCM_I_INUM (idx)) >= 0)                      \
+                  && (i + size <= SCM_BYTEVECTOR_LENGTH (bv))           \
                   && (i % size == 0)))                                  \
     { scm_t_##type x = (*(scm_t_##type*)(SCM_BYTEVECTOR_CONTENTS (bv) + i)); \
       if (SCM_FIXABLE (x))                                              \
@@ -380,12 +380,12 @@ BV_REF_WITH_ENDIANNESS (f64, ieee_double)
 
 #define BV_FLOAT_REF(stem, fn_stem, type, size)                         \
 {                                                                       \
-  long i;                                                               \
+  long i = 0;                                                           \
   ARGS2 (bv, idx);                                                      \
   VM_VALIDATE_BYTEVECTOR (bv);                                          \
   if (SCM_LIKELY (SCM_I_INUMP (idx)                                     \
                   && ((i = SCM_I_INUM (idx)) >= 0)                        \
-                  && (i < SCM_BYTEVECTOR_LENGTH (bv))                   \
+                  && (i + size <= SCM_BYTEVECTOR_LENGTH (bv))           \
                   && (i % size == 0)))                                  \
     RETURN (scm_from_double ((*(type*)(SCM_BYTEVECTOR_CONTENTS (bv) + i)))); \
   else                                                                  \
@@ -454,12 +454,12 @@ BV_SET_WITH_ENDIANNESS (f64, ieee_double)
 
 #define BV_FIXABLE_INT_SET(stem, fn_stem, type, min, max, size)         \
 {                                                                       \
-  long i, j;                                                            \
+  long i = 0, j = 0;                                                    \
   SCM bv, idx, val; POP (val); POP (idx); POP (bv);                     \
   VM_VALIDATE_BYTEVECTOR (bv);                                          \
   if (SCM_LIKELY (SCM_I_INUMP (idx)                                     \
                   && ((i = SCM_I_INUM (idx)) >= 0)                      \
-                  && (i < SCM_BYTEVECTOR_LENGTH (bv))                   \
+                  && (i + size <= SCM_BYTEVECTOR_LENGTH (bv))           \
                   && (i % size == 0)                                    \
                   && (SCM_I_INUMP (val))                                \
                   && ((j = SCM_I_INUM (val)) >= min)                    \
@@ -472,12 +472,12 @@ BV_SET_WITH_ENDIANNESS (f64, ieee_double)
 
 #define BV_INT_SET(stem, type, size)                                    \
 {                                                                       \
-  long i;                                                               \
+  long i = 0;                                                           \
   SCM bv, idx, val; POP (val); POP (idx); POP (bv);                     \
   VM_VALIDATE_BYTEVECTOR (bv);                                          \
   if (SCM_LIKELY (SCM_I_INUMP (idx)                                     \
                   && ((i = SCM_I_INUM (idx)) >= 0)                      \
-                  && (i < SCM_BYTEVECTOR_LENGTH (bv))                   \
+                  && (i + size <= SCM_BYTEVECTOR_LENGTH (bv))           \
                   && (i % size == 0)))                                  \
     *(scm_t_##type*) (SCM_BYTEVECTOR_CONTENTS (bv) + i) = scm_to_##type (val); \
   else                                                                  \
@@ -487,12 +487,12 @@ BV_SET_WITH_ENDIANNESS (f64, ieee_double)
 
 #define BV_FLOAT_SET(stem, fn_stem, type, size)                         \
 {                                                                       \
-  long i;                                                               \
+  long i = 0;                                                           \
   SCM bv, idx, val; POP (val); POP (idx); POP (bv);                     \
   VM_VALIDATE_BYTEVECTOR (bv);                                          \
   if (SCM_LIKELY (SCM_I_INUMP (idx)                                     \
                   && ((i = SCM_I_INUM (idx)) >= 0)                      \
-                  && (i < SCM_BYTEVECTOR_LENGTH (bv))                   \
+                  && (i + size <= SCM_BYTEVECTOR_LENGTH (bv))           \
                   && (i % size == 0)))                                  \
     *(type*) (SCM_BYTEVECTOR_CONTENTS (bv) + i) = scm_to_double (val);  \
   else                                                                  \