diff --git a/scanner.go b/scanner.go
index <HASH>..<HASH> 100644
--- a/scanner.go
+++ b/scanner.go
@@ -242,6 +242,14 @@ func scanMultilineBasicString(b []byte) ([]byte, bool, []byte, error) {
 			}
 			escaped = true
 			i++ // skip the next character
+		case '\r':
+			if len(b) < i+2 {
+				return nil, escaped, nil, newDecodeError(b[len(b):], `need a \n after \r`)
+			}
+			if b[i+1] != '\n' {
+				return nil, escaped, nil, newDecodeError(b[i:i+2], `need a \n after \r`)
+			}
+			i++ // skip the \n
 		}
 	}
 
diff --git a/unmarshaler_test.go b/unmarshaler_test.go
index <HASH>..<HASH> 100644
--- a/unmarshaler_test.go
+++ b/unmarshaler_test.go
@@ -2591,6 +2591,14 @@ world'`,
 			data: "A = \"\r\"",
 		},
 		{
+			desc: `carriage return inside basic multiline string`,
+			data: "a=\"\"\"\r\"\"\"",
+		},
+		{
+			desc: `carriage return at the trail of basic multiline string`,
+			data: "a=\"\"\"\r",
+		},
+		{
 			desc: `carriage return inside literal string`,
 			data: "A = '\r'",
 		},
Decoder: fail on unescaped \r not followed by \n (#<I>)

Fixes #<I>