diff options
author | Radislav Chugunov <52372310+chgnrdv@users.noreply.github.com> | 2024-01-17 13:15:44 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-17 13:15:44 (GMT) |
commit | 0154405350c272833bd51f68138223655e142a37 (patch) | |
tree | 5042245564375d418c5ad9475ceb2e71481eb5c9 | |
parent | b204c4beb44c1a9013f8da16984c9129374ed8c5 (diff) | |
download | cpython-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.py | 8 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2023-05-08-09-30-00.gh-issue-104282.h4c6Eb.rst | 3 | ||||
-rw-r--r-- | Modules/_lzmamodule.c | 4 |
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: |