Mailing List Archive

python/dist/src/Modules _sre.c,2.83,2.84
Update of /cvsroot/python/python/dist/src/Modules
In directory usw-pr-cvs1:/tmp/cvs-serv9767/Modules

Modified Files:
_sre.c
Log Message:
Fixed bug #470582, using a modified version of patch #527371,
from Greg Chapman.

* Modules/_sre.c
(lastmark_restore): New function, implementing algorithm to restore
a state to a given lastmark. In addition to the similar algorithm used
in a few places of SRE_MATCH, restore lastindex when restoring lastmark.
(SRE_MATCH): Replace lastmark inline restoring by lastmark_restore(),
function. Also include it where missing. In SRE_OP_MARK, set lastindex
only if i > lastmark.

* Lib/test/re_tests.py
* Lib/test/test_sre.py
Included regression tests for the fixed bugs.

* Misc/NEWS
Mention fixes.


Index: _sre.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Modules/_sre.c,v
retrieving revision 2.83
retrieving revision 2.84
diff -C2 -d -r2.83 -r2.84
*** _sre.c 31 Jul 2002 09:54:24 -0000 2.83
--- _sre.c 6 Nov 2002 14:06:53 -0000 2.84
***************
*** 354,357 ****
--- 354,369 ----
}

+ void lastmark_restore(SRE_STATE *state, int lastmark)
+ {
+ if (state->lastmark > lastmark) {
+ memset(
+ state->mark + lastmark + 1, 0,
+ (state->lastmark - lastmark) * sizeof(void*)
+ );
+ state->lastmark = lastmark;
+ state->lastindex = (lastmark == 0) ? -1 : (lastmark-1)/2+1;
+ }
+ }
+
/* generate 8-bit version */

***************
*** 861,868 ****
TRACE(("|%p|%p|MARK %d\n", pattern, ptr, pattern[0]));
i = pattern[0];
! if (i & 1)
! state->lastindex = i/2 + 1;
! if (i > state->lastmark)
state->lastmark = i;
state->mark[i] = ptr;
pattern++;
--- 873,881 ----
TRACE(("|%p|%p|MARK %d\n", pattern, ptr, pattern[0]));
i = pattern[0];
! if (i > state->lastmark) {
state->lastmark = i;
+ if (i & 1)
+ state->lastindex = i/2 + 1;
+ }
state->mark[i] = ptr;
pattern++;
***************
*** 921,931 ****
if (i)
return i;
! if (state->lastmark > lastmark) {
! memset(
! state->mark + lastmark + 1, 0,
! (state->lastmark - lastmark) * sizeof(void*)
! );
! state->lastmark = lastmark;
! }
}
return 0;
--- 934,938 ----
if (i)
return i;
! lastmark_restore(state, lastmark);
}
return 0;
***************
*** 998,1008 ****
ptr--;
count--;
! if (state->lastmark > lastmark) {
! memset(
! state->mark + lastmark + 1, 0,
! (state->lastmark - lastmark) * sizeof(void*)
! );
! state->lastmark = lastmark;
! }
}
}
--- 1005,1009 ----
ptr--;
count--;
! lastmark_restore(state, lastmark);
}
}
***************
*** 1072,1078 ****
return i;
i = mark_restore(state, 0, lastmark);
- state->lastmark = lastmark;
if (i < 0)
return i;
rp->count = count - 1;
state->ptr = ptr;
--- 1073,1079 ----
return i;
i = mark_restore(state, 0, lastmark);
if (i < 0)
return i;
+ lastmark_restore(state, lastmark);
rp->count = count - 1;
state->ptr = ptr;