From 70ecbd06a6e6cef168e1eccbdc074f4416adbd2e Mon Sep 17 00:00:00 2001 From: Jakob Nybo Nissen Date: Sun, 31 Aug 2025 13:44:44 +0200 Subject: [PATCH] Fix off-by-one in gzip parsing --- Project.toml | 2 +- src/gzip.jl | 2 +- test/gzip.jl | 11 ++++++++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Project.toml b/Project.toml index 1eb13e0..de59d57 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "LibDeflate" uuid = "9255714d-24a7-4b30-8ea3-d46a97f7e13b" authors = ["Jakob Nybo Nissen "] -version = "0.4.2" +version = "0.4.3" [deps] libdeflate_jll = "46979653-d7f6-5232-b59e-dd310c4598de" diff --git a/src/gzip.jl b/src/gzip.jl index 4f9c1f3..9dddb1f 100644 --- a/src/gzip.jl +++ b/src/gzip.jl @@ -185,7 +185,7 @@ function unsafe_parse_gzip_header( extra = parse_fields!(extra_vector, ptr + index + 2, index + UInt32(2), extra_len) extra isa LibDeflateError && return extra index += extra_len + UInt32(2) - index > max_len && return LibDeflateErrors.gzip_extra_too_long + (index - one(index)) > max_len && return LibDeflateErrors.gzip_extra_too_long end filename = nothing diff --git a/test/gzip.jl b/test/gzip.jl index e309ab9..3764063 100644 --- a/test/gzip.jl +++ b/test/gzip.jl @@ -81,6 +81,15 @@ end header_data[end-2] = 0x01 @test GC.@preserve header_data unsafe_parse_gzip_header(pointer(header_data), UInt(51)) == LibDeflateErrors.gzip_string_not_null_terminated header_data[end-2] = 0x00 + + minimal_data = UInt8[0x1f, 0x8b, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x06, 0x00, 0x42, 0x43, 0x02, 0x00, 0x10, 0x20 + ] + (header_len, header) = parse_gzip_header(minimal_data) + @test header_len == 18 + ex = only(header.extra) + @test ex.tag == (0x42, 0x43) + @test ex.data == 17:18 end @@ -154,4 +163,4 @@ complex_test_case = vcat(header_data, UInt8[ res = gzip_decompress!(decompressor, outdata, complex_test_case) test_header_example(complex_test_case, res.header) @test res.len == 11 -end \ No newline at end of file +end