]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.11] gh-104282: Fix null pointer dereference in `lzma._decode_filter_properties...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Wed, 17 Jan 2024 13:30:29 +0000 (14:30 +0100)
committerGitHub <noreply@github.com>
Wed, 17 Jan 2024 13:30:29 +0000 (13:30 +0000)
(cherry picked from commit 0154405350c272833bd51f68138223655e142a37)

Co-authored-by: Radislav Chugunov <52372310+chgnrdv@users.noreply.github.com>
Lib/test/test_lzma.py
Misc/NEWS.d/next/Library/2023-05-08-09-30-00.gh-issue-104282.h4c6Eb.rst [new file with mode: 0644]
Modules/_lzmamodule.c

index 49042d7390b66d3fe531ed704de96a68e59e96b3..d2ae133a41ff40149679b3524102b9eada033b19 100644 (file)
@@ -1409,6 +1409,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 (file)
index 0000000..569ce66
--- /dev/null
@@ -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.
index b572d8cd909fd14b83e1e9f16702d76c5551a04f..97453a280881313e397002ac6a06e5710110ddca 100644 (file)
@@ -494,7 +494,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: