Don't accept negative integers when converting to ulong.
authorChris Hanson <org/chris-hanson/cph>
Thu, 24 Sep 2009 07:08:42 +0000 (00:08 -0700)
committerChris Hanson <org/chris-hanson/cph>
Thu, 24 Sep 2009 07:08:42 +0000 (00:08 -0700)
src/microcode/artutl.c
src/microcode/bignum.c

index 275b8de5084d38c4d37733c5d9318791aeeebede..cd6addc5fccdb621df05c75e3d22ee2bf61a97d7 100644 (file)
@@ -70,7 +70,7 @@ long_to_integer (long number)
 bool
 integer_to_ulong_p (SCHEME_OBJECT n)
 {
-  return ((FIXNUM_P (n)) || (BIGNUM_TO_ULONG_P (n)));
+  return ((FIXNUM_P (n)) ? (!FIXNUM_NEGATIVE_P (n)) : (BIGNUM_TO_ULONG_P (n)));
 }
 
 unsigned long
index bb3b8ca1b9681247e9ad9cd8e4646947231c9bf5..ad8e3e05202995f6eb41cc99a33a2d24656cebed 100644 (file)
@@ -425,13 +425,6 @@ bignum_remainder (bignum_type numerator, bignum_type denominator)
     }
 }
 \f
-/* These procedures depend on the non-portable type `unsigned long'.
-   If your compiler doesn't support this type, either define the
-   switch `BIGNUM_NO_ULONG' to disable them (in "bignum.h"), or write
-   new versions that don't use this type. */
-
-#ifndef BIGNUM_NO_ULONG
-
 bignum_type
 long_to_bignum (long n)
 {
@@ -513,6 +506,7 @@ bignum_to_ulong (bignum_type bignum)
 {
   if (BIGNUM_ZERO_P (bignum))
     return (0);
+  BIGNUM_ASSERT (BIGNUM_POSITIVE_P (bignum));
   {
     unsigned long accumulator = 0;
     bignum_digit_type * start = (BIGNUM_START_PTR (bignum));
@@ -522,8 +516,6 @@ bignum_to_ulong (bignum_type bignum)
     return (accumulator);
   }
 }
-
-#endif /* not BIGNUM_NO_ULONG */
 \f
 #define DTB_WRITE_DIGIT(n_bits) do                                     \
 {                                                                      \
@@ -747,7 +739,17 @@ int
 bignum_fits_in_word_p (bignum_type bignum, long word_length,
                       int twos_complement_p)
 {
-  unsigned int n_bits = (twos_complement_p ? (word_length - 1) : word_length);
+  unsigned int n_bits;
+
+  if (twos_complement_p)
+    {
+      if (BIGNUM_NEGATIVE_P (bignum))
+       return (0);
+      n_bits = (word_length - 1);
+    }
+  else
+    n_bits = word_length;
+
   BIGNUM_ASSERT (n_bits > 0);
   {
     bignum_length_type length = (BIGNUM_LENGTH (bignum));