diff options
Diffstat (limited to 'internal')
| -rw-r--r-- | internal/engine/exclude_test.go | 14 | ||||
| -rw-r--r-- | internal/extract/extract.go | 5 | ||||
| -rw-r--r-- | internal/extract/plain.go | 6 | ||||
| -rw-r--r-- | internal/extract/plain_test.go | 10 |
4 files changed, 16 insertions, 19 deletions
diff --git a/internal/engine/exclude_test.go b/internal/engine/exclude_test.go index 4e9f6e7..e5231f8 100644 --- a/internal/engine/exclude_test.go +++ b/internal/engine/exclude_test.go @@ -303,10 +303,12 @@ func TestNoTextFormatIsNoMatch(t *testing.T) { } } -// TestTextTurningBinaryFailsClosed: a file with no known extension whose -// first 8 KiB read as text but which holds a NUL further on is unreadable, -// not "no text": a content exclude still sets it aside (plan 10 re-check R4). -func TestTextTurningBinaryFailsClosed(t *testing.T) { +// TestTextTurningBinaryIsNoText: a file with no known extension whose first +// 8 KiB read as text but which holds a NUL further on - a self-extracting +// installer - counts as having no text, like an image: a content exclude +// does not set it aside and there is no warning (Łukasz, after the plan 10 +// re-check: "ignore such ones"). +func TestTextTurningBinaryIsNoText(t *testing.T) { mixed := "confidential " + strings.Repeat("x", 9000) + "\x00tail" h, _ := excludeTree(t, map[string]string{"mixed": mixed}) main := writeConfig(t, h, `(include "dl")`, map[string]string{"dl": ` @@ -323,8 +325,8 @@ func TestTextTurningBinaryFailsClosed(t *testing.T) { t.Fatal(err) } for _, fm := range r.Matched { - if fm.File.Rel == "mixed" && (!strings.HasSuffix(fm.Excluded, "(content unreadable)") || len(fm.Rules) != 0) { - t.Errorf("mixed: Excluded %q, rules %d; want set aside as unreadable", fm.Excluded, len(fm.Rules)) + if fm.File.Rel == "mixed" && (fm.Excluded != "" || len(fm.Rules) != 1 || len(fm.Warnings) != 0) { + t.Errorf("mixed: Excluded %q, rules %d, warnings %v; want the rule and no warning", fm.Excluded, len(fm.Rules), fm.Warnings) } } } diff --git a/internal/extract/extract.go b/internal/extract/extract.go index 376e09b..7e3adec 100644 --- a/internal/extract/extract.go +++ b/internal/extract/extract.go @@ -23,11 +23,6 @@ var ( // ErrUnsupported is returned when the format carries no text krino // knows how to extract. ErrUnsupported = errors.New("no text in this format") - // ErrMixed is returned for a file of no known extension whose first - // 8 KiB read as text but which holds a NUL or invalid UTF-8 further on. - // Unlike ErrUnsupported it is a read failure: the text it began with - // could hold a keyword (plan 10 re-check R4). - ErrMixed = errors.New("text at the start, binary data further on") // ErrTooLarge is returned when the file is larger than the configured // max-read; nothing is read in that case. ErrTooLarge = errors.New("larger than max-read") diff --git a/internal/extract/plain.go b/internal/extract/plain.go index f7470be..3f04c7e 100644 --- a/internal/extract/plain.go +++ b/internal/extract/plain.go @@ -38,7 +38,9 @@ func readDecoded(path string) (string, error) { // the sample alone (UTF-16 text is full of NUL bytes by design), but a // sample that merely looks like UTF-8 must hold for the WHOLE file — no // NUL byte anywhere, and no invalid UTF-8 anywhere past the sample — or -// the file is ErrMixed, unreadable; the Latin-1 fallback in decode +// the file is ErrUnsupported after all (a self-extracting installer has no +// text in krino's sense, Łukasz's decision after the plan 10 re-check); the +// Latin-1 fallback in decode // never applies to a sniffed file, only to a file whose extension already // names it as text. D2: when the file continues past the sample (n == // sniffSize), the validity check is run against a trimmed copy with any @@ -81,7 +83,7 @@ func sniffText(path string) (string, error) { return decode(data), nil } if !utf8.Valid(data) || bytes.Contains(data, []byte{0}) { - return "", ErrMixed + return "", ErrUnsupported } return decode(data), nil } diff --git a/internal/extract/plain_test.go b/internal/extract/plain_test.go index f49caf8..5752bf8 100644 --- a/internal/extract/plain_test.go +++ b/internal/extract/plain_test.go @@ -154,15 +154,13 @@ func TestToolsListedInOrder(t *testing.T) { // but the file goes on to hold an invalid UTF-8 byte and a NUL past that // sample — sniffText must reject the whole file, not just decode what the // sample alone promised (it must not fall back to Latin-1 the way a known -// text extension would). It is not "no text in this format" either: the -// text it began with could hold a keyword, so it is ErrMixed, a read -// failure, and a content exclude fails closed on it (plan 10 re-check R4). +// text extension would). Such a file - a self-extracting installer, say - +// has no text in krino's sense (Łukasz, after the plan 10 re-check). func TestSniffWholeFileMustBeValid(t *testing.T) { e := newWithPath("") data := append([]byte(strings.Repeat("x", 8192)), 0xFF, 0x00) - _, err := text(t, e, file(t, "blob.data", data), 0) - if !errors.Is(err, ErrMixed) || errors.Is(err, ErrUnsupported) { - t.Errorf("got %v, want ErrMixed and not ErrUnsupported", err) + if _, err := text(t, e, file(t, "blob.data", data), 0); !errors.Is(err, ErrUnsupported) { + t.Errorf("got %v, want ErrUnsupported", err) } } |
