]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-115225: Raise error on unsupported ISO 8601 time strings (#119339)
authorbenchatt <benchatt@users.noreply.github.com>
Wed, 5 Jun 2024 17:35:40 +0000 (10:35 -0700)
committerGitHub <noreply@github.com>
Wed, 5 Jun 2024 17:35:40 +0000 (13:35 -0400)
Some time strings that contain fractional hours or minutes are permitted
by ISO 8601, but such strings are very unlikely to be intentional. The
current parser does not parse such strings correctly or raise an error.
This change raises a ValueError when hours or minutes contain a decimal mark.

Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com>
Lib/test/datetimetester.py
Misc/ACKS
Misc/NEWS.d/next/Library/2024-05-21-19-10-30.gh-issue-115225.eRmfJH.rst [new file with mode: 0644]
Modules/_datetimemodule.c

index 535b17d0727611302f6dd21d6e6d636c62c833ad..3759504b02e5508b79feb566b6802b4f83abc082 100644 (file)
@@ -4412,6 +4412,8 @@ class TestTimeTZ(TestTime, TZInfoBase, unittest.TestCase):
             '12:30:45.123456-',         # Extra at end of microsecond time
             '12:30:45.123456+',         # Extra at end of microsecond time
             '12:30:45.123456+12:00:30a',    # Extra at end of full time
+            '12.5',                     # Decimal mark at end of hour
+            '12:30,5',                  # Decimal mark at end of minute
         ]
 
         for bad_str in bad_strs:
index 2e7e12481bacd793607fb45eae4b7667dbca1008..af92d81ff3141a75524ea7493ce83360694fbcba 100644 (file)
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -315,6 +315,7 @@ Greg Chapman
 Mitch Chapman
 Matt Chaput
 William Chargin
+Ben Chatterton
 Yogesh Chaudhari
 Gautam Chaudhuri
 David Chaum
diff --git a/Misc/NEWS.d/next/Library/2024-05-21-19-10-30.gh-issue-115225.eRmfJH.rst b/Misc/NEWS.d/next/Library/2024-05-21-19-10-30.gh-issue-115225.eRmfJH.rst
new file mode 100644 (file)
index 0000000..2b65eaa
--- /dev/null
@@ -0,0 +1 @@
+Raise error on certain technically valid but pathological ISO 8601 strings passed to :meth:`datetime.time.fromisoformat` that were previously parsed incorrectly.
index d6fa273c75e15ebbee96999ecfee99c97744e2ab..bea6e9411a75edaba238e83df59a52e44ce819b6 100644 (file)
@@ -1020,6 +1020,9 @@ parse_hh_mm_ss_ff(const char *tstr, const char *tstr_end, int *hour,
             continue;
         }
         else if (c == '.' || c == ',') {
+            if (i < 2) {
+                return -3; // Decimal mark on hour or minute
+            }
             break;
         } else if (!has_separator) {
             --p;