overflow detection


git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@885 59561ff5-6e30-0410-9f3c-9617f08c8826
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);