@@ -906,19 +906,25 @@ impl TwoWaySearcher {
906
906
{
907
907
// `next()` uses `self.position` as its cursor
908
908
let old_pos = self . position ;
909
+ let needle_last = needle. len ( ) - 1 ;
909
910
' search: loop {
910
911
// Check that we have room to search in
911
- if needle. len ( ) > haystack. len ( ) - self . position {
912
- self . position = haystack. len ( ) ;
913
- return S :: rejecting ( old_pos, self . position ) ;
914
- }
912
+ // position + needle_last can not overflow if we assume slices
913
+ // are bounded by isize's range.
914
+ let tail_byte = match haystack. get ( self . position + needle_last) {
915
+ Some ( & b) => b,
916
+ None => {
917
+ self . position = haystack. len ( ) ;
918
+ return S :: rejecting ( old_pos, self . position ) ;
919
+ }
920
+ } ;
915
921
916
922
if S :: use_early_reject ( ) && old_pos != self . position {
917
923
return S :: rejecting ( old_pos, self . position ) ;
918
924
}
919
925
920
926
// Quickly skip by large portions unrelated to our substring
921
- if !self . byteset_contains ( haystack [ self . position + needle . len ( ) - 1 ] ) {
927
+ if !self . byteset_contains ( tail_byte ) {
922
928
self . position += needle. len ( ) ;
923
929
if !long_period {
924
930
self . memory = 0 ;
@@ -986,17 +992,23 @@ impl TwoWaySearcher {
986
992
let old_end = self . end ;
987
993
' search: loop {
988
994
// Check that we have room to search in
989
- if needle. len ( ) > self . end {
990
- self . end = 0 ;
991
- return S :: rejecting ( 0 , old_end) ;
992
- }
995
+ // end - needle.len() will wrap around when there is no more room,
996
+ // but due to slice length limits it can never wrap all the way back
997
+ // into the length of haystack.
998
+ let front_byte = match haystack. get ( self . end . wrapping_sub ( needle. len ( ) ) ) {
999
+ Some ( & b) => b,
1000
+ None => {
1001
+ self . end = 0 ;
1002
+ return S :: rejecting ( 0 , old_end) ;
1003
+ }
1004
+ } ;
993
1005
994
1006
if S :: use_early_reject ( ) && old_end != self . end {
995
1007
return S :: rejecting ( self . end , old_end) ;
996
1008
}
997
1009
998
1010
// Quickly skip by large portions unrelated to our substring
999
- if !self . byteset_contains ( haystack [ self . end - needle . len ( ) ] ) {
1011
+ if !self . byteset_contains ( front_byte ) {
1000
1012
self . end -= needle. len ( ) ;
1001
1013
if !long_period {
1002
1014
self . memory_back = needle. len ( ) ;
0 commit comments