From 59f87fbcbcc4d6c5ac165d6053c1a3734f48e810 Mon Sep 17 00:00:00 2001
From: Nick White <git@njw.name>
Date: Tue, 22 Nov 2022 16:14:25 +0000
Subject: rescribe: add gbook fuzzer test and fix some bugs it found!

---
 cmd/rescribe/gbook.go                                   | 12 ++++++++----
 cmd/rescribe/gbook_test.go                              | 17 ++++++++++++++++-
 .../testdata/fuzz/FuzzGetBookIdFromUrl/174f82f558636f2a |  2 ++
 .../testdata/fuzz/FuzzGetBookIdFromUrl/60892155cf2f7963 |  2 ++
 4 files changed, 28 insertions(+), 5 deletions(-)
 create mode 100644 cmd/rescribe/testdata/fuzz/FuzzGetBookIdFromUrl/174f82f558636f2a
 create mode 100644 cmd/rescribe/testdata/fuzz/FuzzGetBookIdFromUrl/60892155cf2f7963

(limited to 'cmd/rescribe')

diff --git a/cmd/rescribe/gbook.go b/cmd/rescribe/gbook.go
index 320f574..a011181 100644
--- a/cmd/rescribe/gbook.go
+++ b/cmd/rescribe/gbook.go
@@ -41,7 +41,9 @@ func formatAuthors(authors []string) string {
 	s = strings.ToUpper(s)
 
 	if len(s) > maxPartLength {
-		s = s[:maxPartLength]
+		// truncate to maxPartLength
+		m := fmt.Sprintf("%%.%ds", maxPartLength)
+		s = fmt.Sprintf(m, s)
 	}
 
 	s = strings.Map(stripNonLetters, s)
@@ -63,7 +65,9 @@ func stripNonLetters(r rune) rune {
 func formatTitle(title string) string {
 	s := strings.Map(stripNonLetters, title)
 	if len(s) > maxPartLength {
-		s = s[:maxPartLength]
+		// truncate to maxPartLength
+		m := fmt.Sprintf("%%.%ds", maxPartLength)
+		s = fmt.Sprintf(m, s)
 	}
 	return s
 }
@@ -232,7 +236,7 @@ func getBookIdFromUrl(url string) (string, error) {
 
 		if start >= 0 {
 			start += 4
-			if len(url[start:]) < 12 {
+			if len(url) - start < 12 {
 				return "", fmt.Errorf("Could not find book ID in URL")
 			}
 			return url[start : start+12], nil
@@ -245,7 +249,7 @@ func getBookIdFromUrl(url string) (string, error) {
 
 		if start >= 0 {
 			start += 10
-			if len(url[start:]) < 12 {
+			if len(url) - start < 12 {
 				return "", fmt.Errorf("Could not find book ID in URL")
 			}
 			return url[start : start+12], nil
diff --git a/cmd/rescribe/gbook_test.go b/cmd/rescribe/gbook_test.go
index 56b4b40..f7df595 100644
--- a/cmd/rescribe/gbook_test.go
+++ b/cmd/rescribe/gbook_test.go
@@ -8,7 +8,7 @@ import (
 	"testing"
 )
 
-func Test_getBookIdFromUrl(t *testing.T) {
+func TestGetBookIdFromUrl(t *testing.T) {
 	cases := []struct {
 		url string
 		id  string
@@ -29,3 +29,18 @@ func Test_getBookIdFromUrl(t *testing.T) {
 		})
 	}
 }
+
+func FuzzGetBookIdFromUrl(f *testing.F) {
+	cases := []string {
+		"https://books.google.it/books?id=QjQepCuN8JYC",
+		"https://www.google.it/books/edition/_/VJbr-Oe2au0C",
+	}
+
+	for _, c := range cases {
+		f.Add(c)
+	}
+
+	f.Fuzz(func(t *testing.T, url string) {
+		getBookIdFromUrl(url)
+	})
+}
diff --git a/cmd/rescribe/testdata/fuzz/FuzzGetBookIdFromUrl/174f82f558636f2a b/cmd/rescribe/testdata/fuzz/FuzzGetBookIdFromUrl/174f82f558636f2a
new file mode 100644
index 0000000..1a7ed9c
--- /dev/null
+++ b/cmd/rescribe/testdata/fuzz/FuzzGetBookIdFromUrl/174f82f558636f2a
@@ -0,0 +1,2 @@
+go test fuzz v1
+string("https://www0google\xf7/books/edition/_/")
diff --git a/cmd/rescribe/testdata/fuzz/FuzzGetBookIdFromUrl/60892155cf2f7963 b/cmd/rescribe/testdata/fuzz/FuzzGetBookIdFromUrl/60892155cf2f7963
new file mode 100644
index 0000000..b637539
--- /dev/null
+++ b/cmd/rescribe/testdata/fuzz/FuzzGetBookIdFromUrl/60892155cf2f7963
@@ -0,0 +1,2 @@
+go test fuzz v1
+string("https://Books.google\xc1&id=")
-- 
cgit v1.2.1-24-ge1ad