Introduce private `kMaxPosition` constants instead of repeating an expression for the limit. Special cases: * In `SnappyWriterBase::PushSlow()`, continue to use a higher limit than `kMaxPosition` to allow creating a larger buffer near the end of the supported range and filling it partially. * Fix `riegeli::tensorflow::FileWriter`: the position is limited by `int64_t`, as evidenced by `tsl::WritableFile::Tell()`. PiperOrigin-RevId: 917084196
diff --git a/python/riegeli/bytes/python_reader.cc b/python/riegeli/bytes/python_reader.cc index 7565158..e1907a5 100644 --- a/python/riegeli/bytes/python_reader.cc +++ b/python/riegeli/bytes/python_reader.cc
@@ -175,12 +175,11 @@ } } for (;;) { - if (ABSL_PREDICT_FALSE(limit_pos() == - std::numeric_limits<Position>::max())) { + if (ABSL_PREDICT_FALSE(limit_pos() == kMaxPosition)) { return FailOverflow(); } const size_t length_to_read = UnsignedMin( - max_length, std::numeric_limits<Position>::max() - limit_pos(), + max_length, kMaxPosition - limit_pos(), absl::bit_floor(size_t{std::numeric_limits<Py_ssize_t>::max()})); size_t length_read; if (!use_bytes_) {
diff --git a/python/riegeli/bytes/python_reader.h b/python/riegeli/bytes/python_reader.h index e40a942..7fb4525 100644 --- a/python/riegeli/bytes/python_reader.h +++ b/python/riegeli/bytes/python_reader.h
@@ -24,6 +24,7 @@ #include <stddef.h> +#include <limits> #include <optional> #include <utility> @@ -136,6 +137,8 @@ std::optional<Position> SizeImpl() override; private: + static constexpr Position kMaxPosition = std::numeric_limits<Position>::max(); + ABSL_ATTRIBUTE_COLD bool FailOperation(absl::string_view operation); std::optional<Position> SizeInternal();
diff --git a/python/riegeli/bytes/python_writer.cc b/python/riegeli/bytes/python_writer.cc index f26a524..95ec7a1 100644 --- a/python/riegeli/bytes/python_writer.cc +++ b/python/riegeli/bytes/python_writer.cc
@@ -129,8 +129,7 @@ "nothing to write"; RIEGELI_ASSERT_OK(*this) << "Failed precondition of BufferedWriter::WriteInternal()"; - if (ABSL_PREDICT_FALSE(src.size() > - std::numeric_limits<Position>::max() - start_pos())) { + if (ABSL_PREDICT_FALSE(src.size() > kMaxPosition - start_pos())) { return FailOverflow(); } PythonLock lock;
diff --git a/python/riegeli/bytes/python_writer.h b/python/riegeli/bytes/python_writer.h index 7f57062..e3a37b6 100644 --- a/python/riegeli/bytes/python_writer.h +++ b/python/riegeli/bytes/python_writer.h
@@ -22,6 +22,7 @@ #include <Python.h> // clang-format: do not reorder the above include. +#include <limits> #include <optional> #include <utility> @@ -129,6 +130,8 @@ bool TruncateBehindBuffer(Position new_size) override; private: + static constexpr Position kMaxPosition = std::numeric_limits<Position>::max(); + ABSL_ATTRIBUTE_COLD bool FailOperation(absl::string_view operation); std::optional<Position> SizeInternal();
diff --git a/riegeli/brotli/brotli_reader.cc b/riegeli/brotli/brotli_reader.cc index cea4f28..a1cfe47 100644 --- a/riegeli/brotli/brotli_reader.cc +++ b/riegeli/brotli/brotli_reader.cc
@@ -17,7 +17,6 @@ #include <stddef.h> #include <stdint.h> -#include <limits> #include <memory> #include <utility> @@ -153,8 +152,7 @@ const char* const data = reinterpret_cast<const char*>( BrotliDecoderTakeOutput(decompressor_.get(), &length)); if (length > 0) { - const Position max_length = - std::numeric_limits<Position>::max() - limit_pos(); + const Position max_length = kMaxPosition - limit_pos(); if (ABSL_PREDICT_FALSE(length > max_length)) { set_buffer(data, IntCast<size_t>(max_length)); move_limit_pos(available());
diff --git a/riegeli/brotli/brotli_reader.h b/riegeli/brotli/brotli_reader.h index 7b3813c..4a31ba5 100644 --- a/riegeli/brotli/brotli_reader.h +++ b/riegeli/brotli/brotli_reader.h
@@ -17,6 +17,7 @@ #include <stddef.h> +#include <limits> #include <memory> #include <utility> @@ -133,6 +134,8 @@ } }; + static constexpr Position kMaxPosition = std::numeric_limits<Position>::max(); + void InitializeDecompressor(); BrotliDictionary dictionary_;
diff --git a/riegeli/brotli/brotli_writer.cc b/riegeli/brotli/brotli_writer.cc index 7a158a2..9561ed5 100644 --- a/riegeli/brotli/brotli_writer.cc +++ b/riegeli/brotli/brotli_writer.cc
@@ -17,7 +17,6 @@ #include <stddef.h> #include <stdint.h> -#include <limits> #include <memory> #include <optional> #include <utility> @@ -163,8 +162,7 @@ BrotliEncoderOperation op) { RIEGELI_ASSERT_OK(*this) << "Failed precondition of BrotliWriterBase::WriteInternal()"; - if (ABSL_PREDICT_FALSE(src.size() > - std::numeric_limits<Position>::max() - start_pos())) { + if (ABSL_PREDICT_FALSE(src.size() > kMaxPosition - start_pos())) { return FailOverflow(); } size_t available_in = src.size();
diff --git a/riegeli/brotli/brotli_writer.h b/riegeli/brotli/brotli_writer.h index a1737a4..1b50d36 100644 --- a/riegeli/brotli/brotli_writer.h +++ b/riegeli/brotli/brotli_writer.h
@@ -15,6 +15,7 @@ #ifndef RIEGELI_BROTLI_BROTLI_WRITER_H_ #define RIEGELI_BROTLI_BROTLI_WRITER_H_ +#include <limits> #include <memory> #include <optional> #include <utility> @@ -190,6 +191,8 @@ } }; + static constexpr Position kMaxPosition = std::numeric_limits<Position>::max(); + bool WriteInternal(absl::string_view src, Writer& dest, BrotliEncoderOperation op);
diff --git a/riegeli/bytes/buffered_writer.cc b/riegeli/bytes/buffered_writer.cc index 22df347..0c98bf0 100644 --- a/riegeli/bytes/buffered_writer.cc +++ b/riegeli/bytes/buffered_writer.cc
@@ -17,7 +17,6 @@ #include <stddef.h> #include <cstring> -#include <limits> #include <optional> #include "absl/base/optimization.h" @@ -82,13 +81,12 @@ "enough space available, use Push() instead"; if (ABSL_PREDICT_FALSE(!SyncBuffer())) return false; if (ABSL_PREDICT_FALSE(!ok())) return false; - if (ABSL_PREDICT_FALSE(min_length > - std::numeric_limits<Position>::max() - start_pos())) { + if (ABSL_PREDICT_FALSE(min_length > kMaxPosition - start_pos())) { return FailOverflow(); } const size_t buffer_length = UnsignedMin( buffer_sizer_.BufferLength(start_pos(), min_length, recommended_length), - std::numeric_limits<Position>::max() - start_pos()); + kMaxPosition - start_pos()); buffer_.Reset(buffer_length); set_buffer(buffer_.data(), buffer_length); return true;
diff --git a/riegeli/bytes/buffered_writer.h b/riegeli/bytes/buffered_writer.h index 6efc59e..a8e97d1 100644 --- a/riegeli/bytes/buffered_writer.h +++ b/riegeli/bytes/buffered_writer.h
@@ -17,6 +17,7 @@ #include <stddef.h> +#include <limits> #include <optional> #include <utility> @@ -128,6 +129,8 @@ Reader* ReadModeImpl(Position initial_pos) override; private: + static constexpr Position kMaxPosition = std::numeric_limits<Position>::max(); + // Writes `buffer_` to the destination. Sets buffer pointers to `nullptr`. bool SyncBuffer();
diff --git a/riegeli/bytes/cfile_reader.cc b/riegeli/bytes/cfile_reader.cc index faf45f0..be45417 100644 --- a/riegeli/bytes/cfile_reader.cc +++ b/riegeli/bytes/cfile_reader.cc
@@ -90,6 +90,9 @@ } // namespace +const Position CFileReaderBase::kMaxPosition = + Position{std::numeric_limits<cfile_internal::Offset>::max()}; + void CFileReaderBase::Initialize(FILE* src, const Options& options) { RIEGELI_ASSERT_NE(src, nullptr) << "Failed precondition of CFileReader: null FILE pointer"; @@ -162,9 +165,7 @@ } #endif // _WIN32 if (assumed_pos != std::nullopt) { - if (ABSL_PREDICT_FALSE( - *assumed_pos > - Position{std::numeric_limits<cfile_internal::Offset>::max()})) { + if (ABSL_PREDICT_FALSE(*assumed_pos > kMaxPosition)) { FailOverflow(); return; } @@ -305,15 +306,12 @@ << "Failed precondition of BufferedReader::ReadInternal()"; FILE* const src = SrcFile(); for (;;) { - if (ABSL_PREDICT_FALSE( - limit_pos() >= - Position{std::numeric_limits<cfile_internal::Offset>::max()})) { + if (ABSL_PREDICT_FALSE(limit_pos() >= kMaxPosition)) { return FailOverflow(); } - const size_t length_to_read = UnsignedMin( - UnsignedClamp(AvailableLength(src), min_length, max_length), - Position{std::numeric_limits<cfile_internal::Offset>::max()} - - limit_pos()); + const size_t length_to_read = + UnsignedMin(UnsignedClamp(AvailableLength(src), min_length, max_length), + kMaxPosition - limit_pos()); const size_t length_read = fread(dest, 1, length_to_read, src); RIEGELI_ASSERT_LE(length_read, length_to_read) << "fread() read more than requested";
diff --git a/riegeli/bytes/cfile_reader.h b/riegeli/bytes/cfile_reader.h index 6dd3c7d..b05beeb 100644 --- a/riegeli/bytes/cfile_reader.h +++ b/riegeli/bytes/cfile_reader.h
@@ -225,6 +225,8 @@ std::optional<Position> SizeImpl() override; private: + static const Position kMaxPosition; + absl::Status FailedOperationStatus(absl::string_view operation); bool growing_source_ = false;
diff --git a/riegeli/bytes/cfile_writer.cc b/riegeli/bytes/cfile_writer.cc index e32a3fc..1429605 100644 --- a/riegeli/bytes/cfile_writer.cc +++ b/riegeli/bytes/cfile_writer.cc
@@ -62,6 +62,9 @@ namespace riegeli { +const Position CFileWriterBase::kMaxPosition = + Position{std::numeric_limits<cfile_internal::Offset>::max()}; + void CFileWriterBase::Initialize(FILE* dest, const Options& options) { RIEGELI_ASSERT_NE(dest, nullptr) << "Failed precondition of CFileReader: null FILE pointer"; @@ -140,9 +143,7 @@ } #endif // _WIN32 if (assumed_pos != std::nullopt) { - if (ABSL_PREDICT_FALSE( - *assumed_pos > - Position{std::numeric_limits<cfile_internal::Offset>::max()})) { + if (ABSL_PREDICT_FALSE(*assumed_pos > kMaxPosition)) { FailOverflow(); return; } @@ -363,10 +364,7 @@ << "Failed precondition of BufferedWriter::WriteInternal()"; if (ABSL_PREDICT_FALSE(!WriteMode())) return false; FILE* const dest = DestFile(); - if (ABSL_PREDICT_FALSE( - src.size() > - Position{std::numeric_limits<cfile_internal::Offset>::max()} - - start_pos())) { + if (ABSL_PREDICT_FALSE(src.size() > kMaxPosition - start_pos())) { return FailOverflow(); } const size_t length_written = fwrite(src.data(), 1, src.size(), dest);
diff --git a/riegeli/bytes/cfile_writer.h b/riegeli/bytes/cfile_writer.h index 65277da..7938143 100644 --- a/riegeli/bytes/cfile_writer.h +++ b/riegeli/bytes/cfile_writer.h
@@ -308,6 +308,8 @@ // Encodes a `bool` or a marker that the value is not resolved yet. enum class LazyBoolState : uint8_t { kUnknown, kTrue, kFalse }; + static const Position kMaxPosition; + absl::Status FailedOperationStatus(absl::string_view operation); // Lazily determined condition shared by `SupportsRandomAccess()` and // `SupportsReadMode()`.
diff --git a/riegeli/bytes/chain_backward_writer.cc b/riegeli/bytes/chain_backward_writer.cc index b4078f6..644336d 100644 --- a/riegeli/bytes/chain_backward_writer.cc +++ b/riegeli/bytes/chain_backward_writer.cc
@@ -16,7 +16,6 @@ #include <stddef.h> -#include <limits> #include <optional> #include <utility> @@ -72,8 +71,8 @@ RIEGELI_ASSERT_EQ(limit_pos(), dest.size()) << "ChainBackwardWriter destination changed unexpectedly"; SyncBuffer(dest); - if (ABSL_PREDICT_FALSE(min_length > std::numeric_limits<size_t>::max() - - IntCast<size_t>(start_pos()))) { + if (ABSL_PREDICT_FALSE(min_length > + kMaxPosition - IntCast<size_t>(start_pos()))) { return FailOverflow(); } MakeBuffer(dest, min_length, recommended_length); @@ -89,8 +88,8 @@ RIEGELI_ASSERT_EQ(limit_pos(), dest.size()) << "ChainBackwardWriter destination changed unexpectedly"; SyncBuffer(dest); - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<size_t>::max() - - IntCast<size_t>(start_pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > + kMaxPosition - IntCast<size_t>(start_pos()))) { return FailOverflow(); } move_start_pos(src.size()); @@ -108,8 +107,8 @@ RIEGELI_ASSERT_EQ(limit_pos(), dest.size()) << "ChainBackwardWriter destination changed unexpectedly"; SyncBuffer(dest); - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<size_t>::max() - - IntCast<size_t>(start_pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > + kMaxPosition - IntCast<size_t>(start_pos()))) { return FailOverflow(); } move_start_pos(src.size()); @@ -127,8 +126,8 @@ RIEGELI_ASSERT_EQ(limit_pos(), dest.size()) << "ChainBackwardWriter destination changed unexpectedly"; SyncBuffer(dest); - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<size_t>::max() - - IntCast<size_t>(start_pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > + kMaxPosition - IntCast<size_t>(start_pos()))) { return FailOverflow(); } move_start_pos(src.size()); @@ -146,8 +145,8 @@ RIEGELI_ASSERT_EQ(limit_pos(), dest.size()) << "ChainBackwardWriter destination changed unexpectedly"; SyncBuffer(dest); - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<size_t>::max() - - IntCast<size_t>(start_pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > + kMaxPosition - IntCast<size_t>(start_pos()))) { return FailOverflow(); } move_start_pos(src.size()); @@ -165,8 +164,8 @@ RIEGELI_ASSERT_EQ(limit_pos(), dest.size()) << "ChainBackwardWriter destination changed unexpectedly"; SyncBuffer(dest); - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<size_t>::max() - - IntCast<size_t>(start_pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > + kMaxPosition - IntCast<size_t>(start_pos()))) { return FailOverflow(); } move_start_pos(src.size()); @@ -184,8 +183,8 @@ RIEGELI_ASSERT_EQ(limit_pos(), dest.size()) << "ChainBackwardWriter destination changed unexpectedly"; SyncBuffer(dest); - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<size_t>::max() - - IntCast<size_t>(start_pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > + kMaxPosition - IntCast<size_t>(start_pos()))) { return FailOverflow(); } move_start_pos(src.size());
diff --git a/riegeli/bytes/chain_backward_writer.h b/riegeli/bytes/chain_backward_writer.h index 0114a1d..479c83c 100644 --- a/riegeli/bytes/chain_backward_writer.h +++ b/riegeli/bytes/chain_backward_writer.h
@@ -18,6 +18,7 @@ #include <stddef.h> #include <stdint.h> +#include <limits> #include <optional> #include <type_traits> #include <utility> @@ -152,6 +153,8 @@ bool TruncateImpl(Position new_size) override; private: + static constexpr size_t kMaxPosition = std::numeric_limits<size_t>::max(); + // Discards uninitialized space from the beginning of `dest`, so that it // contains only actual data written. void SyncBuffer(Chain& dest);
diff --git a/riegeli/bytes/chain_writer.cc b/riegeli/bytes/chain_writer.cc index 3009fb5..be4fdfe 100644 --- a/riegeli/bytes/chain_writer.cc +++ b/riegeli/bytes/chain_writer.cc
@@ -16,7 +16,6 @@ #include <stddef.h> -#include <limits> #include <memory> #include <optional> #include <utility> @@ -160,8 +159,8 @@ RIEGELI_ASSERT_LE(limit_pos(), dest.size()) << "ChainWriter destination changed unexpectedly"; SyncBuffer(dest); - if (ABSL_PREDICT_FALSE(min_length > std::numeric_limits<size_t>::max() - - IntCast<size_t>(start_pos()))) { + if (ABSL_PREDICT_FALSE(min_length > + kMaxPosition - IntCast<size_t>(start_pos()))) { return FailOverflow(); } MakeBuffer(dest, min_length, recommended_length); @@ -177,8 +176,8 @@ RIEGELI_ASSERT_LE(limit_pos(), dest.size()) << "ChainWriter destination changed unexpectedly"; SyncBuffer(dest); - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<size_t>::max() - - IntCast<size_t>(start_pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > + kMaxPosition - IntCast<size_t>(start_pos()))) { return FailOverflow(); } ShrinkTail(src.size()); @@ -197,8 +196,8 @@ RIEGELI_ASSERT_LE(limit_pos(), dest.size()) << "ChainWriter destination changed unexpectedly"; SyncBuffer(dest); - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<size_t>::max() - - IntCast<size_t>(start_pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > + kMaxPosition - IntCast<size_t>(start_pos()))) { return FailOverflow(); } ShrinkTail(src.size()); @@ -217,8 +216,8 @@ RIEGELI_ASSERT_LE(limit_pos(), dest.size()) << "ChainWriter destination changed unexpectedly"; SyncBuffer(dest); - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<size_t>::max() - - IntCast<size_t>(start_pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > + kMaxPosition - IntCast<size_t>(start_pos()))) { return FailOverflow(); } ShrinkTail(src.size()); @@ -237,8 +236,8 @@ RIEGELI_ASSERT_LE(limit_pos(), dest.size()) << "ChainWriter destination changed unexpectedly"; SyncBuffer(dest); - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<size_t>::max() - - IntCast<size_t>(start_pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > + kMaxPosition - IntCast<size_t>(start_pos()))) { return FailOverflow(); } ShrinkTail(src.size()); @@ -257,8 +256,8 @@ RIEGELI_ASSERT_LE(limit_pos(), dest.size()) << "ChainWriter destination changed unexpectedly"; SyncBuffer(dest); - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<size_t>::max() - - IntCast<size_t>(start_pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > + kMaxPosition - IntCast<size_t>(start_pos()))) { return FailOverflow(); } ShrinkTail(src.size()); @@ -277,8 +276,8 @@ RIEGELI_ASSERT_LE(limit_pos(), dest.size()) << "ChainWriter destination changed unexpectedly"; SyncBuffer(dest); - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<size_t>::max() - - IntCast<size_t>(start_pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > + kMaxPosition - IntCast<size_t>(start_pos()))) { return FailOverflow(); } ShrinkTail(IntCast<size_t>(src.size()));
diff --git a/riegeli/bytes/chain_writer.h b/riegeli/bytes/chain_writer.h index 0740f1a..7a794b6 100644 --- a/riegeli/bytes/chain_writer.h +++ b/riegeli/bytes/chain_writer.h
@@ -18,6 +18,7 @@ #include <stddef.h> #include <stdint.h> +#include <limits> #include <memory> #include <optional> #include <type_traits> @@ -164,6 +165,8 @@ Reader* ReadModeImpl(Position initial_pos) override; private: + static constexpr size_t kMaxPosition = std::numeric_limits<size_t>::max(); + // Discards uninitialized space from the end of `dest`, so that it contains // only actual data written. Ensures that data which follow the current // position are separated in `*tail_`.
diff --git a/riegeli/bytes/cord_backward_writer.cc b/riegeli/bytes/cord_backward_writer.cc index 5032a78..4f7b6e7 100644 --- a/riegeli/bytes/cord_backward_writer.cc +++ b/riegeli/bytes/cord_backward_writer.cc
@@ -16,7 +16,6 @@ #include <stddef.h> -#include <limits> #include <optional> #include <utility> @@ -109,8 +108,7 @@ absl::Cord& dest = *DestCord(); RIEGELI_ASSERT_EQ(start_pos(), dest.size()) << "CordBackwardWriter destination changed unexpectedly"; - if (ABSL_PREDICT_FALSE(min_length > std::numeric_limits<size_t>::max() - - IntCast<size_t>(pos()))) { + if (ABSL_PREDICT_FALSE(min_length > kMaxPosition - IntCast<size_t>(pos()))) { return FailOverflow(); } if (start_to_cursor() >= min_block_size_) SyncBuffer(dest); @@ -140,9 +138,8 @@ // The size prediction turned out to be wrong, and the actual size is // insufficient even for what is required. Ignore `new_cord_buffer`. } else { - new_cord_buffer.SetLength( - UnsignedMin(new_cord_buffer.capacity(), - std::numeric_limits<size_t>::max() - dest.size())); + new_cord_buffer.SetLength(UnsignedMin(new_cord_buffer.capacity(), + kMaxPosition - dest.size())); riegeli::null_safe_memcpy( new_cord_buffer.data() + new_cord_buffer.length() - cursor_index, cursor(), cursor_index); @@ -159,8 +156,8 @@ Buffer new_buffer = buffer_.capacity() >= buffer_length ? std::move(buffer_) : Buffer(buffer_length); - const size_t length = UnsignedMin( - new_buffer.capacity(), std::numeric_limits<size_t>::max() - dest.size()); + const size_t length = + UnsignedMin(new_buffer.capacity(), kMaxPosition - dest.size()); riegeli::null_safe_memcpy(new_buffer.data() + length - cursor_index, cursor(), cursor_index); buffer_ = std::move(new_buffer); @@ -180,8 +177,8 @@ RIEGELI_ASSERT_EQ(start_pos(), dest.size()) << "CordBackwardWriter destination changed unexpectedly"; SyncBuffer(dest); - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<size_t>::max() - - IntCast<size_t>(start_pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > + kMaxPosition - IntCast<size_t>(start_pos()))) { return FailOverflow(); } move_start_pos(src.size()); @@ -199,8 +196,8 @@ RIEGELI_ASSERT_EQ(start_pos(), dest.size()) << "CordBackwardWriter destination changed unexpectedly"; SyncBuffer(dest); - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<size_t>::max() - - IntCast<size_t>(start_pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > + kMaxPosition - IntCast<size_t>(start_pos()))) { return FailOverflow(); } move_start_pos(src.size()); @@ -224,8 +221,8 @@ RIEGELI_ASSERT_EQ(start_pos(), dest.size()) << "CordBackwardWriter destination changed unexpectedly"; SyncBuffer(dest); - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<size_t>::max() - - IntCast<size_t>(start_pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > + kMaxPosition - IntCast<size_t>(start_pos()))) { return FailOverflow(); } move_start_pos(src.size()); @@ -243,8 +240,8 @@ RIEGELI_ASSERT_EQ(start_pos(), dest.size()) << "CordBackwardWriter destination changed unexpectedly"; SyncBuffer(dest); - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<size_t>::max() - - IntCast<size_t>(start_pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > + kMaxPosition - IntCast<size_t>(start_pos()))) { return FailOverflow(); } move_start_pos(src.size()); @@ -268,8 +265,8 @@ RIEGELI_ASSERT_EQ(start_pos(), dest.size()) << "CordBackwardWriter destination changed unexpectedly"; SyncBuffer(dest); - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<size_t>::max() - - IntCast<size_t>(start_pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > + kMaxPosition - IntCast<size_t>(start_pos()))) { return FailOverflow(); } move_start_pos(src.size()); @@ -287,8 +284,8 @@ RIEGELI_ASSERT_EQ(start_pos(), dest.size()) << "CordBackwardWriter destination changed unexpectedly"; SyncBuffer(dest); - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<size_t>::max() - - IntCast<size_t>(start_pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > + kMaxPosition - IntCast<size_t>(start_pos()))) { return FailOverflow(); } move_start_pos(src.size());
diff --git a/riegeli/bytes/cord_backward_writer.h b/riegeli/bytes/cord_backward_writer.h index d2b3b7d..336a02e 100644 --- a/riegeli/bytes/cord_backward_writer.h +++ b/riegeli/bytes/cord_backward_writer.h
@@ -18,6 +18,7 @@ #include <stddef.h> #include <stdint.h> +#include <limits> #include <optional> #include <type_traits> #include <utility> @@ -153,6 +154,8 @@ bool TruncateImpl(Position new_size) override; private: + static constexpr size_t kMaxPosition = std::numeric_limits<size_t>::max(); + // When deciding whether to copy an array of bytes or share memory, prefer // copying up to this length. size_t MaxBytesToCopy() const;
diff --git a/riegeli/bytes/cord_writer.cc b/riegeli/bytes/cord_writer.cc index 79230b1..1c26643 100644 --- a/riegeli/bytes/cord_writer.cc +++ b/riegeli/bytes/cord_writer.cc
@@ -16,7 +16,6 @@ #include <stddef.h> -#include <limits> #include <memory> #include <optional> #include <utility> @@ -174,8 +173,7 @@ return true; } } - if (ABSL_PREDICT_FALSE(min_length > std::numeric_limits<size_t>::max() - - IntCast<size_t>(pos()))) { + if (ABSL_PREDICT_FALSE(min_length > kMaxPosition - IntCast<size_t>(pos()))) { return FailOverflow(); } if (start_to_cursor() >= min_block_size_) SyncBuffer(dest); @@ -205,9 +203,8 @@ // The size prediction turned out to be wrong, and the actual size is // insufficient even for what is required. Ignore `new_cord_buffer`. } else { - new_cord_buffer.SetLength( - UnsignedMin(new_cord_buffer.capacity(), - std::numeric_limits<size_t>::max() - dest.size())); + new_cord_buffer.SetLength(UnsignedMin(new_cord_buffer.capacity(), + kMaxPosition - dest.size())); riegeli::null_safe_memcpy(new_cord_buffer.data(), start(), cursor_index); cord_buffer_ = std::move(new_cord_buffer); @@ -226,8 +223,7 @@ riegeli::null_safe_memcpy(new_buffer.data(), start(), cursor_index); buffer_ = std::move(new_buffer); set_buffer(buffer_.data(), - UnsignedMin(buffer_.capacity(), - std::numeric_limits<size_t>::max() - dest.size()), + UnsignedMin(buffer_.capacity(), kMaxPosition - dest.size()), cursor_index); return true; } @@ -242,8 +238,8 @@ RIEGELI_ASSERT_LE(start_pos(), dest.size()) << "CordWriter destination changed unexpectedly"; SyncBuffer(dest); - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<size_t>::max() - - IntCast<size_t>(start_pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > + kMaxPosition - IntCast<size_t>(start_pos()))) { return FailOverflow(); } ShrinkTail(src.size()); @@ -262,8 +258,8 @@ RIEGELI_ASSERT_LE(start_pos(), dest.size()) << "CordWriter destination changed unexpectedly"; SyncBuffer(dest); - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<size_t>::max() - - IntCast<size_t>(start_pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > + kMaxPosition - IntCast<size_t>(start_pos()))) { return FailOverflow(); } ShrinkTail(src.size()); @@ -287,8 +283,8 @@ RIEGELI_ASSERT_LE(start_pos(), dest.size()) << "CordWriter destination changed unexpectedly"; SyncBuffer(dest); - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<size_t>::max() - - IntCast<size_t>(start_pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > + kMaxPosition - IntCast<size_t>(start_pos()))) { return FailOverflow(); } ShrinkTail(src.size()); @@ -307,8 +303,8 @@ RIEGELI_ASSERT_LE(start_pos(), dest.size()) << "CordWriter destination changed unexpectedly"; SyncBuffer(dest); - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<size_t>::max() - - IntCast<size_t>(start_pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > + kMaxPosition - IntCast<size_t>(start_pos()))) { return FailOverflow(); } ShrinkTail(src.size()); @@ -332,8 +328,8 @@ RIEGELI_ASSERT_LE(start_pos(), dest.size()) << "CordWriter destination changed unexpectedly"; SyncBuffer(dest); - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<size_t>::max() - - IntCast<size_t>(start_pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > + kMaxPosition - IntCast<size_t>(start_pos()))) { return FailOverflow(); } ShrinkTail(src.size()); @@ -352,8 +348,8 @@ RIEGELI_ASSERT_LE(start_pos(), dest.size()) << "CordWriter destination changed unexpectedly"; SyncBuffer(dest); - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<size_t>::max() - - IntCast<size_t>(start_pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > + kMaxPosition - IntCast<size_t>(start_pos()))) { return FailOverflow(); } ShrinkTail(IntCast<size_t>(src.size()));
diff --git a/riegeli/bytes/cord_writer.h b/riegeli/bytes/cord_writer.h index af62234..e443d62 100644 --- a/riegeli/bytes/cord_writer.h +++ b/riegeli/bytes/cord_writer.h
@@ -166,6 +166,8 @@ Reader* ReadModeImpl(Position initial_pos) override; private: + static constexpr size_t kMaxPosition = std::numeric_limits<size_t>::max(); + // When deciding whether to copy an array of bytes or share memory, prefer // copying up to this length. size_t MaxBytesToCopy() const; @@ -376,8 +378,7 @@ const size_t existing_length = cord_buffer_.length(); if (existing_length > 0) { cord_buffer_.SetLength( - UnsignedMin(cord_buffer_.capacity(), - std::numeric_limits<size_t>::max() - dest->size())); + UnsignedMin(cord_buffer_.capacity(), kMaxPosition - dest->size())); set_buffer(cord_buffer_.data(), cord_buffer_.length(), existing_length); } } else {
diff --git a/riegeli/bytes/fd_reader.cc b/riegeli/bytes/fd_reader.cc index bcb3e0a..ce149e8 100644 --- a/riegeli/bytes/fd_reader.cc +++ b/riegeli/bytes/fd_reader.cc
@@ -160,6 +160,9 @@ #endif +const Position FdReaderBase::kMaxPosition = + Position{std::numeric_limits<fd_internal::Offset>::max()}; + void FdReaderBase::Initialize(int src, const Options& options) { RIEGELI_ASSERT_GE(src, 0) << "Failed precondition of FdReader: negative file descriptor"; @@ -233,9 +236,7 @@ "must not be both set")); return; } - if (ABSL_PREDICT_FALSE( - *assumed_pos > - Position{std::numeric_limits<fd_internal::Offset>::max()})) { + if (ABSL_PREDICT_FALSE(*assumed_pos > kMaxPosition)) { FailOverflow(); return; } @@ -247,9 +248,7 @@ }); } else if (options.independent_pos() != std::nullopt) { has_independent_pos_ = true; - if (ABSL_PREDICT_FALSE( - *options.independent_pos() > - Position{std::numeric_limits<fd_internal::Offset>::max()})) { + if (ABSL_PREDICT_FALSE(*options.independent_pos() > kMaxPosition)) { FailOverflow(); return; } @@ -399,15 +398,12 @@ << "Failed precondition of BufferedReader::ReadInternal()"; const int src = SrcFd(); for (;;) { - if (ABSL_PREDICT_FALSE( - limit_pos() >= - Position{std::numeric_limits<fd_internal::Offset>::max()})) { + if (ABSL_PREDICT_FALSE(limit_pos() >= kMaxPosition)) { return FailOverflow(); } #ifndef _WIN32 const size_t length_to_read = UnsignedMin( - max_length, - Position{std::numeric_limits<fd_internal::Offset>::max()} - limit_pos(), + max_length, kMaxPosition - limit_pos(), absl::bit_floor(size_t{std::numeric_limits<ssize_t>::max()}), // Darwin and FreeBSD cannot read more than 2 GB - 1 at a time. // Limit to 1 GB for better alignment of reads. @@ -431,11 +427,9 @@ file_handle == reinterpret_cast<HANDLE>(-2))) { return FailWindowsOperation("_get_osfhandle()"); } - length_to_read = UnsignedMin( - max_length, - Position{std::numeric_limits<fd_internal::Offset>::max()} - - limit_pos(), - absl::bit_floor(std::numeric_limits<DWORD>::max())); + length_to_read = + UnsignedMin(max_length, kMaxPosition - limit_pos(), + absl::bit_floor(std::numeric_limits<DWORD>::max())); OVERLAPPED overlapped{}; overlapped.Offset = IntCast<DWORD>(limit_pos() & 0xffffffff); overlapped.OffsetHigh = IntCast<DWORD>(limit_pos() >> 32); @@ -446,9 +440,7 @@ } } else { length_to_read = UnsignedMin( - max_length, - Position{std::numeric_limits<fd_internal::Offset>::max()} - - limit_pos(), + max_length, kMaxPosition - limit_pos(), absl::bit_floor(unsigned{std::numeric_limits<int>::max()})); const int length_read_int = _read(src, dest, IntCast<unsigned>(length_to_read)); @@ -496,20 +488,14 @@ const int dest_fd = fd_writer->DestFd(); fd_internal::Offset src_offset = limit_pos(); fd_internal::Offset dest_offset = fd_writer->start_pos(); - if (ABSL_PREDICT_FALSE( - limit_pos() >= - Position{std::numeric_limits<fd_internal::Offset>::max()})) { + if (ABSL_PREDICT_FALSE(limit_pos() >= kMaxPosition)) { return FailOverflow(); } const size_t length_to_copy = UnsignedMin( - length, - Position{std::numeric_limits<fd_internal::Offset>::max()} - - limit_pos(), + length, kMaxPosition - limit_pos(), absl::bit_floor(size_t{std::numeric_limits<ssize_t>::max()})); - if (ABSL_PREDICT_FALSE( - length_to_copy > - Position{std::numeric_limits<fd_internal::Offset>::max()} - - fd_writer->start_pos())) { + if (ABSL_PREDICT_FALSE(length_to_copy > + kMaxPosition - fd_writer->start_pos())) { return fd_writer->FailOverflow(); } again:
diff --git a/riegeli/bytes/fd_reader.h b/riegeli/bytes/fd_reader.h index a5c79d0..747457b 100644 --- a/riegeli/bytes/fd_reader.h +++ b/riegeli/bytes/fd_reader.h
@@ -273,6 +273,8 @@ std::unique_ptr<Reader> NewReaderCurrentPosImpl() override; private: + static const Position kMaxPosition; + absl::Status FailedOperationStatus(absl::string_view operation); bool SeekInternal(int src, Position new_pos);
diff --git a/riegeli/bytes/fd_writer.cc b/riegeli/bytes/fd_writer.cc index 4666d65..f8488cb 100644 --- a/riegeli/bytes/fd_writer.cc +++ b/riegeli/bytes/fd_writer.cc
@@ -75,6 +75,9 @@ namespace riegeli { +const Position FdWriterBase::kMaxPosition = + Position{std::numeric_limits<fd_internal::Offset>::max()}; + TypeId FdWriterBase::GetTypeId() const { return TypeId::For<FdWriterBase>(); } void FdWriterBase::Initialize(int dest, const Options& options) { @@ -171,9 +174,7 @@ "must not be both set")); return; } - if (ABSL_PREDICT_FALSE( - *assumed_pos > - Position{std::numeric_limits<fd_internal::Offset>::max()})) { + if (ABSL_PREDICT_FALSE(*assumed_pos > kMaxPosition)) { FailOverflow(); return; } @@ -193,9 +194,7 @@ return; } has_independent_pos_ = true; - if (ABSL_PREDICT_FALSE( - *options.independent_pos() > - Position{std::numeric_limits<fd_internal::Offset>::max()})) { + if (ABSL_PREDICT_FALSE(*options.independent_pos() > kMaxPosition)) { FailOverflow(); return; } @@ -443,10 +442,7 @@ << "Failed precondition of BufferedWriter::WriteInternal()"; if (ABSL_PREDICT_FALSE(!WriteMode())) return false; const int dest = DestFd(); - if (ABSL_PREDICT_FALSE( - src.size() > - Position{std::numeric_limits<fd_internal::Offset>::max()} - - start_pos())) { + if (ABSL_PREDICT_FALSE(src.size() > kMaxPosition - start_pos())) { return FailOverflow(); } do { @@ -529,10 +525,7 @@ if (ABSL_PREDICT_FALSE(size == std::nullopt)) return false; RIEGELI_ASSERT_EQ(start_to_limit(), 0u) << "BufferedWriter::SizeImpl() flushes the buffer"; - if (ABSL_PREDICT_FALSE( - src.size() > - Position{std::numeric_limits<fd_internal::Offset>::max()} - - start_pos())) { + if (ABSL_PREDICT_FALSE(src.size() > kMaxPosition - start_pos())) { return FailOverflow(); } const Position new_pos = start_pos() + src.size();
diff --git a/riegeli/bytes/fd_writer.h b/riegeli/bytes/fd_writer.h index 7725cf2..67fe613 100644 --- a/riegeli/bytes/fd_writer.h +++ b/riegeli/bytes/fd_writer.h
@@ -409,6 +409,8 @@ // Encodes a `bool` or a marker that the value is not resolved yet. enum class LazyBoolState : uint8_t { kUnknown, kTrue, kFalse }; + static const Position kMaxPosition; + absl::Status FailedOperationStatus(absl::string_view operation); #ifdef _WIN32 absl::Status FailedWindowsOperationStatus(absl::string_view operation);
diff --git a/riegeli/bytes/istream_reader.cc b/riegeli/bytes/istream_reader.cc index 6c5fe3e..5260b87 100644 --- a/riegeli/bytes/istream_reader.cc +++ b/riegeli/bytes/istream_reader.cc
@@ -19,7 +19,6 @@ #include <cerrno> #include <ios> #include <istream> -#include <limits> #include <optional> #include <string> @@ -55,9 +54,7 @@ // `std::istream::peek()` and `std::istream::tellg()`. src->clear(src->rdstate() & ~std::ios_base::eofbit); if (assumed_pos != std::nullopt) { - if (ABSL_PREDICT_FALSE( - *assumed_pos > - Position{std::numeric_limits<std::streamoff>::max()})) { + if (ABSL_PREDICT_FALSE(*assumed_pos > kMaxPosition)) { FailOverflow(); return; } @@ -184,18 +181,13 @@ std::istream& src = *SrcStream(); errno = 0; for (;;) { - if (ABSL_PREDICT_FALSE( - limit_pos() >= - Position{std::numeric_limits<std::streamoff>::max()})) { + if (ABSL_PREDICT_FALSE(limit_pos() >= kMaxPosition)) { return FailOverflow(); } - std::streamsize length_to_read = IntCast<std::streamsize>(UnsignedMin( - min_length, - Position{std::numeric_limits<std::streamoff>::max()} - limit_pos())); - const std::streamsize max_length_to_read = - IntCast<std::streamsize>(UnsignedMin( - max_length, Position{std::numeric_limits<std::streamoff>::max()} - - limit_pos())); + std::streamsize length_to_read = IntCast<std::streamsize>( + UnsignedMin(min_length, kMaxPosition - limit_pos())); + const std::streamsize max_length_to_read = IntCast<std::streamsize>( + UnsignedMin(max_length, kMaxPosition - limit_pos())); std::streamsize length_read; if (length_to_read < max_length_to_read) { // Use `std::istream::readsome()` to read as much data as is available,
diff --git a/riegeli/bytes/istream_reader.h b/riegeli/bytes/istream_reader.h index 6c6e03b..d853a77 100644 --- a/riegeli/bytes/istream_reader.h +++ b/riegeli/bytes/istream_reader.h
@@ -18,7 +18,9 @@ #include <stddef.h> #include <cerrno> +#include <ios> #include <istream> +#include <limits> #include <optional> #include <utility> @@ -118,6 +120,9 @@ std::optional<Position> SizeImpl() override; private: + static constexpr Position kMaxPosition = + std::numeric_limits<std::streamoff>::max(); + absl::Status FailedOperationStatus(absl::string_view operation); bool growing_source_ = false;
diff --git a/riegeli/bytes/joining_reader.cc b/riegeli/bytes/joining_reader.cc index 595eacd..c9a68f2 100644 --- a/riegeli/bytes/joining_reader.cc +++ b/riegeli/bytes/joining_reader.cc
@@ -169,7 +169,7 @@ if (ABSL_PREDICT_FALSE(!OpenShardInternal())) return false; shard = ShardReader(); } - if (ABSL_PREDICT_FALSE(limit_pos() == std::numeric_limits<Position>::max())) { + if (ABSL_PREDICT_FALSE(limit_pos() == kMaxPosition)) { return FailOverflow(); } MakeBuffer(*shard); @@ -193,7 +193,7 @@ } for (;;) { const size_t length_to_read = - UnsignedMin(length, std::numeric_limits<Position>::max() - limit_pos()); + UnsignedMin(length, kMaxPosition - limit_pos()); size_t length_read; const bool read_ok = shard->Read(length_to_read, dest, &length_read); move_limit_pos(length_read); @@ -252,7 +252,7 @@ } for (;;) { const size_t length_to_read = - UnsignedMin(length, std::numeric_limits<Position>::max() - limit_pos()); + UnsignedMin(length, kMaxPosition - limit_pos()); size_t length_read; const bool read_ok = shard->ReadAndAppend(length_to_read, dest, &length_read); @@ -290,7 +290,7 @@ } for (;;) { const size_t length_to_read = - UnsignedMin(length, std::numeric_limits<Position>::max() - limit_pos()); + UnsignedMin(length, kMaxPosition - limit_pos()); Position length_read; const bool copy_ok = shard->Copy(length_to_read, dest, &length_read); move_limit_pos(length_read); @@ -332,7 +332,7 @@ if (ABSL_PREDICT_FALSE(!OpenShardInternal())) return false; shard = ShardReader(); } - const Position remaining = std::numeric_limits<Position>::max() - limit_pos(); + const Position remaining = kMaxPosition - limit_pos(); if (ABSL_PREDICT_FALSE(remaining == 0)) return FailOverflow(); max_length = UnsignedMin(max_length, remaining); for (;;) { @@ -373,7 +373,7 @@ if (ABSL_PREDICT_FALSE(!OpenShardInternal())) return false; shard = ShardReader(); } - const Position remaining = std::numeric_limits<Position>::max() - limit_pos(); + const Position remaining = kMaxPosition - limit_pos(); if (ABSL_PREDICT_FALSE(remaining == 0)) return FailOverflow(); max_length = UnsignedMin(max_length, remaining); for (;;) {
diff --git a/riegeli/bytes/joining_reader.h b/riegeli/bytes/joining_reader.h index 5214968..3055617 100644 --- a/riegeli/bytes/joining_reader.h +++ b/riegeli/bytes/joining_reader.h
@@ -150,6 +150,8 @@ size_t recommended_length) override; private: + static constexpr Position kMaxPosition = std::numeric_limits<Position>::max(); + bool OpenShardInternal(); bool CloseShardInternal(); @@ -252,8 +254,7 @@ << "Failed precondition of JoiningReaderBase::MakeBuffer(): " "shard is closed"; set_buffer(shard.cursor(), - UnsignedMin(shard.available(), - std::numeric_limits<Position>::max() - limit_pos())); + UnsignedMin(shard.available(), kMaxPosition - limit_pos())); move_limit_pos(available()); if (ABSL_PREDICT_FALSE(!shard.ok())) { FailWithoutAnnotation(AnnotateOverShard(shard.status()));
diff --git a/riegeli/bytes/limiting_backward_writer.cc b/riegeli/bytes/limiting_backward_writer.cc index 562f3e8..7d82f01 100644 --- a/riegeli/bytes/limiting_backward_writer.cc +++ b/riegeli/bytes/limiting_backward_writer.cc
@@ -16,7 +16,6 @@ #include <stddef.h> -#include <limits> #include <optional> #include <utility> @@ -68,10 +67,9 @@ } void LimitingBackwardWriterBase::set_max_length(Position max_length) { - if (ABSL_PREDICT_FALSE(max_length > - std::numeric_limits<Position>::max() - pos())) { + if (ABSL_PREDICT_FALSE(max_length > kMaxPosition - pos())) { if (exact_) FailLengthOverflow(max_length); - max_pos_ = std::numeric_limits<Position>::max(); + max_pos_ = kMaxPosition; return; } set_max_pos(pos() + max_length);
diff --git a/riegeli/bytes/limiting_backward_writer.h b/riegeli/bytes/limiting_backward_writer.h index 18acf31..12d8f24 100644 --- a/riegeli/bytes/limiting_backward_writer.h +++ b/riegeli/bytes/limiting_backward_writer.h
@@ -148,7 +148,7 @@ Position max_length() const { return SaturatingSub(max_pos_, pos()); } // Clears the limit. - void clear_limit() { max_pos_ = std::numeric_limits<Position>::max(); } + void clear_limit() { max_pos_ = kMaxPosition; } bool SupportsTruncate() override; @@ -190,6 +190,8 @@ bool TruncateImpl(Position new_size) override; private: + static constexpr Position kMaxPosition = std::numeric_limits<Position>::max(); + ABSL_ATTRIBUTE_COLD bool FailLimitExceeded(); ABSL_ATTRIBUTE_COLD bool FailLimitExceeded(BackwardWriter& dest); ABSL_ATTRIBUTE_COLD void FailLengthOverflow(Position max_length); @@ -199,7 +201,7 @@ bool WriteInternal(Src&& src, RemovePrefix&& remove_prefix); // Invariant: `start_pos() <= max_pos_` - Position max_pos_ = std::numeric_limits<Position>::max(); + Position max_pos_ = kMaxPosition; bool exact_ = false; @@ -299,13 +301,13 @@ inline void LimitingBackwardWriterBase::Reset(Closed) { BackwardWriter::Reset(kClosed); - max_pos_ = std::numeric_limits<Position>::max(); + max_pos_ = kMaxPosition; exact_ = false; } inline void LimitingBackwardWriterBase::Reset(bool exact) { BackwardWriter::Reset(); - max_pos_ = std::numeric_limits<Position>::max(); + max_pos_ = kMaxPosition; exact_ = exact; }
diff --git a/riegeli/bytes/limiting_reader.cc b/riegeli/bytes/limiting_reader.cc index dd1f421..c7448d9 100644 --- a/riegeli/bytes/limiting_reader.cc +++ b/riegeli/bytes/limiting_reader.cc
@@ -82,7 +82,7 @@ inline bool LimitingReaderBase::FailNotEnough() { return Fail(absl::InvalidArgumentError( - max_pos() == std::numeric_limits<Position>::max() + max_pos() == kMaxPosition ? "Not enough data: expected impossibly much" : absl::StrCat("Not enough data: expected at least ", max_pos(), " or ", max_length(), " more")));
diff --git a/riegeli/bytes/limiting_reader.h b/riegeli/bytes/limiting_reader.h index 951b3fd..4ab6b4b 100644 --- a/riegeli/bytes/limiting_reader.h +++ b/riegeli/bytes/limiting_reader.h
@@ -180,7 +180,7 @@ Position max_length() const; // Clears the limit. - void clear_limit() { max_pos_ = std::numeric_limits<Position>::max(); } + void clear_limit() { max_pos_ = kMaxPosition; } // Accesses the exactness setting. // @@ -257,6 +257,8 @@ std::unique_ptr<Reader> NewReaderImpl(Position initial_pos) override; private: + static constexpr Position kMaxPosition = std::numeric_limits<Position>::max(); + // For `FailNotEnoughAtPos()`, `FailNotEnoughAtLength()`, // `FailNotEnoughAtEnd()`, and `FailPositionLimitExceeded()`. friend class ScopedLimiter; @@ -278,7 +280,7 @@ bool ReadInternal(size_t length, Dest& dest); // Invariant: `pos() <= max_pos_` - Position max_pos_ = std::numeric_limits<Position>::max(); + Position max_pos_ = kMaxPosition; bool exact_ = false; bool fail_if_longer_ = false; @@ -592,14 +594,14 @@ inline void LimitingReaderBase::Reset(Closed) { Reader::Reset(kClosed); - max_pos_ = std::numeric_limits<Position>::max(); + max_pos_ = kMaxPosition; exact_ = false; fail_if_longer_ = false; } inline void LimitingReaderBase::Reset(bool exact, bool fail_if_longer) { Reader::Reset(); - max_pos_ = std::numeric_limits<Position>::max(); + max_pos_ = kMaxPosition; exact_ = exact; fail_if_longer_ = fail_if_longer; } @@ -626,7 +628,7 @@ inline void LimitingReaderBase::set_max_length(Position max_length) { max_pos_ = pos() + max_length; // Wrap-around is not an error. if (ABSL_PREDICT_FALSE(max_pos_ < max_length)) { - max_pos_ = std::numeric_limits<Position>::max(); + max_pos_ = kMaxPosition; if (exact_) FailLengthOverflow(max_length); return; }
diff --git a/riegeli/bytes/limiting_writer.cc b/riegeli/bytes/limiting_writer.cc index 467259c..9715c8d 100644 --- a/riegeli/bytes/limiting_writer.cc +++ b/riegeli/bytes/limiting_writer.cc
@@ -16,7 +16,6 @@ #include <stddef.h> -#include <limits> #include <optional> #include <utility> @@ -68,10 +67,9 @@ } void LimitingWriterBase::set_max_length(Position max_length) { - if (ABSL_PREDICT_FALSE(max_length > - std::numeric_limits<Position>::max() - pos())) { + if (ABSL_PREDICT_FALSE(max_length > kMaxPosition - pos())) { if (exact_) FailLengthOverflow(max_length); - max_pos_ = std::numeric_limits<Position>::max(); + max_pos_ = kMaxPosition; return; } set_max_pos(pos() + max_length);
diff --git a/riegeli/bytes/limiting_writer.h b/riegeli/bytes/limiting_writer.h index 3151c54..1ecb4dc 100644 --- a/riegeli/bytes/limiting_writer.h +++ b/riegeli/bytes/limiting_writer.h
@@ -150,7 +150,7 @@ Position max_length() const { return SaturatingSub(max_pos_, pos()); } // Clears the limit. - void clear_limit() { max_pos_ = std::numeric_limits<Position>::max(); } + void clear_limit() { max_pos_ = kMaxPosition; } bool SupportsRandomAccess() override; bool SupportsTruncate() override; @@ -195,6 +195,8 @@ Reader* ReadModeImpl(Position initial_pos) override; private: + static constexpr Position kMaxPosition = std::numeric_limits<Position>::max(); + ABSL_ATTRIBUTE_COLD bool FailLimitExceeded(); ABSL_ATTRIBUTE_COLD bool FailLimitExceeded(Writer& dest); ABSL_ATTRIBUTE_COLD void FailLengthOverflow(Position max_length); @@ -204,7 +206,7 @@ bool WriteInternal(Src&& src, RemoveSuffix&& remove_suffix); // Invariant: `start_pos() <= max_pos_` - Position max_pos_ = std::numeric_limits<Position>::max(); + Position max_pos_ = kMaxPosition; bool exact_ = false; @@ -296,13 +298,13 @@ inline void LimitingWriterBase::Reset(Closed) { Writer::Reset(kClosed); - max_pos_ = std::numeric_limits<Position>::max(); + max_pos_ = kMaxPosition; exact_ = false; } inline void LimitingWriterBase::Reset(bool exact) { Writer::Reset(); - max_pos_ = std::numeric_limits<Position>::max(); + max_pos_ = kMaxPosition; exact_ = exact; }
diff --git a/riegeli/bytes/null_backward_writer.cc b/riegeli/bytes/null_backward_writer.cc index a7e394c..2629208 100644 --- a/riegeli/bytes/null_backward_writer.cc +++ b/riegeli/bytes/null_backward_writer.cc
@@ -16,7 +16,6 @@ #include <stddef.h> -#include <limits> #include <optional> #include "absl/base/optimization.h" @@ -47,13 +46,12 @@ inline bool NullBackwardWriter::MakeBuffer(size_t min_length, size_t recommended_length) { - if (ABSL_PREDICT_FALSE(min_length > - std::numeric_limits<Position>::max() - start_pos())) { + if (ABSL_PREDICT_FALSE(min_length > kMaxPosition - start_pos())) { return FailOverflow(); } const size_t buffer_length = UnsignedMin( buffer_sizer_.BufferLength(start_pos(), min_length, recommended_length), - std::numeric_limits<Position>::max() - start_pos()); + kMaxPosition - start_pos()); buffer_.Reset(buffer_length); set_buffer(buffer_.data(), buffer_length); return true; @@ -80,8 +78,7 @@ "enough space available, use Write(string_view) instead"; if (ABSL_PREDICT_FALSE(!ok())) return false; SyncBuffer(); - if (ABSL_PREDICT_FALSE(src.size() > - std::numeric_limits<Position>::max() - start_pos())) { + if (ABSL_PREDICT_FALSE(src.size() > kMaxPosition - start_pos())) { return FailOverflow(); } move_start_pos(src.size()); @@ -94,8 +91,7 @@ "enough space available, use Write(ExternalRef) instead"; if (ABSL_PREDICT_FALSE(!ok())) return false; SyncBuffer(); - if (ABSL_PREDICT_FALSE(src.size() > - std::numeric_limits<Position>::max() - start_pos())) { + if (ABSL_PREDICT_FALSE(src.size() > kMaxPosition - start_pos())) { return FailOverflow(); } move_start_pos(src.size()); @@ -108,8 +104,7 @@ "enough space available, use Write(Chain) instead"; if (ABSL_PREDICT_FALSE(!ok())) return false; SyncBuffer(); - if (ABSL_PREDICT_FALSE(src.size() > - std::numeric_limits<Position>::max() - start_pos())) { + if (ABSL_PREDICT_FALSE(src.size() > kMaxPosition - start_pos())) { return FailOverflow(); } move_start_pos(src.size()); @@ -122,8 +117,7 @@ "enough space available, use Write(Cord) instead"; if (ABSL_PREDICT_FALSE(!ok())) return false; SyncBuffer(); - if (ABSL_PREDICT_FALSE(src.size() > - std::numeric_limits<Position>::max() - start_pos())) { + if (ABSL_PREDICT_FALSE(src.size() > kMaxPosition - start_pos())) { return FailOverflow(); } move_start_pos(src.size()); @@ -136,8 +130,7 @@ "enough space available, use Write(ByteFill) instead"; if (ABSL_PREDICT_FALSE(!ok())) return false; SyncBuffer(); - if (ABSL_PREDICT_FALSE(src.size() > - std::numeric_limits<Position>::max() - start_pos())) { + if (ABSL_PREDICT_FALSE(src.size() > kMaxPosition - start_pos())) { return FailOverflow(); } move_start_pos(src.size());
diff --git a/riegeli/bytes/null_backward_writer.h b/riegeli/bytes/null_backward_writer.h index b044fd8..11c8e09 100644 --- a/riegeli/bytes/null_backward_writer.h +++ b/riegeli/bytes/null_backward_writer.h
@@ -17,6 +17,7 @@ #include <stddef.h> +#include <limits> #include <optional> #include <utility> @@ -82,6 +83,8 @@ bool TruncateImpl(Position new_size) override; private: + static constexpr Position kMaxPosition = std::numeric_limits<Position>::max(); + // Resets buffer pointers to the beginning of the buffer. void SyncBuffer();
diff --git a/riegeli/bytes/null_writer.cc b/riegeli/bytes/null_writer.cc index 3a998e9..a283499 100644 --- a/riegeli/bytes/null_writer.cc +++ b/riegeli/bytes/null_writer.cc
@@ -16,7 +16,6 @@ #include <stddef.h> -#include <limits> #include <optional> #include "absl/base/optimization.h" @@ -47,13 +46,12 @@ inline bool NullWriter::MakeBuffer(size_t min_length, size_t recommended_length) { - if (ABSL_PREDICT_FALSE(min_length > - std::numeric_limits<Position>::max() - start_pos())) { + if (ABSL_PREDICT_FALSE(min_length > kMaxPosition - start_pos())) { return FailOverflow(); } const size_t buffer_length = UnsignedMin( buffer_sizer_.BufferLength(start_pos(), min_length, recommended_length), - std::numeric_limits<Position>::max() - start_pos()); + kMaxPosition - start_pos()); buffer_.Reset(buffer_length); set_buffer(buffer_.data(), buffer_length); return true; @@ -78,8 +76,7 @@ "enough space available, use Write(string_view) instead"; if (ABSL_PREDICT_FALSE(!ok())) return false; SyncBuffer(); - if (ABSL_PREDICT_FALSE(src.size() > - std::numeric_limits<Position>::max() - start_pos())) { + if (ABSL_PREDICT_FALSE(src.size() > kMaxPosition - start_pos())) { return FailOverflow(); } move_start_pos(src.size()); @@ -92,8 +89,7 @@ "enough space available, use Write(ExternalRef) instead"; if (ABSL_PREDICT_FALSE(!ok())) return false; SyncBuffer(); - if (ABSL_PREDICT_FALSE(src.size() > - std::numeric_limits<Position>::max() - start_pos())) { + if (ABSL_PREDICT_FALSE(src.size() > kMaxPosition - start_pos())) { return FailOverflow(); } move_start_pos(src.size()); @@ -106,8 +102,7 @@ "enough space available, use Write(Chain) instead"; if (ABSL_PREDICT_FALSE(!ok())) return false; SyncBuffer(); - if (ABSL_PREDICT_FALSE(src.size() > - std::numeric_limits<Position>::max() - start_pos())) { + if (ABSL_PREDICT_FALSE(src.size() > kMaxPosition - start_pos())) { return FailOverflow(); } move_start_pos(src.size()); @@ -120,8 +115,7 @@ "enough space available, use Write(Cord) instead"; if (ABSL_PREDICT_FALSE(!ok())) return false; SyncBuffer(); - if (ABSL_PREDICT_FALSE(src.size() > - std::numeric_limits<Position>::max() - start_pos())) { + if (ABSL_PREDICT_FALSE(src.size() > kMaxPosition - start_pos())) { return FailOverflow(); } move_start_pos(src.size()); @@ -134,8 +128,7 @@ "enough space available, use Write(ByteFill) instead"; if (ABSL_PREDICT_FALSE(!ok())) return false; SyncBuffer(); - if (ABSL_PREDICT_FALSE(src.size() > - std::numeric_limits<Position>::max() - start_pos())) { + if (ABSL_PREDICT_FALSE(src.size() > kMaxPosition - start_pos())) { return FailOverflow(); } move_start_pos(src.size());
diff --git a/riegeli/bytes/null_writer.h b/riegeli/bytes/null_writer.h index 86fc12d..021ac09 100644 --- a/riegeli/bytes/null_writer.h +++ b/riegeli/bytes/null_writer.h
@@ -17,6 +17,7 @@ #include <stddef.h> +#include <limits> #include <optional> #include <utility> @@ -83,6 +84,8 @@ bool TruncateImpl(Position new_size) override; private: + static constexpr Position kMaxPosition = std::numeric_limits<Position>::max(); + // Resets buffer pointers to the beginning of the buffer. void SyncBuffer();
diff --git a/riegeli/bytes/ostream_writer.cc b/riegeli/bytes/ostream_writer.cc index c43a829..3a940bd 100644 --- a/riegeli/bytes/ostream_writer.cc +++ b/riegeli/bytes/ostream_writer.cc
@@ -19,7 +19,6 @@ #include <cerrno> #include <ios> #include <istream> -#include <limits> #include <optional> #include <ostream> #include <string> @@ -63,9 +62,7 @@ return; } if (assumed_pos != std::nullopt) { - if (ABSL_PREDICT_FALSE( - *assumed_pos > - Position{std::numeric_limits<std::streamoff>::max()})) { + if (ABSL_PREDICT_FALSE(*assumed_pos > kMaxPosition)) { FailOverflow(); return; } @@ -209,9 +206,7 @@ << "Failed precondition of BufferedWriter::WriteInternal()"; if (ABSL_PREDICT_FALSE(!WriteMode())) return false; std::ostream& dest = *DestStream(); - if (ABSL_PREDICT_FALSE(src.size() > - Position{std::numeric_limits<std::streamoff>::max()} - - start_pos())) { + if (ABSL_PREDICT_FALSE(src.size() > kMaxPosition - start_pos())) { return FailOverflow(); } errno = 0;
diff --git a/riegeli/bytes/ostream_writer.h b/riegeli/bytes/ostream_writer.h index d736df9..dacc92e 100644 --- a/riegeli/bytes/ostream_writer.h +++ b/riegeli/bytes/ostream_writer.h
@@ -18,7 +18,9 @@ #include <stdint.h> #include <cerrno> +#include <ios> #include <istream> +#include <limits> #include <optional> #include <ostream> #include <utility> @@ -135,6 +137,9 @@ // Encodes a `bool` or a marker that the value is not resolved yet. enum class LazyBoolState : uint8_t { kUnknown, kTrue, kFalse }; + static constexpr Position kMaxPosition = + Position{std::numeric_limits<std::streamoff>::max()}; + absl::Status FailedOperationStatus(absl::string_view operation); bool WriteMode();
diff --git a/riegeli/bytes/position_shifting_backward_writer.h b/riegeli/bytes/position_shifting_backward_writer.h index d757433..055856c 100644 --- a/riegeli/bytes/position_shifting_backward_writer.h +++ b/riegeli/bytes/position_shifting_backward_writer.h
@@ -113,6 +113,8 @@ bool TruncateImpl(Position new_size) override; private: + static constexpr Position kMaxPosition = std::numeric_limits<Position>::max(); + ABSL_ATTRIBUTE_COLD bool FailUnderflow(Position new_pos, Object& object); // This template is defined and used only in position_shifting_writer.cc. @@ -245,11 +247,11 @@ inline bool PositionShiftingBackwardWriterBase::MakeBuffer(BackwardWriter& dest, size_t min_length) { - const Position max_pos = std::numeric_limits<Position>::max() - base_pos_; + const Position max_pos = kMaxPosition - base_pos_; if (ABSL_PREDICT_FALSE(dest.limit_pos() > max_pos)) { if (ABSL_PREDICT_FALSE(dest.pos() > max_pos)) { set_buffer(dest.cursor()); - set_start_pos(std::numeric_limits<Position>::max()); + set_start_pos(kMaxPosition); return FailOverflow(); } set_buffer(dest.cursor() - IntCast<size_t>(max_pos - dest.pos()),
diff --git a/riegeli/bytes/position_shifting_reader.cc b/riegeli/bytes/position_shifting_reader.cc index 92f9f72..e128d1e 100644 --- a/riegeli/bytes/position_shifting_reader.cc +++ b/riegeli/bytes/position_shifting_reader.cc
@@ -233,8 +233,7 @@ if (ABSL_PREDICT_FALSE(!MakeBuffer(src) || size == std::nullopt)) { return std::nullopt; } - if (ABSL_PREDICT_FALSE(*size > - std::numeric_limits<Position>::max() - base_pos_)) { + if (ABSL_PREDICT_FALSE(*size > kMaxPosition - base_pos_)) { FailOverflow(); return std::nullopt; }
diff --git a/riegeli/bytes/position_shifting_reader.h b/riegeli/bytes/position_shifting_reader.h index 7af997a..5a7a51a 100644 --- a/riegeli/bytes/position_shifting_reader.h +++ b/riegeli/bytes/position_shifting_reader.h
@@ -121,6 +121,8 @@ std::unique_ptr<Reader> NewReaderImpl(Position initial_pos) override; private: + static constexpr Position kMaxPosition = std::numeric_limits<Position>::max(); + ABSL_ATTRIBUTE_COLD bool FailUnderflow(Position new_pos, Object& object); // This template is defined and used only in position_shifting_reader.cc. @@ -243,16 +245,16 @@ inline bool PositionShiftingReaderBase::MakeBuffer(Reader& src, size_t min_length) { - const Position max_pos = std::numeric_limits<Position>::max() - base_pos_; + const Position max_pos = kMaxPosition - base_pos_; if (ABSL_PREDICT_FALSE(src.limit_pos() > max_pos)) { if (ABSL_PREDICT_FALSE(src.pos() > max_pos)) { set_buffer(src.cursor()); - set_limit_pos(std::numeric_limits<Position>::max()); + set_limit_pos(kMaxPosition); return FailOverflow(); } set_buffer(src.start(), IntCast<size_t>(max_pos - src.start_pos()), src.start_to_cursor()); - set_limit_pos(std::numeric_limits<Position>::max()); + set_limit_pos(kMaxPosition); if (ABSL_PREDICT_FALSE(available() < min_length)) return FailOverflow(); } else { set_buffer(src.start(), src.start_to_limit(), src.start_to_cursor());
diff --git a/riegeli/bytes/position_shifting_writer.cc b/riegeli/bytes/position_shifting_writer.cc index 21abeba..2420836 100644 --- a/riegeli/bytes/position_shifting_writer.cc +++ b/riegeli/bytes/position_shifting_writer.cc
@@ -16,7 +16,6 @@ #include <stddef.h> -#include <limits> #include <optional> #include <utility> @@ -176,8 +175,7 @@ if (ABSL_PREDICT_FALSE(!MakeBuffer(dest) || size == std::nullopt)) { return std::nullopt; } - if (ABSL_PREDICT_FALSE(*size > - std::numeric_limits<Position>::max() - base_pos_)) { + if (ABSL_PREDICT_FALSE(*size > kMaxPosition - base_pos_)) { FailOverflow(); return std::nullopt; }
diff --git a/riegeli/bytes/position_shifting_writer.h b/riegeli/bytes/position_shifting_writer.h index 254eb57..1d7951c 100644 --- a/riegeli/bytes/position_shifting_writer.h +++ b/riegeli/bytes/position_shifting_writer.h
@@ -120,6 +120,8 @@ Reader* ReadModeImpl(Position initial_pos) override; private: + static constexpr Position kMaxPosition = std::numeric_limits<Position>::max(); + ABSL_ATTRIBUTE_COLD bool FailUnderflow(absl::string_view operation, Position new_pos, Object& object); @@ -250,11 +252,11 @@ inline bool PositionShiftingWriterBase::MakeBuffer(Writer& dest, size_t min_length) { - const Position max_pos = std::numeric_limits<Position>::max() - base_pos_; + const Position max_pos = kMaxPosition - base_pos_; if (ABSL_PREDICT_FALSE(dest.limit_pos() > max_pos)) { if (ABSL_PREDICT_FALSE(dest.pos() > max_pos)) { set_buffer(dest.cursor()); - set_start_pos(std::numeric_limits<Position>::max()); + set_start_pos(kMaxPosition); return FailOverflow(); } set_buffer(dest.cursor(), IntCast<size_t>(max_pos - dest.pos()));
diff --git a/riegeli/bytes/prefix_limiting_backward_writer.cc b/riegeli/bytes/prefix_limiting_backward_writer.cc index 2fad7f9..0767f0a 100644 --- a/riegeli/bytes/prefix_limiting_backward_writer.cc +++ b/riegeli/bytes/prefix_limiting_backward_writer.cc
@@ -16,7 +16,6 @@ #include <stddef.h> -#include <limits> #include <utility> #include "absl/base/optimization.h" @@ -149,8 +148,7 @@ BackwardWriter& dest = *DestWriter(); SyncBuffer(dest); bool truncate_ok; - if (ABSL_PREDICT_FALSE(new_size > - std::numeric_limits<Position>::max() - base_pos_)) { + if (ABSL_PREDICT_FALSE(new_size > kMaxPosition - base_pos_)) { truncate_ok = false; } else { truncate_ok = dest.Truncate(new_size + base_pos_);
diff --git a/riegeli/bytes/prefix_limiting_backward_writer.h b/riegeli/bytes/prefix_limiting_backward_writer.h index 732a6ca..0580cda 100644 --- a/riegeli/bytes/prefix_limiting_backward_writer.h +++ b/riegeli/bytes/prefix_limiting_backward_writer.h
@@ -17,6 +17,7 @@ #include <stddef.h> +#include <limits> #include <optional> #include <utility> @@ -116,6 +117,8 @@ bool TruncateImpl(Position new_size) override; private: + static constexpr Position kMaxPosition = std::numeric_limits<Position>::max(); + // This template is defined and used only in prefix_limiting_writer.cc. template <typename Src> bool WriteInternal(Src&& src);
diff --git a/riegeli/bytes/prefix_limiting_reader.cc b/riegeli/bytes/prefix_limiting_reader.cc index 9626ef2..36f526c 100644 --- a/riegeli/bytes/prefix_limiting_reader.cc +++ b/riegeli/bytes/prefix_limiting_reader.cc
@@ -210,9 +210,8 @@ Reader& src = *SrcReader(); SyncBuffer(src); bool seek_ok; - if (ABSL_PREDICT_FALSE(new_pos > - std::numeric_limits<Position>::max() - base_pos_)) { - src.Seek(std::numeric_limits<Position>::max()); + if (ABSL_PREDICT_FALSE(new_pos > kMaxPosition - base_pos_)) { + src.Seek(kMaxPosition); seek_ok = false; } else { seek_ok = src.Seek(new_pos + base_pos_);
diff --git a/riegeli/bytes/prefix_limiting_reader.h b/riegeli/bytes/prefix_limiting_reader.h index b881dc5..bc002cf 100644 --- a/riegeli/bytes/prefix_limiting_reader.h +++ b/riegeli/bytes/prefix_limiting_reader.h
@@ -17,6 +17,7 @@ #include <stddef.h> +#include <limits> #include <memory> #include <optional> #include <utility> @@ -121,6 +122,8 @@ std::unique_ptr<Reader> NewReaderImpl(Position initial_pos) override; private: + static constexpr Position kMaxPosition = std::numeric_limits<Position>::max(); + // This template is defined and used only in prefix_limiting_reader.cc. template <typename Dest> bool ReadInternal(size_t length, Dest& dest);
diff --git a/riegeli/bytes/prefix_limiting_writer.cc b/riegeli/bytes/prefix_limiting_writer.cc index 560881d..7324c11 100644 --- a/riegeli/bytes/prefix_limiting_writer.cc +++ b/riegeli/bytes/prefix_limiting_writer.cc
@@ -16,7 +16,6 @@ #include <stddef.h> -#include <limits> #include <optional> #include <utility> @@ -154,9 +153,8 @@ Writer& dest = *DestWriter(); SyncBuffer(dest); bool seek_ok; - if (ABSL_PREDICT_FALSE(new_pos > - std::numeric_limits<Position>::max() - base_pos_)) { - dest.Seek(std::numeric_limits<Position>::max()); + if (ABSL_PREDICT_FALSE(new_pos > kMaxPosition - base_pos_)) { + dest.Seek(kMaxPosition); seek_ok = false; } else { seek_ok = dest.Seek(new_pos + base_pos_); @@ -185,9 +183,8 @@ Writer& dest = *DestWriter(); SyncBuffer(dest); bool truncate_ok; - if (ABSL_PREDICT_FALSE(new_size > - std::numeric_limits<Position>::max() - base_pos_)) { - dest.Seek(std::numeric_limits<Position>::max()); + if (ABSL_PREDICT_FALSE(new_size > kMaxPosition - base_pos_)) { + dest.Seek(kMaxPosition); truncate_ok = false; } else { truncate_ok = dest.Truncate(new_size + base_pos_);
diff --git a/riegeli/bytes/prefix_limiting_writer.h b/riegeli/bytes/prefix_limiting_writer.h index b0895a0..e3b60a1 100644 --- a/riegeli/bytes/prefix_limiting_writer.h +++ b/riegeli/bytes/prefix_limiting_writer.h
@@ -17,6 +17,7 @@ #include <stddef.h> +#include <limits> #include <optional> #include <utility> @@ -120,6 +121,8 @@ Reader* ReadModeImpl(Position initial_pos) override; private: + static constexpr Position kMaxPosition = std::numeric_limits<Position>::max(); + // This template is defined and used only in prefix_limiting_writer.cc. template <typename Src> bool WriteInternal(Src&& src);
diff --git a/riegeli/bytes/resizable_writer.cc b/riegeli/bytes/resizable_writer.cc index 20dae2b..e0f552d 100644 --- a/riegeli/bytes/resizable_writer.cc +++ b/riegeli/bytes/resizable_writer.cc
@@ -17,7 +17,6 @@ #include <stddef.h> #include <cstring> -#include <limits> #include <optional> #include <utility> @@ -82,8 +81,7 @@ << "Failed precondition of Writer::PushSlow(): " "enough space available, use Push() instead"; if (ABSL_PREDICT_FALSE(!ok())) return false; - if (ABSL_PREDICT_FALSE(min_length > std::numeric_limits<size_t>::max() - - IntCast<size_t>(pos()))) { + if (ABSL_PREDICT_FALSE(min_length > kMaxPosition - IntCast<size_t>(pos()))) { return FailOverflow(); } if (!uses_secondary_buffer()) { @@ -115,8 +113,7 @@ << "Failed precondition of Writer::WriteSlow(string_view): " "enough space available, use Write(string_view) instead"; if (ABSL_PREDICT_FALSE(!ok())) return false; - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<size_t>::max() - - IntCast<size_t>(pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > kMaxPosition - IntCast<size_t>(pos()))) { return FailOverflow(); } if (!uses_secondary_buffer()) { @@ -156,8 +153,7 @@ << "Failed precondition of Writer::WriteSlow(ExternalRef): " "enough space available, use Write(ExternalRef) instead"; if (ABSL_PREDICT_FALSE(!ok())) return false; - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<size_t>::max() - - IntCast<size_t>(pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > kMaxPosition - IntCast<size_t>(pos()))) { return FailOverflow(); } if (!uses_secondary_buffer()) { @@ -183,8 +179,7 @@ << "Failed precondition of Writer::WriteSlow(Chain): " "enough space available, use Write(Chain) instead"; if (ABSL_PREDICT_FALSE(!ok())) return false; - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<size_t>::max() - - IntCast<size_t>(pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > kMaxPosition - IntCast<size_t>(pos()))) { return FailOverflow(); } if (!uses_secondary_buffer()) { @@ -210,8 +205,7 @@ << "Failed precondition of Writer::WriteSlow(Chain&&): " "enough space available, use Write(Chain) instead"; if (ABSL_PREDICT_FALSE(!ok())) return false; - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<size_t>::max() - - IntCast<size_t>(pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > kMaxPosition - IntCast<size_t>(pos()))) { return FailOverflow(); } if (!uses_secondary_buffer()) { @@ -237,8 +231,7 @@ << "Failed precondition of Writer::WriteSlow(Cord): " "enough space available, use Write(Cord) instead"; if (ABSL_PREDICT_FALSE(!ok())) return false; - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<size_t>::max() - - IntCast<size_t>(pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > kMaxPosition - IntCast<size_t>(pos()))) { return FailOverflow(); } if (!uses_secondary_buffer()) { @@ -264,8 +257,7 @@ << "Failed precondition of Writer::WriteSlow(Cord&&): " "enough space available, use Write(Cord&&) instead"; if (ABSL_PREDICT_FALSE(!ok())) return false; - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<size_t>::max() - - IntCast<size_t>(pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > kMaxPosition - IntCast<size_t>(pos()))) { return FailOverflow(); } if (!uses_secondary_buffer()) { @@ -291,8 +283,7 @@ << "Failed precondition of Writer::WriteSlow(ByteFill): " "enough space available, use Write(ByteFill) instead"; if (ABSL_PREDICT_FALSE(!ok())) return false; - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<size_t>::max() - - IntCast<size_t>(pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > kMaxPosition - IntCast<size_t>(pos()))) { return FailOverflow(); } if (!uses_secondary_buffer()) {
diff --git a/riegeli/bytes/resizable_writer.h b/riegeli/bytes/resizable_writer.h index 2913e20..2e43179 100644 --- a/riegeli/bytes/resizable_writer.h +++ b/riegeli/bytes/resizable_writer.h
@@ -146,6 +146,8 @@ Reader* ReadModeImpl(Position initial_pos) override; private: + static constexpr size_t kMaxPosition = std::numeric_limits<size_t>::max(); + // Discards uninitialized space from the end of `secondary_buffer_`, so that // it contains only actual data written. void SyncSecondaryBuffer(); @@ -342,6 +344,8 @@ private: class Mover; + static constexpr size_t kMaxPosition = std::numeric_limits<size_t>::max(); + // The object providing and possibly owning the `Resizable` being written // to, with uninitialized space appended (possibly empty); `cursor()` points // to the uninitialized space. @@ -652,8 +656,7 @@ << "Failed precondition in " "ResizableWriter::GrowDestUnderCapacityAndMakeBuffer(): " "secondary buffer is used"; - RIEGELI_ASSERT_LE(min_length, - std::numeric_limits<size_t>::max() - IntCast<size_t>(pos())) + RIEGELI_ASSERT_LE(min_length, kMaxPosition - IntCast<size_t>(pos())) << "Failed precondition of " "ResizableWriter::GrowDestUnderCapacityAndMakeBuffer(): " "Writer position overflow";
diff --git a/riegeli/bytes/restricted_chain_writer.cc b/riegeli/bytes/restricted_chain_writer.cc index bf939bf..ac31b43 100644 --- a/riegeli/bytes/restricted_chain_writer.cc +++ b/riegeli/bytes/restricted_chain_writer.cc
@@ -16,7 +16,6 @@ #include <stddef.h> -#include <limits> #include <utility> #include "absl/base/optimization.h" @@ -63,8 +62,8 @@ RIEGELI_ASSERT_EQ(limit_pos(), dest_.size()) << "RestrictedChainWriter destination changed unexpectedly"; SyncBuffer(); - if (ABSL_PREDICT_FALSE(min_length > std::numeric_limits<size_t>::max() - - IntCast<size_t>(start_pos()))) { + if (ABSL_PREDICT_FALSE(min_length > + kMaxPosition - IntCast<size_t>(start_pos()))) { return FailOverflow(); } MakeBuffer(min_length, recommended_length); @@ -79,8 +78,8 @@ RIEGELI_ASSERT_EQ(limit_pos(), dest_.size()) << "RestrictedChainWriter destination changed unexpectedly"; SyncBuffer(); - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<size_t>::max() - - IntCast<size_t>(start_pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > + kMaxPosition - IntCast<size_t>(start_pos()))) { return FailOverflow(); } move_start_pos(src.size()); @@ -97,8 +96,8 @@ RIEGELI_ASSERT_EQ(limit_pos(), dest_.size()) << "RestrictedChainWriter destination changed unexpectedly"; SyncBuffer(); - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<size_t>::max() - - IntCast<size_t>(start_pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > + kMaxPosition - IntCast<size_t>(start_pos()))) { return FailOverflow(); } move_start_pos(src.size()); @@ -115,8 +114,8 @@ RIEGELI_ASSERT_EQ(limit_pos(), dest_.size()) << "RestrictedChainWriter destination changed unexpectedly"; SyncBuffer(); - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<size_t>::max() - - IntCast<size_t>(start_pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > + kMaxPosition - IntCast<size_t>(start_pos()))) { return FailOverflow(); } move_start_pos(src.size()); @@ -133,8 +132,8 @@ RIEGELI_ASSERT_EQ(limit_pos(), dest_.size()) << "RestrictedChainWriter destination changed unexpectedly"; SyncBuffer(); - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<size_t>::max() - - IntCast<size_t>(start_pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > + kMaxPosition - IntCast<size_t>(start_pos()))) { return FailOverflow(); } move_start_pos(src.size()); @@ -151,8 +150,8 @@ RIEGELI_ASSERT_EQ(limit_pos(), dest_.size()) << "RestrictedChainWriter destination changed unexpectedly"; SyncBuffer(); - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<size_t>::max() - - IntCast<size_t>(start_pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > + kMaxPosition - IntCast<size_t>(start_pos()))) { return FailOverflow(); } move_start_pos(src.size()); @@ -169,8 +168,8 @@ RIEGELI_ASSERT_EQ(limit_pos(), dest_.size()) << "RestrictedChainWriter destination changed unexpectedly"; SyncBuffer(); - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<size_t>::max() - - IntCast<size_t>(start_pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > + kMaxPosition - IntCast<size_t>(start_pos()))) { return FailOverflow(); } move_start_pos(src.size());
diff --git a/riegeli/bytes/restricted_chain_writer.h b/riegeli/bytes/restricted_chain_writer.h index 13c4b2d..7db52de 100644 --- a/riegeli/bytes/restricted_chain_writer.h +++ b/riegeli/bytes/restricted_chain_writer.h
@@ -17,6 +17,7 @@ #include <stddef.h> +#include <limits> #include <utility> #include "absl/base/attributes.h" @@ -74,6 +75,8 @@ bool WriteSlow(ByteFill src) override; private: + static constexpr size_t kMaxPosition = std::numeric_limits<size_t>::max(); + // Discards uninitialized space from the end of `dest_`, so that it contains // only actual data written. void SyncBuffer();
diff --git a/riegeli/bytes/splitting_writer.cc b/riegeli/bytes/splitting_writer.cc index dd33d44..d59a8ce 100644 --- a/riegeli/bytes/splitting_writer.cc +++ b/riegeli/bytes/splitting_writer.cc
@@ -16,7 +16,6 @@ #include <stddef.h> -#include <limits> #include <optional> #include <utility> @@ -69,7 +68,7 @@ RIEGELI_ASSERT(!shard_is_open()) << "Failed precondition of SplittingWriterBase::OpenShardInternal(): " "shard already opened"; - if (ABSL_PREDICT_FALSE(start_pos() == std::numeric_limits<Position>::max())) { + if (ABSL_PREDICT_FALSE(start_pos() == kMaxPosition)) { return FailOverflow(); } const std::optional<Position> size_limit = OpenShardImpl();
diff --git a/riegeli/bytes/splitting_writer.h b/riegeli/bytes/splitting_writer.h index a485c97..8fcd5a8 100644 --- a/riegeli/bytes/splitting_writer.h +++ b/riegeli/bytes/splitting_writer.h
@@ -17,6 +17,7 @@ #include <stddef.h> +#include <limits> #include <optional> #include "absl/base/attributes.h" @@ -162,6 +163,8 @@ bool FlushBehindScratch(FlushType flush_type) override; private: + static constexpr Position kMaxPosition = std::numeric_limits<Position>::max(); + bool OpenShardInternal(); bool CloseShardInternal();
diff --git a/riegeli/bytes/string_writer.cc b/riegeli/bytes/string_writer.cc index 156467c..c7a3a60 100644 --- a/riegeli/bytes/string_writer.cc +++ b/riegeli/bytes/string_writer.cc
@@ -17,7 +17,6 @@ #include <stddef.h> #include <cstring> -#include <limits> #include <optional> #include <string> #include <utility> @@ -96,8 +95,7 @@ << "Failed precondition in " "StringWriterBase::GrowDestUnderCapacityAndMakeBuffer(): " "secondary buffer is used"; - RIEGELI_ASSERT_LE(min_length, - std::numeric_limits<size_t>::max() - cursor_index) + RIEGELI_ASSERT_LE(min_length, kMaxPosition - cursor_index) << "Failed precondition of " "StringWriterBase::GrowDestUnderCapacityAndMakeBuffer(): " "Writer position overflow"; @@ -160,8 +158,7 @@ std::string& dest = *DestString(); RIEGELI_ASSERT_GE(dest.size(), limit_pos() - secondary_buffer_.size()) << "StringWriter destination changed unexpectedly"; - if (ABSL_PREDICT_FALSE(min_length > std::numeric_limits<size_t>::max() - - IntCast<size_t>(pos()))) { + if (ABSL_PREDICT_FALSE(min_length > kMaxPosition - IntCast<size_t>(pos()))) { return FailOverflow(); } if (!uses_secondary_buffer()) { @@ -199,8 +196,7 @@ std::string& dest = *DestString(); RIEGELI_ASSERT_GE(dest.size(), limit_pos() - secondary_buffer_.size()) << "StringWriter destination changed unexpectedly"; - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<size_t>::max() - - IntCast<size_t>(pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > kMaxPosition - IntCast<size_t>(pos()))) { return FailOverflow(); } if (!uses_secondary_buffer()) { @@ -247,8 +243,7 @@ std::string& dest = *DestString(); RIEGELI_ASSERT_GE(dest.size(), limit_pos() - secondary_buffer_.size()) << "StringWriter destination changed unexpectedly"; - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<size_t>::max() - - IntCast<size_t>(pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > kMaxPosition - IntCast<size_t>(pos()))) { return FailOverflow(); } if (!uses_secondary_buffer()) { @@ -284,8 +279,7 @@ std::string& dest = *DestString(); RIEGELI_ASSERT_GE(dest.size(), limit_pos() - secondary_buffer_.size()) << "StringWriter destination changed unexpectedly"; - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<size_t>::max() - - IntCast<size_t>(pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > kMaxPosition - IntCast<size_t>(pos()))) { return FailOverflow(); } if (!uses_secondary_buffer()) { @@ -321,8 +315,7 @@ std::string& dest = *DestString(); RIEGELI_ASSERT_GE(dest.size(), limit_pos() - secondary_buffer_.size()) << "StringWriter destination changed unexpectedly"; - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<size_t>::max() - - IntCast<size_t>(pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > kMaxPosition - IntCast<size_t>(pos()))) { return FailOverflow(); } if (!uses_secondary_buffer()) { @@ -358,8 +351,7 @@ std::string& dest = *DestString(); RIEGELI_ASSERT_GE(dest.size(), limit_pos() - secondary_buffer_.size()) << "StringWriter destination changed unexpectedly"; - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<size_t>::max() - - IntCast<size_t>(pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > kMaxPosition - IntCast<size_t>(pos()))) { return FailOverflow(); } if (!uses_secondary_buffer()) { @@ -395,8 +387,7 @@ std::string& dest = *DestString(); RIEGELI_ASSERT_GE(dest.size(), limit_pos() - secondary_buffer_.size()) << "StringWriter destination changed unexpectedly"; - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<size_t>::max() - - IntCast<size_t>(pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > kMaxPosition - IntCast<size_t>(pos()))) { return FailOverflow(); } if (!uses_secondary_buffer()) { @@ -432,8 +423,7 @@ std::string& dest = *DestString(); RIEGELI_ASSERT_GE(dest.size(), limit_pos() - secondary_buffer_.size()) << "StringWriter destination changed unexpectedly"; - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<size_t>::max() - - IntCast<size_t>(pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > kMaxPosition - IntCast<size_t>(pos()))) { return FailOverflow(); } if (!uses_secondary_buffer()) {
diff --git a/riegeli/bytes/string_writer.h b/riegeli/bytes/string_writer.h index 00809d6..07c04fb 100644 --- a/riegeli/bytes/string_writer.h +++ b/riegeli/bytes/string_writer.h
@@ -17,6 +17,7 @@ #include <stddef.h> +#include <limits> #include <optional> #include <string> #include <type_traits> @@ -114,6 +115,8 @@ Reader* ReadModeImpl(Position initial_pos) override; private: + static constexpr size_t kMaxPosition = std::numeric_limits<size_t>::max(); + // Returns the amount of data written, either to `*DestString()` or to // `secondary_buffer_`. size_t used_size() const;
diff --git a/riegeli/bytes/stringify_writer.h b/riegeli/bytes/stringify_writer.h index 9de98b8..5f159ce 100644 --- a/riegeli/bytes/stringify_writer.h +++ b/riegeli/bytes/stringify_writer.h
@@ -66,6 +66,8 @@ bool WriteInternal(absl::string_view src) override; private: + static constexpr Position kMaxPosition = std::numeric_limits<Position>::max(); + Dest dest_{}; }; @@ -127,8 +129,7 @@ "nothing to write"; RIEGELI_ASSERT_OK(*this) << "Failed precondition of BufferedWriter::WriteInternal()"; - if (ABSL_PREDICT_FALSE(src.size() > - std::numeric_limits<Position>::max() - start_pos())) { + if (ABSL_PREDICT_FALSE(src.size() > kMaxPosition - start_pos())) { return FailOverflow(); } dest_->Append(src);
diff --git a/riegeli/bzip2/bzip2_reader.cc b/riegeli/bzip2/bzip2_reader.cc index 8a1fb70..c3c615d 100644 --- a/riegeli/bzip2/bzip2_reader.cc +++ b/riegeli/bzip2/bzip2_reader.cc
@@ -17,7 +17,6 @@ #include <stddef.h> #include <stdint.h> -#include <limits> #include <memory> #include <utility> @@ -112,8 +111,7 @@ << "Failed precondition of BufferedReader::ReadInternal()"; Reader& src = *SrcReader(); truncated_ = false; - max_length = UnsignedMin(max_length, - std::numeric_limits<Position>::max() - limit_pos()); + max_length = UnsignedMin(max_length, kMaxPosition - limit_pos()); decompressor_->next_out = dest; for (;;) { decompressor_->avail_out = SaturatingIntCast<unsigned int>( @@ -131,8 +129,7 @@ RIEGELI_ASSERT_EQ(decompressor_->avail_out, 0u) << "BZ2_bzDecompress() returned but there are still input data " "and output space"; - RIEGELI_ASSERT_EQ(length_read, - std::numeric_limits<Position>::max() - limit_pos()) + RIEGELI_ASSERT_EQ(length_read, kMaxPosition - limit_pos()) << "The position does not overflow but the output buffer is " "full, while less than min_length was output, which is " "impossible because the buffer has size max_length which is "
diff --git a/riegeli/bzip2/bzip2_reader.h b/riegeli/bzip2/bzip2_reader.h index fc7c596..e0213a1 100644 --- a/riegeli/bzip2/bzip2_reader.h +++ b/riegeli/bzip2/bzip2_reader.h
@@ -17,6 +17,7 @@ #include <stddef.h> +#include <limits> #include <memory> #include <utility> @@ -117,6 +118,8 @@ } }; + static constexpr Position kMaxPosition = std::numeric_limits<Position>::max(); + void InitializeDecompressor(); ABSL_ATTRIBUTE_COLD bool FailOperation(absl::string_view operation, int bzlib_code);
diff --git a/riegeli/bzip2/bzip2_writer.cc b/riegeli/bzip2/bzip2_writer.cc index 1c49c24..58a41fc 100644 --- a/riegeli/bzip2/bzip2_writer.cc +++ b/riegeli/bzip2/bzip2_writer.cc
@@ -111,8 +111,7 @@ int flush) { RIEGELI_ASSERT_OK(*this) << "Failed precondition of Bzip2WriterBase::WriteInternal()"; - if (ABSL_PREDICT_FALSE(src.size() > - std::numeric_limits<Position>::max() - start_pos())) { + if (ABSL_PREDICT_FALSE(src.size() > kMaxPosition - start_pos())) { return FailOverflow(); } compressor_->next_in = const_cast<char*>(src.data());
diff --git a/riegeli/bzip2/bzip2_writer.h b/riegeli/bzip2/bzip2_writer.h index 367ae80..8c1c19a 100644 --- a/riegeli/bzip2/bzip2_writer.h +++ b/riegeli/bzip2/bzip2_writer.h
@@ -15,6 +15,7 @@ #ifndef RIEGELI_BZIP2_BZIP2_WRITER_H_ #define RIEGELI_BZIP2_BZIP2_WRITER_H_ +#include <limits> #include <memory> #include <utility> @@ -108,6 +109,8 @@ } }; + static constexpr Position kMaxPosition = std::numeric_limits<Position>::max(); + ABSL_ATTRIBUTE_COLD bool FailOperation(absl::string_view operation, int bzlib_code); bool WriteInternal(absl::string_view src, Writer& dest, int flush);
diff --git a/riegeli/gcs/gcs_reader.cc b/riegeli/gcs/gcs_reader.cc index 3e6c886..81b1866 100644 --- a/riegeli/gcs/gcs_reader.cc +++ b/riegeli/gcs/gcs_reader.cc
@@ -18,7 +18,6 @@ #include <stdint.h> #include <functional> -#include <limits> #include <memory> #include <optional> #include <utility> @@ -78,8 +77,7 @@ break; case Origin::kEnd: if (stream.size() != std::nullopt && - ABSL_PREDICT_TRUE(*stream.size() <= - uint64_t{std::numeric_limits<int64_t>::max()})) { + ABSL_PREDICT_TRUE(*stream.size() <= kMaxPosition)) { initial_pos = SaturatingSub( *stream.size(), IntCast<uint64_t>(range_options.initial_pos)); } @@ -92,8 +90,7 @@ .set_buffer_options(buffer_options)); PropagateStatus(); if (src().size() != std::nullopt && - ABSL_PREDICT_TRUE(*src().size() <= - uint64_t{std::numeric_limits<int64_t>::max()})) { + ABSL_PREDICT_TRUE(*src().size() <= kMaxPosition)) { set_exact_size(*src().size()); if (range_options.max_size != std::nullopt && ABSL_PREDICT_TRUE(*range_options.max_size >= 0)) {
diff --git a/riegeli/gcs/gcs_reader.h b/riegeli/gcs/gcs_reader.h index 5024fa0..fed77d6 100644 --- a/riegeli/gcs/gcs_reader.h +++ b/riegeli/gcs/gcs_reader.h
@@ -19,6 +19,7 @@ #include <stdint.h> #include <functional> +#include <limits> #include <memory> #include <optional> #include <tuple> @@ -125,6 +126,8 @@ std::unique_ptr<Reader> NewReaderImpl(Position initial_pos) override; private: + static constexpr uint64_t kMaxPosition = std::numeric_limits<int64_t>::max(); + friend class GcsWriter; // For `set_exact_size()`. struct NewReaderTag {};
diff --git a/riegeli/lz4/lz4_reader.cc b/riegeli/lz4/lz4_reader.cc index 92520ef..d1786f1 100644 --- a/riegeli/lz4/lz4_reader.cc +++ b/riegeli/lz4/lz4_reader.cc
@@ -193,8 +193,7 @@ decompress_options.stableDst = 1; effective_min_length = std::numeric_limits<size_t>::max(); } - max_length = UnsignedMin(max_length, - std::numeric_limits<Position>::max() - limit_pos()); + max_length = UnsignedMin(max_length, kMaxPosition - limit_pos()); for (;;) { size_t src_length = src.available(); size_t dest_length = max_length; @@ -230,8 +229,7 @@ RIEGELI_ASSERT_EQ(dest_length, max_length) << "LZ4F_decompress_usingDict() returned but there are still " "input data and output space"; - RIEGELI_ASSERT_EQ(dest_length, - std::numeric_limits<Position>::max() - limit_pos()) + RIEGELI_ASSERT_EQ(dest_length, kMaxPosition - limit_pos()) << "The position does not overflow but the output buffer is full, " "while less than min_length was output, which implies that " "LZ4F_decompress_usingDict() wants to output more than the "
diff --git a/riegeli/lz4/lz4_reader.h b/riegeli/lz4/lz4_reader.h index 536b128..0307d4b 100644 --- a/riegeli/lz4/lz4_reader.h +++ b/riegeli/lz4/lz4_reader.h
@@ -17,6 +17,7 @@ #include <stddef.h> +#include <limits> #include <memory> #include <optional> #include <utility> @@ -206,6 +207,8 @@ } }; + static constexpr Position kMaxPosition = std::numeric_limits<Position>::max(); + void InitializeDecompressor(Reader& src); bool ReadHeader(Reader& src);
diff --git a/riegeli/lz4/lz4_writer.cc b/riegeli/lz4/lz4_writer.cc index 27a2e54..e14576e 100644 --- a/riegeli/lz4/lz4_writer.cc +++ b/riegeli/lz4/lz4_writer.cc
@@ -20,7 +20,6 @@ #include <stddef.h> -#include <limits> #include <memory> #include <optional> #include <utility> @@ -169,8 +168,7 @@ RIEGELI_ASSERT_OK(*this) << "Failed precondition of BufferedWriter::WriteInternal()"; Writer& dest = *DestWriter(); - if (ABSL_PREDICT_FALSE(src.size() > - std::numeric_limits<Position>::max() - start_pos())) { + if (ABSL_PREDICT_FALSE(src.size() > kMaxPosition - start_pos())) { return FailOverflow(); } if (pledged_size_ != std::nullopt) {
diff --git a/riegeli/lz4/lz4_writer.h b/riegeli/lz4/lz4_writer.h index cd66bb5..493b3c4 100644 --- a/riegeli/lz4/lz4_writer.h +++ b/riegeli/lz4/lz4_writer.h
@@ -17,6 +17,7 @@ #include <stddef.h> +#include <limits> #include <optional> #include <utility> @@ -293,6 +294,8 @@ } }; + static constexpr Position kMaxPosition = std::numeric_limits<Position>::max(); + bool DoneCompression(Writer& dest); Lz4Dictionary dictionary_;
diff --git a/riegeli/snappy/framed/framed_snappy_reader.cc b/riegeli/snappy/framed/framed_snappy_reader.cc index 620c45b..1c37687 100644 --- a/riegeli/snappy/framed/framed_snappy_reader.cc +++ b/riegeli/snappy/framed/framed_snappy_reader.cc
@@ -17,7 +17,6 @@ #include <stddef.h> #include <stdint.h> -#include <limits> #include <memory> #include <utility> @@ -159,8 +158,7 @@ } src.move_cursor(sizeof(uint32_t) + chunk_length); if (ABSL_PREDICT_FALSE(uncompressed_length == 0)) continue; - const Position max_length = - std::numeric_limits<Position>::max() - limit_pos(); + const Position max_length = kMaxPosition - limit_pos(); if (ABSL_PREDICT_FALSE(uncompressed_length > max_length)) { set_buffer(uncompressed_.data(), IntCast<size_t>(max_length)); move_limit_pos(available()); @@ -193,8 +191,7 @@ } src.move_cursor(sizeof(uint32_t) + chunk_length); if (ABSL_PREDICT_FALSE(uncompressed_length == 0)) continue; - const Position max_length = - std::numeric_limits<Position>::max() - limit_pos(); + const Position max_length = kMaxPosition - limit_pos(); if (ABSL_PREDICT_FALSE(uncompressed_length > max_length)) { set_buffer(uncompressed_data, IntCast<size_t>(max_length)); move_limit_pos(available());
diff --git a/riegeli/snappy/framed/framed_snappy_reader.h b/riegeli/snappy/framed/framed_snappy_reader.h index 21d1a8e..1231fba 100644 --- a/riegeli/snappy/framed/framed_snappy_reader.h +++ b/riegeli/snappy/framed/framed_snappy_reader.h
@@ -17,6 +17,7 @@ #include <stddef.h> +#include <limits> #include <memory> #include <utility> @@ -72,6 +73,8 @@ std::unique_ptr<Reader> NewReaderImpl(Position initial_pos) override; private: + static constexpr Position kMaxPosition = std::numeric_limits<Position>::max(); + ABSL_ATTRIBUTE_COLD bool FailInvalidStream(absl::string_view message); Position initial_compressed_pos_ = 0;
diff --git a/riegeli/snappy/framed/framed_snappy_writer.cc b/riegeli/snappy/framed/framed_snappy_writer.cc index e2d5381..f5ef18e 100644 --- a/riegeli/snappy/framed/framed_snappy_writer.cc +++ b/riegeli/snappy/framed/framed_snappy_writer.cc
@@ -18,7 +18,6 @@ #include <stdint.h> #include <cstring> -#include <limits> #include <optional> #include <utility> @@ -105,14 +104,14 @@ if (ABSL_PREDICT_FALSE(!ok())) return false; Writer& dest = *DestWriter(); if (ABSL_PREDICT_FALSE(!PushInternal(dest))) return false; - if (ABSL_PREDICT_FALSE(start_pos() == std::numeric_limits<Position>::max())) { + if (ABSL_PREDICT_FALSE(start_pos() == kMaxPosition)) { return FailOverflow(); } const size_t length = UnsignedMin( ApplyBufferConstraints( ApplySizeHint(snappy::kBlockSize, size_hint_, start_pos()), 1, recommended_length, snappy::kBlockSize), - std::numeric_limits<Position>::max() - start_pos()); + kMaxPosition - start_pos()); uncompressed_.Reset(length); set_buffer(uncompressed_.data(), length); return true;
diff --git a/riegeli/snappy/framed/framed_snappy_writer.h b/riegeli/snappy/framed/framed_snappy_writer.h index d2c70f8..12933ec 100644 --- a/riegeli/snappy/framed/framed_snappy_writer.h +++ b/riegeli/snappy/framed/framed_snappy_writer.h
@@ -17,6 +17,7 @@ #include <stddef.h> +#include <limits> #include <optional> #include <utility> @@ -110,6 +111,8 @@ Reader* ReadModeBehindScratch(Position initial_pos) override; private: + static constexpr Position kMaxPosition = std::numeric_limits<Position>::max(); + // Compresses buffered data, but unlike `PushSlow()`, does not ensure that a // buffer is allocated. //
diff --git a/riegeli/snappy/hadoop/hadoop_snappy_reader.cc b/riegeli/snappy/hadoop/hadoop_snappy_reader.cc index 18e4c66..77b1e24 100644 --- a/riegeli/snappy/hadoop/hadoop_snappy_reader.cc +++ b/riegeli/snappy/hadoop/hadoop_snappy_reader.cc
@@ -154,8 +154,7 @@ src.move_cursor(sizeof(uint32_t) + compressed_length); } while (uncompressed_length == 0); remaining_chunk_length_ -= uncompressed_length; - const Position max_length = - std::numeric_limits<Position>::max() - limit_pos(); + const Position max_length = kMaxPosition - limit_pos(); if (ABSL_PREDICT_FALSE(uncompressed_length > max_length)) { set_buffer(uncompressed_data, IntCast<size_t>(max_length)); move_limit_pos(available());
diff --git a/riegeli/snappy/hadoop/hadoop_snappy_reader.h b/riegeli/snappy/hadoop/hadoop_snappy_reader.h index eb7c1b9..8e83766 100644 --- a/riegeli/snappy/hadoop/hadoop_snappy_reader.h +++ b/riegeli/snappy/hadoop/hadoop_snappy_reader.h
@@ -18,6 +18,7 @@ #include <stddef.h> #include <stdint.h> +#include <limits> #include <memory> #include <utility> @@ -72,6 +73,8 @@ std::unique_ptr<Reader> NewReaderImpl(Position initial_pos) override; private: + static constexpr Position kMaxPosition = std::numeric_limits<Position>::max(); + ABSL_ATTRIBUTE_COLD bool FailInvalidStream(absl::string_view message); Position initial_compressed_pos_ = 0;
diff --git a/riegeli/snappy/hadoop/hadoop_snappy_writer.cc b/riegeli/snappy/hadoop/hadoop_snappy_writer.cc index c94302f..b7bb45f 100644 --- a/riegeli/snappy/hadoop/hadoop_snappy_writer.cc +++ b/riegeli/snappy/hadoop/hadoop_snappy_writer.cc
@@ -17,7 +17,6 @@ #include <stddef.h> #include <stdint.h> -#include <limits> #include <optional> #include <utility> @@ -91,14 +90,14 @@ if (ABSL_PREDICT_FALSE(!ok())) return false; Writer& dest = *DestWriter(); if (ABSL_PREDICT_FALSE(!PushInternal(dest))) return false; - if (ABSL_PREDICT_FALSE(start_pos() == std::numeric_limits<Position>::max())) { + if (ABSL_PREDICT_FALSE(start_pos() == kMaxPosition)) { return FailOverflow(); } const size_t length = UnsignedMin( ApplyBufferConstraints( ApplySizeHint(snappy::kBlockSize, size_hint_, start_pos()), 1, recommended_length, snappy::kBlockSize), - std::numeric_limits<Position>::max() - start_pos()); + kMaxPosition - start_pos()); uncompressed_.Reset(length); set_buffer(uncompressed_.data(), length); return true;
diff --git a/riegeli/snappy/hadoop/hadoop_snappy_writer.h b/riegeli/snappy/hadoop/hadoop_snappy_writer.h index 5cb2e2a..fdca709 100644 --- a/riegeli/snappy/hadoop/hadoop_snappy_writer.h +++ b/riegeli/snappy/hadoop/hadoop_snappy_writer.h
@@ -17,6 +17,7 @@ #include <stddef.h> +#include <limits> #include <optional> #include <utility> @@ -110,6 +111,8 @@ Reader* ReadModeBehindScratch(Position initial_pos) override; private: + static constexpr Position kMaxPosition = std::numeric_limits<Position>::max(); + // Compresses buffered data, but unlike `PushSlow()`, does not ensure that a // buffer is allocated. //
diff --git a/riegeli/snappy/snappy_writer.cc b/riegeli/snappy/snappy_writer.cc index 8604482..8750322 100644 --- a/riegeli/snappy/snappy_writer.cc +++ b/riegeli/snappy/snappy_writer.cc
@@ -73,8 +73,7 @@ set_start_pos(pos()); uncompressed_.RemoveSuffix(available()); set_buffer(); - if (ABSL_PREDICT_FALSE(IntCast<size_t>(start_pos()) > - std::numeric_limits<uint32_t>::max())) { + if (ABSL_PREDICT_FALSE(IntCast<size_t>(start_pos()) > kMaxPosition)) { return FailOverflow(); } return true; @@ -114,6 +113,8 @@ "enough space available, use Push() instead"; if (ABSL_PREDICT_FALSE(!ok())) return false; if (ABSL_PREDICT_FALSE(!SyncBuffer())) return false; + // Use a higher limit than `kMaxPosition` here to allow creating a larger + // buffer near the end of the supported range and filling it partially. if (ABSL_PREDICT_FALSE(min_length > std::numeric_limits<size_t>::max() - IntCast<size_t>(start_pos()))) { return FailOverflow(); @@ -137,8 +138,8 @@ if (src.size() <= MaxBytesToCopy()) return Writer::WriteSlow(std::move(src)); if (ABSL_PREDICT_FALSE(!ok())) return false; if (ABSL_PREDICT_FALSE(!SyncBuffer())) return false; - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<uint32_t>::max() - - IntCast<size_t>(start_pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > + kMaxPosition - IntCast<size_t>(start_pos()))) { return FailOverflow(); } move_start_pos(src.size()); @@ -153,8 +154,8 @@ if (src.size() <= MaxBytesToCopy()) return Writer::WriteSlow(src); if (ABSL_PREDICT_FALSE(!ok())) return false; if (ABSL_PREDICT_FALSE(!SyncBuffer())) return false; - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<uint32_t>::max() - - IntCast<size_t>(start_pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > + kMaxPosition - IntCast<size_t>(start_pos()))) { return FailOverflow(); } move_start_pos(src.size()); @@ -174,8 +175,8 @@ } if (ABSL_PREDICT_FALSE(!ok())) return false; if (ABSL_PREDICT_FALSE(!SyncBuffer())) return false; - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<uint32_t>::max() - - IntCast<size_t>(start_pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > + kMaxPosition - IntCast<size_t>(start_pos()))) { return FailOverflow(); } move_start_pos(src.size()); @@ -190,8 +191,8 @@ if (src.size() <= MaxBytesToCopy()) return Writer::WriteSlow(src); if (ABSL_PREDICT_FALSE(!ok())) return false; if (ABSL_PREDICT_FALSE(!SyncBuffer())) return false; - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<uint32_t>::max() - - IntCast<size_t>(start_pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > + kMaxPosition - IntCast<size_t>(start_pos()))) { return FailOverflow(); } move_start_pos(src.size()); @@ -211,8 +212,8 @@ } if (ABSL_PREDICT_FALSE(!ok())) return false; if (ABSL_PREDICT_FALSE(!SyncBuffer())) return false; - if (ABSL_PREDICT_FALSE(src.size() > std::numeric_limits<uint32_t>::max() - - IntCast<size_t>(start_pos()))) { + if (ABSL_PREDICT_FALSE(src.size() > + kMaxPosition - IntCast<size_t>(start_pos()))) { return FailOverflow(); } move_start_pos(src.size()); @@ -225,10 +226,8 @@ << "Failed precondition of Writer::WriteSlow(ByteFill): " "enough space available, use Write(ByteFill) instead"; if (ABSL_PREDICT_FALSE(!ok())) return false; - if (ABSL_PREDICT_FALSE(IntCast<size_t>(pos()) > - std::numeric_limits<uint32_t>::max() || - src.size() > std::numeric_limits<uint32_t>::max() - - IntCast<size_t>(pos()))) { + if (ABSL_PREDICT_FALSE(IntCast<size_t>(pos()) > kMaxPosition || + src.size() > kMaxPosition - IntCast<size_t>(pos()))) { return FailOverflow(); } const size_t first_length = UnsignedMin(
diff --git a/riegeli/snappy/snappy_writer.h b/riegeli/snappy/snappy_writer.h index d7a33cb..3afe962 100644 --- a/riegeli/snappy/snappy_writer.h +++ b/riegeli/snappy/snappy_writer.h
@@ -16,7 +16,9 @@ #define RIEGELI_SNAPPY_SNAPPY_WRITER_H_ #include <stddef.h> +#include <stdint.h> +#include <limits> #include <optional> #include <type_traits> #include <utility> @@ -121,6 +123,8 @@ Reader* ReadModeImpl(Position initial_pos) override; private: + static constexpr size_t kMaxPosition = std::numeric_limits<uint32_t>::max(); + // `snappy::kBlockSize` static constexpr size_t kBlockSize = size_t{64} << 10;
diff --git a/riegeli/tensorflow/io/file_reader.cc b/riegeli/tensorflow/io/file_reader.cc index fddb5cb..3c36de9 100644 --- a/riegeli/tensorflow/io/file_reader.cc +++ b/riegeli/tensorflow/io/file_reader.cc
@@ -90,7 +90,7 @@ } void FileReaderBase::InitializePos(Position initial_pos) { - if (ABSL_PREDICT_FALSE(initial_pos > std::numeric_limits<uint64_t>::max())) { + if (ABSL_PREDICT_FALSE(initial_pos > kMaxPosition)) { FailOverflow(); return; } @@ -176,11 +176,10 @@ inline bool FileReaderBase::ReadToDest(size_t length, tsl::RandomAccessFile* src, char* dest) { - if (ABSL_PREDICT_FALSE(limit_pos() >= std::numeric_limits<uint64_t>::max())) { + if (ABSL_PREDICT_FALSE(limit_pos() >= kMaxPosition)) { return FailOverflow(); } - const size_t length_to_read = - UnsignedMin(length, std::numeric_limits<uint64_t>::max() - limit_pos()); + const size_t length_to_read = UnsignedMin(length, kMaxPosition - limit_pos()); absl::string_view result; const absl::Status status = src->Read(IntCast<uint64_t>(limit_pos()), result, absl::MakeSpan(dest, length_to_read)); @@ -199,8 +198,8 @@ << "RandomAccessFile::Read() succeeded but read less than requested"; if (ABSL_PREDICT_FALSE(result.size() < length)) { // `result.size() == length_to_read < length`, which implies that - // `std::numeric_limits<uint64_t>::max()` was reached. - RIEGELI_ASSERT_EQ(limit_pos(), std::numeric_limits<uint64_t>::max()) + // `kMaxPosition` was reached. + RIEGELI_ASSERT_EQ(limit_pos(), kMaxPosition) << "Maximum position must have been reached"; return FailOverflow(); } @@ -214,13 +213,13 @@ buffer_.data() + buffer_.size()) << "Failed precondition of FileReaderBase::ReadToBuffer(): " "flat_buffer not a suffix of buffer_"; - if (ABSL_PREDICT_FALSE(limit_pos() >= std::numeric_limits<uint64_t>::max())) { + if (ABSL_PREDICT_FALSE(limit_pos() >= kMaxPosition)) { buffer_.RemoveSuffix(flat_buffer.size()); set_buffer(buffer_.data(), buffer_.size(), cursor_index); return FailOverflow(); } - const size_t length_to_read = UnsignedMin( - flat_buffer.size(), std::numeric_limits<uint64_t>::max() - limit_pos()); + const size_t length_to_read = + UnsignedMin(flat_buffer.size(), kMaxPosition - limit_pos()); absl::string_view result; const absl::Status status = src->Read(IntCast<uint64_t>(limit_pos()), result, @@ -252,8 +251,8 @@ << "RandomAccessFile::Read() succeeded but read less than requested"; if (ABSL_PREDICT_FALSE(result.size() < flat_buffer.size())) { // `result.size() == length_to_read < flat_buffer.size()`, which implies - // that `std::numeric_limits<uint64_t>::max()` was reached. - RIEGELI_ASSERT_EQ(limit_pos(), std::numeric_limits<uint64_t>::max()) + // that `kMaxPosition` was reached. + RIEGELI_ASSERT_EQ(limit_pos(), kMaxPosition) << "Maximum position must have been reached"; return FailOverflow(); }
diff --git a/riegeli/tensorflow/io/file_reader.h b/riegeli/tensorflow/io/file_reader.h index b9f00b8..54702d7 100644 --- a/riegeli/tensorflow/io/file_reader.h +++ b/riegeli/tensorflow/io/file_reader.h
@@ -16,7 +16,9 @@ #define RIEGELI_TENSORFLOW_IO_FILE_READER_H_ #include <stddef.h> +#include <stdint.h> +#include <limits> #include <memory> #include <optional> #include <string> @@ -135,6 +137,9 @@ } protected: + static constexpr Position kMaxPosition = + Position{std::numeric_limits<uint64_t>::max()}; + explicit FileReaderBase(Closed) noexcept : Reader(kClosed) {} explicit FileReaderBase(BufferOptions buffer_options, tsl::Env* env,
diff --git a/riegeli/tensorflow/io/file_writer.cc b/riegeli/tensorflow/io/file_writer.cc index 1980fa4..00b16ef 100644 --- a/riegeli/tensorflow/io/file_writer.cc +++ b/riegeli/tensorflow/io/file_writer.cc
@@ -155,13 +155,12 @@ "enough space available, use Push() instead"; if (ABSL_PREDICT_FALSE(!SyncBuffer())) return false; if (ABSL_PREDICT_FALSE(!ok())) return false; - if (ABSL_PREDICT_FALSE(min_length > - std::numeric_limits<Position>::max() - start_pos())) { + if (ABSL_PREDICT_FALSE(min_length > kMaxPosition - start_pos())) { return FailOverflow(); } const size_t buffer_length = UnsignedMin( buffer_sizer_.BufferLength(start_pos(), min_length, recommended_length), - std::numeric_limits<Position>::max() - start_pos()); + kMaxPosition - start_pos()); buffer_.Reset(buffer_length); set_buffer(buffer_.mutable_data(), buffer_length); return true; @@ -174,8 +173,7 @@ RIEGELI_ASSERT_OK(*this) << "Failed precondition of FileWriterBase::WriteInternal()"; tsl::WritableFile* const dest = DestFile(); - if (ABSL_PREDICT_FALSE(src.size() > - std::numeric_limits<Position>::max() - start_pos())) { + if (ABSL_PREDICT_FALSE(src.size() > kMaxPosition - start_pos())) { return FailOverflow(); } if (const absl::Status status = dest->Append(src); @@ -281,8 +279,7 @@ RIEGELI_ASSERT_OK(*this) << "Failed precondition of FileWriterBase::WriteInternal()"; tsl::WritableFile* const dest = DestFile(); - if (ABSL_PREDICT_FALSE(src.size() > - std::numeric_limits<Position>::max() - start_pos())) { + if (ABSL_PREDICT_FALSE(src.size() > kMaxPosition - start_pos())) { return FailOverflow(); } if (absl::Status status = dest->Append(src);
diff --git a/riegeli/tensorflow/io/file_writer.h b/riegeli/tensorflow/io/file_writer.h index 1488ea8..f4dd622 100644 --- a/riegeli/tensorflow/io/file_writer.h +++ b/riegeli/tensorflow/io/file_writer.h
@@ -16,7 +16,9 @@ #define RIEGELI_TENSORFLOW_IO_FILE_WRITER_H_ #include <stddef.h> +#include <stdint.h> +#include <limits> #include <memory> #include <optional> #include <string> @@ -149,6 +151,9 @@ Reader* ReadModeImpl(Position initial_pos) override; private: + static constexpr Position kMaxPosition = + Position{std::numeric_limits<int64_t>::max()}; + // Writes `buffer_` to the file. Sets buffer pointers to `nullptr`. bool SyncBuffer();
diff --git a/riegeli/xz/xz_reader.cc b/riegeli/xz/xz_reader.cc index 7ae7837..7435ada 100644 --- a/riegeli/xz/xz_reader.cc +++ b/riegeli/xz/xz_reader.cc
@@ -167,8 +167,7 @@ << "Failed precondition of BufferedReader::ReadInternal()"; Reader& src = *SrcReader(); truncated_ = false; - max_length = UnsignedMin(max_length, - std::numeric_limits<Position>::max() - limit_pos()); + max_length = UnsignedMin(max_length, kMaxPosition - limit_pos()); decompressor_->next_out = reinterpret_cast<uint8_t*>(dest); for (;;) { decompressor_->avail_out = PtrDistance( @@ -188,8 +187,7 @@ RIEGELI_ASSERT_EQ(decompressor_->avail_out, 0u) << "lzma_code() returned but there are still input data " "and output space"; - RIEGELI_ASSERT_EQ(length_read, - std::numeric_limits<Position>::max() - limit_pos()) + RIEGELI_ASSERT_EQ(length_read, kMaxPosition - limit_pos()) << "The position does not overflow but the output buffer is " "full, while less than min_length was output, which is " "impossible because the buffer has size max_length which is "
diff --git a/riegeli/xz/xz_reader.h b/riegeli/xz/xz_reader.h index c5f05b7..42a8a15 100644 --- a/riegeli/xz/xz_reader.h +++ b/riegeli/xz/xz_reader.h
@@ -18,6 +18,7 @@ #include <stddef.h> #include <stdint.h> +#include <limits> #include <memory> #include <utility> @@ -186,6 +187,8 @@ Container container; }; + static constexpr Position kMaxPosition = std::numeric_limits<Position>::max(); + void InitializeDecompressor(); ABSL_ATTRIBUTE_COLD bool FailOperation(absl::string_view operation, lzma_ret liblzma_code);
diff --git a/riegeli/xz/xz_writer.cc b/riegeli/xz/xz_writer.cc index 32e37b5..b4497f8 100644 --- a/riegeli/xz/xz_writer.cc +++ b/riegeli/xz/xz_writer.cc
@@ -17,7 +17,6 @@ #include <stddef.h> #include <stdint.h> -#include <limits> #include <memory> #include <utility> @@ -166,8 +165,7 @@ lzma_action flush) { RIEGELI_ASSERT_OK(*this) << "Failed precondition of XzWriterBase::WriteInternal()"; - if (ABSL_PREDICT_FALSE(src.size() > - std::numeric_limits<Position>::max() - start_pos())) { + if (ABSL_PREDICT_FALSE(src.size() > kMaxPosition - start_pos())) { return FailOverflow(); } compressor_->next_in = reinterpret_cast<const uint8_t*>(src.data());
diff --git a/riegeli/xz/xz_writer.h b/riegeli/xz/xz_writer.h index 53af298..3776c7c 100644 --- a/riegeli/xz/xz_writer.h +++ b/riegeli/xz/xz_writer.h
@@ -17,6 +17,7 @@ #include <stdint.h> +#include <limits> #include <utility> #include "absl/base/attributes.h" @@ -259,6 +260,8 @@ uint32_t preset; }; + static constexpr Position kMaxPosition = std::numeric_limits<Position>::max(); + ABSL_ATTRIBUTE_COLD bool FailOperation(absl::string_view operation, lzma_ret liblzma_code); bool WriteInternal(absl::string_view src, Writer& dest, lzma_action flush);
diff --git a/riegeli/zlib/zlib_reader.cc b/riegeli/zlib/zlib_reader.cc index c16d1a5..8757c72 100644 --- a/riegeli/zlib/zlib_reader.cc +++ b/riegeli/zlib/zlib_reader.cc
@@ -17,7 +17,6 @@ #include <stddef.h> #include <stdint.h> -#include <limits> #include <memory> #include <optional> #include <utility> @@ -143,8 +142,7 @@ << "Failed precondition of BufferedReader::ReadInternal()"; Reader& src = *SrcReader(); truncated_ = false; - max_length = UnsignedMin(max_length, - std::numeric_limits<Position>::max() - limit_pos()); + max_length = UnsignedMin(max_length, kMaxPosition - limit_pos()); z_stream* const z_stream_ptr = static_cast<z_stream*>(decompressor_.get()); z_stream_ptr->next_out = reinterpret_cast<Bytef*>(dest); for (;;) { @@ -167,8 +165,7 @@ RIEGELI_ASSERT_EQ(z_stream_ptr->avail_out, 0u) << "inflate() returned but there are still input data " "and output space"; - RIEGELI_ASSERT_EQ(length_read, - std::numeric_limits<Position>::max() - limit_pos()) + RIEGELI_ASSERT_EQ(length_read, kMaxPosition - limit_pos()) << "The position does not overflow but the output buffer is " "full, while less than min_length was output, which is " "impossible because the buffer has size max_length which is "
diff --git a/riegeli/zlib/zlib_reader.h b/riegeli/zlib/zlib_reader.h index 42639c9..5f86413 100644 --- a/riegeli/zlib/zlib_reader.h +++ b/riegeli/zlib/zlib_reader.h
@@ -18,6 +18,7 @@ #include <stddef.h> #include <stdint.h> +#include <limits> #include <memory> #include <optional> #include <utility> @@ -220,6 +221,8 @@ void operator()(void* ptr) const; }; + static constexpr Position kMaxPosition = std::numeric_limits<Position>::max(); + void InitializeDecompressor(); ABSL_ATTRIBUTE_COLD bool FailOperation(absl::string_view operation, int zlib_code);
diff --git a/riegeli/zlib/zlib_writer.cc b/riegeli/zlib/zlib_writer.cc index 1ac4de5..672c61f 100644 --- a/riegeli/zlib/zlib_writer.cc +++ b/riegeli/zlib/zlib_writer.cc
@@ -163,8 +163,7 @@ int flush) { RIEGELI_ASSERT_OK(*this) << "Failed precondition of ZlibWriterBase::WriteInternal()"; - if (ABSL_PREDICT_FALSE(src.size() > - std::numeric_limits<Position>::max() - start_pos())) { + if (ABSL_PREDICT_FALSE(src.size() > kMaxPosition - start_pos())) { return FailOverflow(); } z_stream* const z_stream_ptr = static_cast<z_stream*>(compressor_.get());
diff --git a/riegeli/zlib/zlib_writer.h b/riegeli/zlib/zlib_writer.h index 95b3629..39d65a7 100644 --- a/riegeli/zlib/zlib_writer.h +++ b/riegeli/zlib/zlib_writer.h
@@ -15,6 +15,7 @@ #ifndef RIEGELI_ZLIB_ZLIB_WRITER_H_ #define RIEGELI_ZLIB_ZLIB_WRITER_H_ +#include <limits> #include <utility> #include "absl/base/attributes.h" @@ -230,6 +231,8 @@ int window_bits; }; + static constexpr Position kMaxPosition = std::numeric_limits<Position>::max(); + ABSL_ATTRIBUTE_COLD bool FailOperation(absl::string_view operation, int zlib_code); bool WriteInternal(absl::string_view src, Writer& dest, int flush);
diff --git a/riegeli/zstd/zstd_reader.cc b/riegeli/zstd/zstd_reader.cc index 2ec379a..449e316 100644 --- a/riegeli/zstd/zstd_reader.cc +++ b/riegeli/zstd/zstd_reader.cc
@@ -187,8 +187,7 @@ effective_min_length = std::numeric_limits<size_t>::max(); } just_initialized_ = false; - max_length = UnsignedMin(max_length, - std::numeric_limits<Position>::max() - limit_pos()); + max_length = UnsignedMin(max_length, kMaxPosition - limit_pos()); ZSTD_outBuffer output = {dest, max_length, 0}; for (;;) { ZSTD_inBuffer input = {src.cursor(), src.available(), 0}; @@ -223,8 +222,7 @@ RIEGELI_ASSERT_EQ(output.pos, output.size) << "ZSTD_decompressStream() returned but there are still " "input data and output space"; - RIEGELI_ASSERT_EQ(output.pos, - std::numeric_limits<Position>::max() - limit_pos()) + RIEGELI_ASSERT_EQ(output.pos, kMaxPosition - limit_pos()) << "The position does not overflow but the output buffer is full, " "while less than min_length was output, which implies that " "ZSTD_decompressStream() wants to output more than the "
diff --git a/riegeli/zstd/zstd_reader.h b/riegeli/zstd/zstd_reader.h index db33665..ac09996 100644 --- a/riegeli/zstd/zstd_reader.h +++ b/riegeli/zstd/zstd_reader.h
@@ -18,6 +18,7 @@ #include <stddef.h> #include <stdint.h> +#include <limits> #include <memory> #include <optional> #include <utility> @@ -184,6 +185,8 @@ void operator()(ZSTD_DCtx* ptr) const { ZSTD_freeDCtx(ptr); } }; + static constexpr Position kMaxPosition = std::numeric_limits<Position>::max(); + void InitializeDecompressor(Reader& src); // If `true`, supports decompressing as much as possible from a truncated
diff --git a/riegeli/zstd/zstd_writer.cc b/riegeli/zstd/zstd_writer.cc index 54792bf..3813554 100644 --- a/riegeli/zstd/zstd_writer.cc +++ b/riegeli/zstd/zstd_writer.cc
@@ -24,7 +24,6 @@ #include <stddef.h> -#include <limits> #include <memory> #include <optional> #include <utility> @@ -212,8 +211,7 @@ ZSTD_EndDirective end_op) { RIEGELI_ASSERT_OK(*this) << "Failed precondition of ZstdWriterBase::WriteInternal()"; - if (ABSL_PREDICT_FALSE(src.size() > - std::numeric_limits<Position>::max() - start_pos())) { + if (ABSL_PREDICT_FALSE(src.size() > kMaxPosition - start_pos())) { return FailOverflow(); } if (pledged_size_ != std::nullopt) {
diff --git a/riegeli/zstd/zstd_writer.h b/riegeli/zstd/zstd_writer.h index ccbb801..82edd3a 100644 --- a/riegeli/zstd/zstd_writer.h +++ b/riegeli/zstd/zstd_writer.h
@@ -17,6 +17,7 @@ #include <stddef.h> +#include <limits> #include <optional> #include <utility> @@ -321,6 +322,8 @@ void operator()(ZSTD_CCtx* ptr) const { ZSTD_freeCCtx(ptr); } }; + static constexpr Position kMaxPosition = std::numeric_limits<Position>::max(); + bool WriteInternal(absl::string_view src, Writer& dest, ZSTD_EndDirective end_op);