@@ -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
@@ -1093,9 +1093,9 @@ SRE(match)(SRE_STATE* state, SRE_CODE* pattern, int match_all)
10931093 /* <ASSERT> <skip> <back> <pattern> */
10941094 TRACE (("|%p|%p|ASSERT %d\n" , ctx -> pattern ,
10951095 ctx -> ptr , ctx -> pattern [1 ]));
1096- state -> ptr = ctx -> ptr - ctx -> pattern [1 ];
1097- if (state -> ptr < state -> beginning )
1096+ if (ctx -> ptr - (SRE_CHAR * )state -> beginning < (Py_ssize_t )ctx -> pattern [1 ])
10981097 RETURN_FAILURE ;
1098+ state -> ptr = ctx -> ptr - ctx -> pattern [1 ];
10991099 DO_JUMP0 (JUMP_ASSERT , jump_assert , ctx -> pattern + 2 );
11001100 RETURN_ON_FAILURE (ret );
11011101 ctx -> pattern += ctx -> pattern [0 ];
@@ -1106,8 +1106,8 @@ SRE(match)(SRE_STATE* state, SRE_CODE* pattern, int match_all)
11061106 /* <ASSERT_NOT> <skip> <back> <pattern> */
11071107 TRACE (("|%p|%p|ASSERT_NOT %d\n" , ctx -> pattern ,
11081108 ctx -> ptr , ctx -> pattern [1 ]));
1109- state -> ptr = ctx -> ptr - ctx -> pattern [1 ];
1110- if ( state -> ptr >= state -> beginning ) {
1109+ if ( ctx -> ptr - ( SRE_CHAR * ) state -> beginning >= ( Py_ssize_t ) ctx -> pattern [1 ]) {
1110+ state -> ptr = ctx -> ptr - ctx -> pattern [ 1 ];
11111111 DO_JUMP0 (JUMP_ASSERT_NOT , jump_assert_not , ctx -> pattern + 2 );
11121112 if (ret ) {
11131113 RETURN_ON_ERROR (ret );
@@ -1199,12 +1199,20 @@ SRE(search)(SRE_STATE* state, SRE_CODE* pattern)
11991199 SRE_CODE * overlap = NULL ;
12001200 int flags = 0 ;
12011201
1202+ if (ptr > end )
1203+ return 0 ;
1204+
12021205 if (pattern [0 ] == SRE_OP_INFO ) {
12031206 /* optimization info block */
12041207 /* <INFO> <1=skip> <2=flags> <3=min> <4=max> <5=prefix info> */
12051208
12061209 flags = pattern [2 ];
12071210
1211+ if (pattern [3 ] && end - ptr < (Py_ssize_t )pattern [3 ]) {
1212+ TRACE (("reject (got %u chars, need %u)\n" ,
1213+ (unsigned int )(end - ptr ), pattern [3 ]));
1214+ return 0 ;
1215+ }
12081216 if (pattern [3 ] > 1 ) {
12091217 /* adjust end point (but make sure we leave at least one
12101218 character in there, so literal search will work) */
@@ -1322,15 +1330,18 @@ SRE(search)(SRE_STATE* state, SRE_CODE* pattern)
13221330 break ;
13231331 ptr ++ ;
13241332 }
1325- } else
1333+ } else {
13261334 /* general case */
1327- while (ptr <= end ) {
1335+ assert (ptr <= end );
1336+ while (1 ) {
13281337 TRACE (("|%p|%p|SEARCH\n" , pattern , ptr ));
1329- state -> start = state -> ptr = ptr ++ ;
1338+ state -> start = state -> ptr = ptr ;
13301339 status = SRE (match )(state , pattern , 0 );
1331- if (status != 0 )
1340+ if (status != 0 || ptr >= end )
13321341 break ;
1342+ ptr ++ ;
13331343 }
1344+ }
13341345
13351346 return status ;
13361347}
0 commit comments