overflow detection

diff --git a/ChangeLog b/ChangeLog
index 64fada3..69c409c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,9 @@
 
+0.9.15: 2005-May-17
+
+	* Compiler now checks 64-bit overflows in constraints range handling
+	  code. No effect on the code produced by the compiler.
+
 0.9.14:	2005-Apr-29
 
 	* Fixed check-70.-fnative-integers.c test (it was failing
diff --git a/libasn1fix/asn1fix_crange.c b/libasn1fix/asn1fix_crange.c
index 23110a2..5975bc1 100644
--- a/libasn1fix/asn1fix_crange.c
+++ b/libasn1fix/asn1fix_crange.c
@@ -453,28 +453,40 @@
 	 * L: |---...
 	 * R:   |--..
 	 */
-	if(ll < 0) {
+	while(ll < 0) {
 		nr->left = ra->left;
 		nr->right = rb->left;
-		if(nr->right.type == ARE_VALUE)
+		if(nr->right.type == ARE_VALUE) {
+			if(nr->right.value - 1 >= nr->right.value) {
+				/* We've hit the limit here. */
+				break;
+			}
 			nr->right.value--;
+		}
 		_range_insert(range, nr);
 		nr = _range_new();
 		assert(nr);
+		break;
 	}
 
 	/*
 	 * L: ...---|
 	 * R: ..--|
 	 */
-	if(rr > 0) {
+	while(rr > 0) {
 		nr->left = rb->right;
 		nr->right = ra->right;
-		if(nr->left.type == ARE_VALUE)
+		if(nr->left.type == ARE_VALUE) {
+			if(nr->left.value + 1 <= nr->left.value) {
+				/* We've hit the limit here. */
+				break;
+			}
 			nr->left.value++;
+		}
 		_range_insert(range, nr);
 		nr = _range_new();
 		assert(nr);
+		break;
 	}
 
 	/*
@@ -556,6 +568,7 @@
 			wel = with;
 		} else {
 			wel = with->elements[j];
+			assert(!wel->el_count);	/* non-compound item! */
 		}
 
 		r = _range_split(range->elements[i], wel);