summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRadislav Chugunov <52372310+chgnrdv@users.noreply.github.com>2024-01-17 13:15:44 (GMT)
committerGitHub <noreply@github.com>2024-01-17 13:15:44 (GMT)
commit0154405350c272833bd51f68138223655e142a37 (patch)
tree5042245564375d418c5ad9475ceb2e71481eb5c9
parentb204c4beb44c1a9013f8da16984c9129374ed8c5 (diff)
downloadcpython-0154405350c272833bd51f68138223655e142a37.zip
cpython-0154405350c272833bd51f68138223655e142a37.tar.gz
cpython-0154405350c272833bd51f68138223655e142a37.tar.bz2
gh-104282: Fix null pointer dereference in `lzma._decode_filter_properties` (GH-104283)
-rw-r--r--Lib/test/test_lzma.py8
-rw-r--r--Misc/NEWS.d/next/Library/2023-05-08-09-30-00.gh-issue-104282.h4c6Eb.rst3
-rw-r--r--Modules/_lzmamodule.c4
3 files changed, 14 insertions, 1 deletions
diff --git a/Lib/test/test_lzma.py b/Lib/test/test_lzma.py
index 13b2009..65e6488 100644
--- a/Lib/test/test_lzma.py
+++ b/Lib/test/test_lzma.py
@@ -1401,6 +1401,14 @@ class MiscellaneousTestCase(unittest.TestCase):
self.assertEqual(filterspec["lc"], 3)
self.assertEqual(filterspec["dict_size"], 8 << 20)
+ # see gh-104282
+ filters = [lzma.FILTER_X86, lzma.FILTER_POWERPC,
+ lzma.FILTER_IA64, lzma.FILTER_ARM,
+ lzma.FILTER_ARMTHUMB, lzma.FILTER_SPARC]
+ for f in filters:
+ filterspec = lzma._decode_filter_properties(f, b"")
+ self.assertEqual(filterspec, {"id": f})
+
def test_filter_properties_roundtrip(self):
spec1 = lzma._decode_filter_properties(
lzma.FILTER_LZMA1, b"]\x00\x00\x80\x00")
diff --git a/Misc/NEWS.d/next/Library/2023-05-08-09-30-00.gh-issue-104282.h4c6Eb.rst b/Misc/NEWS.d/next/Library/2023-05-08-09-30-00.gh-issue-104282.h4c6Eb.rst
new file mode 100644
index 0000000..569ce66
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2023-05-08-09-30-00.gh-issue-104282.h4c6Eb.rst
@@ -0,0 +1,3 @@
+Fix null pointer dereference in :func:`lzma._decode_filter_properties`
+due to improper handling of BCJ filters with properties of zero length.
+Patch by Radislav Chugunov.
diff --git a/Modules/_lzmamodule.c b/Modules/_lzmamodule.c
index eb90c30..f6bfbfa 100644
--- a/Modules/_lzmamodule.c
+++ b/Modules/_lzmamodule.c
@@ -492,7 +492,9 @@ build_filter_spec(const lzma_filter *f)
case LZMA_FILTER_ARMTHUMB:
case LZMA_FILTER_SPARC: {
lzma_options_bcj *options = f->options;
- ADD_FIELD(options, start_offset);
+ if (options) {
+ ADD_FIELD(options, start_offset);
+ }
break;
}
default: