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);