Explorar el Código

Fix currentLine out of bounds error (#1810)

Because `segment.adjustMatchIndex(matchIndex)` was above
`segment.lineEndIndex(currentRaw, matchIndex[1]-matchIndex[0])` there
were cases where it would cause an out of bounds error.

This change resolves the issue by just assuming the whole segment is a
opaque chunk of text and starts at the boundaries of the segment instead
so that the order doesn't matter as much.

The other option would have been to reorder the assignments and add
tests to account for that case, but I figured this option is less likely
to have gotchas when working with different encoding formats at the
potential expense of getting an extra line or two if an encoding format
in the future ever allows multiple lines of encoded content to be
considered a single segment.
bplaxco hace 10 meses
padre
commit
4b541044e8
Se han modificado 2 ficheros con 13 adiciones y 10 borrados
  1. 12 9
      detect/decoder.go
  2. 1 1
      detect/detect.go

+ 12 - 9
detect/decoder.go

@@ -280,24 +280,27 @@ func segmentWithDecodedOverlap(encodedSegments []EncodedSegment, start, end int)
 	return nil
 }
 
-func (s EncodedSegment) lineStartIndex(currentRaw string) int {
+func (s EncodedSegment) currentLine(currentRaw string) string {
+	start := 0
+	end := len(currentRaw)
+
+	// Find the start of the range
 	for i := s.decodedStart; i > -1; i-- {
 		c := currentRaw[i]
 		if c == '\n' {
-			return i
+			start = i
+			break
 		}
 	}
 
-	return 0
-}
-
-func (s EncodedSegment) lineEndIndex(currentRaw string, matchLen int) int {
-	for i := s.decodedStart; i < s.decodedStart+matchLen; i++ {
+	// Find the end of the range
+	for i := s.decodedEnd; i < end; i++ {
 		c := currentRaw[i]
 		if c == '\n' {
-			return i
+			end = i
+			break
 		}
 	}
 
-	return len(currentRaw) - 1
+	return currentRaw[start:end]
 }

+ 1 - 1
detect/detect.go

@@ -392,7 +392,7 @@ MatchLoop:
 			if segment := segmentWithDecodedOverlap(encodedSegments, matchIndex[0], matchIndex[1]); segment != nil {
 				matchIndex = segment.adjustMatchIndex(matchIndex)
 				metaTags = append(metaTags, segment.tags()...)
-				currentLine = currentRaw[segment.lineStartIndex(currentRaw):segment.lineEndIndex(currentRaw, matchIndex[1]-matchIndex[0])]
+				currentLine = segment.currentLine(currentRaw)
 			} else {
 				// This item has already been added to a finding
 				continue