@@ -30,7 +30,7 @@ SRE(at)(SRE_STATE* state, SRE_CHAR* ptr, SRE_CODE at)
3030 SRE_IS_LINEBREAK ((int ) ptr [-1 ]));
3131
3232 case SRE_AT_END :
33- return (((void * ) ( ptr + 1 ) == state -> end &&
33+ return (((SRE_CHAR * ) state -> end - ptr == 1 &&
3434 SRE_IS_LINEBREAK ((int ) ptr [0 ])) ||
3535 ((void * ) ptr == state -> end ));
3636
@@ -1109,9 +1109,9 @@ SRE(match)(SRE_STATE* state, SRE_CODE* pattern, int match_all)
11091109 /* <ASSERT> <skip> <back> <pattern> */
11101110 TRACE (("|%p|%p|ASSERT %d\n" , ctx -> pattern ,
11111111 ctx -> ptr , ctx -> pattern [1 ]));
1112- state -> ptr = ctx -> ptr - ctx -> pattern [1 ];
1113- if (state -> ptr < state -> beginning )
1112+ if (ctx -> ptr - (SRE_CHAR * )state -> beginning < (Py_ssize_t )ctx -> pattern [1 ])
11141113 RETURN_FAILURE ;
1114+ state -> ptr = ctx -> ptr - ctx -> pattern [1 ];
11151115 DO_JUMP0 (JUMP_ASSERT , jump_assert , ctx -> pattern + 2 );
11161116 RETURN_ON_FAILURE (ret );
11171117 ctx -> pattern += ctx -> pattern [0 ];
@@ -1122,8 +1122,8 @@ SRE(match)(SRE_STATE* state, SRE_CODE* pattern, int match_all)
11221122 /* <ASSERT_NOT> <skip> <back> <pattern> */
11231123 TRACE (("|%p|%p|ASSERT_NOT %d\n" , ctx -> pattern ,
11241124 ctx -> ptr , ctx -> pattern [1 ]));
1125- state -> ptr = ctx -> ptr - ctx -> pattern [1 ];
1126- if ( state -> ptr >= state -> beginning ) {
1125+ if ( ctx -> ptr - ( SRE_CHAR * ) state -> beginning >= ( Py_ssize_t ) ctx -> pattern [1 ]) {
1126+ state -> ptr = ctx -> ptr - ctx -> pattern [ 1 ];
11271127 DO_JUMP0 (JUMP_ASSERT_NOT , jump_assert_not , ctx -> pattern + 2 );
11281128 if (ret ) {
11291129 RETURN_ON_ERROR (ret );
@@ -1215,12 +1215,20 @@ SRE(search)(SRE_STATE* state, SRE_CODE* pattern)
12151215 SRE_CODE * overlap = NULL ;
12161216 int flags = 0 ;
12171217
1218+ if (ptr > end )
1219+ return 0 ;
1220+
12181221 if (pattern [0 ] == SRE_OP_INFO ) {
12191222 /* optimization info block */
12201223 /* <INFO> <1=skip> <2=flags> <3=min> <4=max> <5=prefix info> */
12211224
12221225 flags = pattern [2 ];
12231226
1227+ if (pattern [3 ] && end - ptr < (Py_ssize_t )pattern [3 ]) {
1228+ TRACE (("reject (got %u chars, need %u)\n" ,
1229+ (unsigned int )(end - ptr ), pattern [3 ]));
1230+ return 0 ;
1231+ }
12241232 if (pattern [3 ] > 1 ) {
12251233 /* adjust end point (but make sure we leave at least one
12261234 character in there, so literal search will work) */
@@ -1338,15 +1346,18 @@ SRE(search)(SRE_STATE* state, SRE_CODE* pattern)
13381346 break ;
13391347 ptr ++ ;
13401348 }
1341- } else
1349+ } else {
13421350 /* general case */
1343- while (ptr <= end ) {
1351+ assert (ptr <= end );
1352+ while (1 ) {
13441353 TRACE (("|%p|%p|SEARCH\n" , pattern , ptr ));
1345- state -> start = state -> ptr = ptr ++ ;
1354+ state -> start = state -> ptr = ptr ;
13461355 status = SRE (match )(state , pattern , 0 );
1347- if (status != 0 )
1356+ if (status != 0 || ptr >= end )
13481357 break ;
1358+ ptr ++ ;
13491359 }
1360+ }
13501361
13511362 return status ;
13521363}
0 commit comments