From 3a1b81cdd086dc5f027330cc567f78bac660ce8f Mon Sep 17 00:00:00 2001 From: codingFeng101 <3524962421@qq.com> Date: Tue, 30 Jun 2026 17:29:27 +0800 Subject: [PATCH 1/2] Handle CRLF invalid lines in parser --- src/dotenv/parser.py | 2 +- tests/test_parser.py | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/dotenv/parser.py b/src/dotenv/parser.py index 66773604..0704f709 100644 --- a/src/dotenv/parser.py +++ b/src/dotenv/parser.py @@ -27,7 +27,7 @@ def make_regex(string: str, extra_flags: int = 0) -> Pattern[str]: _unquoted_value = make_regex(r"([^\r\n]*)") _comment = make_regex(r"(?:[^\S\r\n]*#[^\r\n]*)?") _end_of_line = make_regex(r"[^\S\r\n]*(?:\r\n|\n|\r|$)") -_rest_of_line = make_regex(r"[^\r\n]*(?:\r|\n|\r\n)?") +_rest_of_line = make_regex(r"[^\r\n]*(?:\r\n|\n|\r)?") _double_quote_escapes = make_regex(r"\\[\\'\"abfnrtv]") _single_quote_escapes = make_regex(r"\\[\\']") diff --git a/tests/test_parser.py b/tests/test_parser.py index 4ec5a5af..0ee0e618 100644 --- a/tests/test_parser.py +++ b/tests/test_parser.py @@ -339,6 +339,23 @@ ) ], ), + ( + "a: b\r\nc=d", + [ + Binding( + key=None, + value=None, + original=Original(string="a: b\r\n", line=1), + error=True, + ), + Binding( + key="c", + value="d", + original=Original(string="c=d", line=2), + error=False, + ), + ], + ), ( "a=b\nc=d", [ From 712341794e5de861a751f62ca31b71e9020aaf02 Mon Sep 17 00:00:00 2001 From: Bertrand Bonnefoy-Claudet Date: Wed, 28 Oct 2026 15:08:50 +0100 Subject: [PATCH 2/2] Test line numbers after CRLF parser recovery --- tests/test_parser.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/tests/test_parser.py b/tests/test_parser.py index 0ee0e618..077c21c7 100644 --- a/tests/test_parser.py +++ b/tests/test_parser.py @@ -356,6 +356,29 @@ ), ], ), + ( + "a: b\r\nc=d\r\ne: f", + [ + Binding( + key=None, + value=None, + original=Original(string="a: b\r\n", line=1), + error=True, + ), + Binding( + key="c", + value="d", + original=Original(string="c=d\r\n", line=2), + error=False, + ), + Binding( + key=None, + value=None, + original=Original(string="e: f", line=3), + error=True, + ), + ], + ), ( "a=b\nc=d", [