summaryrefslogtreecommitdiffstats
path: root/meta-python/recipes-devtools/python/python3-python-multipart
diff options
context:
space:
mode:
Diffstat (limited to 'meta-python/recipes-devtools/python/python3-python-multipart')
-rw-r--r--meta-python/recipes-devtools/python/python3-python-multipart/CVE-2026-24486.patch61
1 files changed, 61 insertions, 0 deletions
diff --git a/meta-python/recipes-devtools/python/python3-python-multipart/CVE-2026-24486.patch b/meta-python/recipes-devtools/python/python3-python-multipart/CVE-2026-24486.patch
new file mode 100644
index 0000000000..110737a761
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-python-multipart/CVE-2026-24486.patch
@@ -0,0 +1,61 @@
1From 1194f169d7f6db3b518c40ef703135ffc4015ebe Mon Sep 17 00:00:00 2001
2From: Marcelo Trylesinski <marcelotryle@gmail.com>
3Date: Sun, 25 Jan 2026 10:37:09 +0100
4Subject: [PATCH] Merge commit from fork
5
6CVE: CVE-2026-24486
7Upstream-Status: Backport [https://github.com/Kludex/python-multipart/commit/9433f4bbc9652bdde82bbe380984e32f8cfc89c4]
8Signed-off-by: Gyorgy Sarvari <skandigraun@gmail.com>
9---
10 python_multipart/multipart.py | 4 +++-
11 tests/test_file.py | 26 ++++++++++++++++++++++++++
12 2 files changed, 29 insertions(+), 1 deletion(-)
13 create mode 100644 tests/test_file.py
14
15diff --git a/python_multipart/multipart.py b/python_multipart/multipart.py
16index f26a815..7168c96 100644
17--- a/python_multipart/multipart.py
18+++ b/python_multipart/multipart.py
19@@ -376,7 +376,9 @@ class File:
20
21 # Split the extension from the filename.
22 if file_name is not None:
23- base, ext = os.path.splitext(file_name)
24+ # Extract just the basename to avoid directory traversal
25+ basename = os.path.basename(file_name)
26+ base, ext = os.path.splitext(basename)
27 self._file_base = base
28 self._ext = ext
29
30diff --git a/tests/test_file.py b/tests/test_file.py
31new file mode 100644
32index 0000000..4d65232
33--- /dev/null
34+++ b/tests/test_file.py
35@@ -0,0 +1,26 @@
36+from pathlib import Path
37+
38+from python_multipart.multipart import File
39+
40+
41+def test_upload_dir_with_leading_slash_in_filename(tmp_path: Path):
42+ upload_dir = tmp_path / "upload"
43+ upload_dir.mkdir()
44+
45+ # When the file_name provided has a leading slash, we should only use the basename.
46+ # This is to avoid directory traversal.
47+ to_upload = tmp_path / "foo.txt"
48+
49+ file = File(
50+ bytes(to_upload),
51+ config={
52+ "UPLOAD_DIR": bytes(upload_dir),
53+ "UPLOAD_KEEP_FILENAME": True,
54+ "UPLOAD_KEEP_EXTENSIONS": True,
55+ "MAX_MEMORY_FILE_SIZE": 10,
56+ },
57+ )
58+ file.write(b"123456789012")
59+ assert not file.in_memory
60+ assert Path(upload_dir / "foo.txt").exists()
61+ assert Path(upload_dir / "foo.txt").read_bytes() == b"123456789012"