diff --git a/godotenv_test.go b/godotenv_test.go index c07e6f3..3e41d85 100644 --- a/godotenv_test.go +++ b/godotenv_test.go @@ -342,6 +342,9 @@ func TestParsing(t *testing.T) { // parses escaped double quotes parseAndCompare(t, `FOO="escaped\"bar"`, "FOO", `escaped"bar`) + // a trailing escaped backslash does not escape the closing quote + parseAndCompare(t, `FOO="bar\\"`, "FOO", `bar\`) + // parses single quotes inside double quotes parseAndCompare(t, `FOO="'d'"`, "FOO", `'d'`) diff --git a/parser.go b/parser.go index 6655318..de05e05 100644 --- a/parser.go +++ b/parser.go @@ -164,8 +164,12 @@ func extractVarValue(src []byte, vars map[string]string) (value string, rest []b continue } - // skip escaped quote symbol (\" or \', depends on quote) - if prevChar := src[i-1]; prevChar == '\\' { + // skip escaped quote symbol; a quote is escaped only when preceded by an odd number of backslashes + backslashes := 0 + for j := i - 1; j >= 0 && src[j] == '\\'; j-- { + backslashes++ + } + if backslashes%2 == 1 { continue }