Skip to content

Commit 193c7fa

Browse files
Fix a different utf-8 bug!
1 parent b71319a commit 193c7fa

3 files changed

Lines changed: 24 additions & 0 deletions

File tree

internal/diff/chardiff_test.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,14 @@ func TestCharDiff(t *testing.T) {
9090
added: []byte("0"),
9191
wantHasChanged: true,
9292
},
93+
{
94+
// Regression: identical invalid UTF-8 bytes must produce all-unchanged segments.
95+
// \x80 is a bare continuation byte — invalid UTF-8 on its own.
96+
name: "identical invalid UTF-8",
97+
removed: []byte("\x80"),
98+
added: []byte("\x80"),
99+
wantAllUnchanged: true,
100+
},
93101
}
94102

95103
for _, tt := range tests {

internal/diff/chars.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package diff
22

33
import (
4+
"bytes"
45
"unicode/utf8"
56
)
67

@@ -21,6 +22,18 @@ type InlineChange struct {
2122
// Strips and restores trailing \n before diffing.
2223
// If either side exceeds 500 runes, returns a single-segment fallback (whole-line).
2324
func CharDiff(removed, added []byte) InlineChange {
25+
// Identical inputs: short-circuit before any UTF-8 handling. This also
26+
// covers identical invalid UTF-8, where fallback would wrongly return
27+
// Changed:true segments.
28+
if bytes.Equal(removed, added) {
29+
seg := Segment{Text: append([]byte(nil), removed...), Changed: false}
30+
31+
return InlineChange{
32+
Removed: []Segment{seg},
33+
Added: []Segment{{Text: append([]byte(nil), added...), Changed: false}},
34+
}
35+
}
36+
2437
// Strip trailing newline, remember whether each side had one.
2538
removedNL := len(removed) > 0 && removed[len(removed)-1] == '\n'
2639
addedNL := len(added) > 0 && added[len(added)-1] == '\n'
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
go test fuzz v1
2+
[]byte("\x80")
3+
[]byte("\x80")

0 commit comments

Comments
 (0)