Skip to content

Commit 54d0118

Browse files
committed
Fix problem when reading bz2 files
This fixes a case where libz2 tells us that there is no data any more (BZ_STREAM_END), but we are not at the end of file, so there could be more data. But then there isn't (nunused==0). It seems this doesn't happen very often, but it does happen occasionally. Fixes #373
1 parent 8820497 commit 54d0118

File tree

1 file changed

+15
-11
lines changed

1 file changed

+15
-11
lines changed

include/osmium/io/bzip2_compression.hpp

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -294,22 +294,26 @@ namespace osmium {
294294
detail::throw_bzip2_error(m_bzfile, "read failed", bzerror);
295295
}
296296
if (bzerror == BZ_STREAM_END) {
297-
void* unused = nullptr;
298-
int nunused = 0;
299297
if (!feof(m_file.file())) {
298+
void* unused = nullptr;
299+
int nunused = 0;
300300
::BZ2_bzReadGetUnused(&bzerror, m_bzfile, &unused, &nunused);
301301
if (bzerror != BZ_OK) {
302302
detail::throw_bzip2_error(m_bzfile, "get unused failed", bzerror);
303303
}
304-
std::string unused_data{static_cast<const char*>(unused), static_cast<std::string::size_type>(nunused)};
305-
::BZ2_bzReadClose(&bzerror, m_bzfile);
306-
if (bzerror != BZ_OK) {
307-
throw bzip2_error{"bzip2 error: read close failed", bzerror};
308-
}
309-
assert(unused_data.size() < std::numeric_limits<int>::max());
310-
m_bzfile = ::BZ2_bzReadOpen(&bzerror, m_file.file(), 0, 0, &*unused_data.begin(), static_cast<int>(unused_data.size()));
311-
if (!m_bzfile) {
312-
throw bzip2_error{"bzip2 error: read open failed", bzerror};
304+
if (nunused != 0) {
305+
std::string unused_data{static_cast<const char*>(unused), static_cast<std::string::size_type>(nunused)};
306+
::BZ2_bzReadClose(&bzerror, m_bzfile);
307+
if (bzerror != BZ_OK) {
308+
throw bzip2_error{"bzip2 error: read close failed", bzerror};
309+
}
310+
assert(unused_data.size() < std::numeric_limits<int>::max());
311+
m_bzfile = ::BZ2_bzReadOpen(&bzerror, m_file.file(), 0, 0, &*unused_data.begin(), static_cast<int>(unused_data.size()));
312+
if (!m_bzfile) {
313+
throw bzip2_error{"bzip2 error: read open failed", bzerror};
314+
}
315+
} else {
316+
m_stream_end = true;
313317
}
314318
} else {
315319
m_stream_end = true;

0 commit comments

Comments
 (0)