Skip to content

Commit 17d78d3

Browse files
committed
fix bounds checking in parsing of gzip header
1 parent 9d276ad commit 17d78d3

File tree

3 files changed

+24
-8
lines changed

3 files changed

+24
-8
lines changed

src/gzip.cpp

+8-8
Original file line numberDiff line numberDiff line change
@@ -112,13 +112,13 @@ namespace libtorrent {
112112
namespace {
113113

114114
// returns -1 if gzip header is invalid or the header size in bytes
115-
int gzip_header(span<char const> const buf)
115+
int gzip_header(span<char const> const in)
116116
{
117117
// The zip header cannot be shorter than 10 bytes
118-
if (buf.size() < 10) return -1;
118+
if (in.size() < 10) return -1;
119119

120120
span<unsigned char const> buffer(
121-
reinterpret_cast<const unsigned char*>(buf.data()), buf.size());
121+
reinterpret_cast<const unsigned char*>(in.data()), in.size());
122122

123123
// gzip is defined in https://tools.ietf.org/html/rfc1952
124124

@@ -150,22 +150,22 @@ namespace {
150150

151151
if (flags & FNAME)
152152
{
153-
if (buf.empty()) return -1;
153+
if (buffer.empty()) return -1;
154154
while (buffer[0] != 0)
155155
{
156156
buffer = buffer.subspan(1);
157-
if (buf.empty()) return -1;
157+
if (buffer.empty()) return -1;
158158
}
159159
buffer = buffer.subspan(1);
160160
}
161161

162162
if (flags & FCOMMENT)
163163
{
164-
if (buf.empty()) return -1;
164+
if (buffer.empty()) return -1;
165165
while (buffer[0] != 0)
166166
{
167167
buffer = buffer.subspan(1);
168-
if (buf.empty()) return -1;
168+
if (buffer.empty()) return -1;
169169
}
170170
buffer = buffer.subspan(1);
171171
}
@@ -176,7 +176,7 @@ namespace {
176176
buffer = buffer.subspan(2);
177177
}
178178

179-
return static_cast<int>(buf.size() - buffer.size());
179+
return static_cast<int>(in.size() - buffer.size());
180180
}
181181
} // anonymous namespace
182182

test/invalid1.gz

27 Bytes
Binary file not shown.

test/test_gzip.cpp

+16
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,22 @@ TORRENT_TEST(corrupt)
7474
TEST_CHECK(ec);
7575
}
7676

77+
TORRENT_TEST(invalid1)
78+
{
79+
std::vector<char> zipped;
80+
error_code ec;
81+
load_file(combine_path("..", "invalid1.gz"), zipped, ec, 1000000);
82+
if (ec) std::printf("failed to open file: (%d) %s\n", ec.value()
83+
, ec.message().c_str());
84+
TEST_CHECK(!ec);
85+
86+
std::vector<char> inflated;
87+
inflate_gzip(zipped, inflated, 1000000, ec);
88+
89+
// we expect this to fail
90+
TEST_CHECK(ec);
91+
}
92+
7793
TORRENT_TEST(empty)
7894
{
7995
std::vector<char> empty;

0 commit comments

Comments
 (0)