Blame SOURCES/CVE-2021-20095.patch

e849d1
diff --git a/babel/localedata.py b/babel/localedata.py
e849d1
index 9308b5e..688af79 100644
e849d1
--- a/babel/localedata.py
e849d1
+++ b/babel/localedata.py
e849d1
@@ -18,6 +18,9 @@
e849d1
 """
e849d1
 
e849d1
 import os
e849d1
+import re
e849d1
+import sys
e849d1
+
e849d1
 import pickle
e849d1
 try:
e849d1
     import threading
e849d1
@@ -31,7 +34,23 @@ __docformat__ = 'restructuredtext en'
e849d1
 _cache = {}
e849d1
 _cache_lock = threading.RLock()
e849d1
 _dirname = os.path.join(os.path.dirname(__file__), 'localedata')
e849d1
+_windows_reserved_name_re = re.compile("^(con|prn|aux|nul|com[0-9]|lpt[0-9])$", re.I)
e849d1
+
e849d1
+
e849d1
+def resolve_locale_filename(name):
e849d1
+    """
e849d1
+    Resolve a locale identifier to a `.dat` path on disk.
e849d1
+    """
e849d1
+
e849d1
+    # Clean up any possible relative paths.
e849d1
+    name = os.path.basename(name)
e849d1
+
e849d1
+    # Ensure we're not left with one of the Windows reserved names.
e849d1
+    if sys.platform == "win32" and _windows_reserved_name_re.match(os.path.splitext(name)[0]):
e849d1
+        raise ValueError("Name %s is invalid on Windows" % name)
e849d1
 
e849d1
+    # Build the path.
e849d1
+    return os.path.join(_dirname, '%s.dat' % name)
e849d1
 
e849d1
 def exists(name):
e849d1
     """Check whether locale data is available for the given locale.
e849d1
@@ -42,7 +61,7 @@ def exists(name):
e849d1
     """
e849d1
     if name in _cache:
e849d1
         return True
e849d1
-    return os.path.exists(os.path.join(_dirname, '%s.dat' % name))
e849d1
+    return os.path.exists(resolve_locale_filename(name))
e849d1
 
e849d1
 
e849d1
 def list():
e849d1
@@ -85,6 +104,7 @@ def load(name, merge_inherited=True):
e849d1
     :raise `IOError`: if no locale data file is found for the given locale
e849d1
                       identifer, or one of the locales it inherits from
e849d1
     """
e849d1
+    name = os.path.basename(name)
e849d1
     _cache_lock.acquire()
e849d1
     try:
e849d1
         data = _cache.get(name)
e849d1
@@ -99,7 +119,7 @@ def load(name, merge_inherited=True):
e849d1
                 else:
e849d1
                     parent = '_'.join(parts[:-1])
e849d1
                 data = load(parent).copy()
e849d1
-            filename = os.path.join(_dirname, '%s.dat' % name)
e849d1
+            filename = resolve_locale_filename(name)
e849d1
             fileobj = open(filename, 'rb')
e849d1
             try:
e849d1
                 if name != 'root' and merge_inherited: