[go: nahoru, domu]

Make net::WrappedIOBuffer require a size argument.

This is a partial step to achieving the goal of the linked bug.
Introduce two-arg form of WrappedIOBuffer constructor which takes
a size argument, and update callers to pass that value. The value
is propagated into new parent class net::IOBufferWithSize but is
not yet used otherwise.

Bug: 1493389
Change-Id: Ia3333835563ebc99bdbac19e314d372d39fccafb
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4973821
Reviewed-by: Reilly Grant <reillyg@chromium.org>
Reviewed-by: Stefano Duo <stefanoduo@google.com>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Matt Menke <mmenke@chromium.org>
Reviewed-by: Finnur Thorarinsson <finnur@chromium.org>
Reviewed-by: Elly FJ <ellyjones@chromium.org>
Reviewed-by: Joe Downing <joedow@chromium.org>
Reviewed-by: Marijn Kruisselbrink <mek@chromium.org>
Reviewed-by: Mark Foltz <mfoltz@chromium.org>
Reviewed-by: Joshua Bell <jsbell@chromium.org>
Code-Coverage: findit-for-me@appspot.gserviceaccount.com <findit-for-me@appspot.gserviceaccount.com>
Cr-Commit-Position: refs/heads/main@{#1217225}
diff --git a/chrome/browser/extensions/api/socket/udp_socket_unittest.cc b/chrome/browser/extensions/api/socket/udp_socket_unittest.cc
index 578a1637..c277848 100644
--- a/chrome/browser/extensions/api/socket/udp_socket_unittest.cc
+++ b/chrome/browser/extensions/api/socket/udp_socket_unittest.cc
@@ -143,7 +143,8 @@
                                 int result) {
   if (result == 0) {
     scoped_refptr<net::IOBuffer> data =
-        base::MakeRefCounted<net::WrappedIOBuffer>(kTestMessage);
+        base::MakeRefCounted<net::WrappedIOBuffer>(kTestMessage,
+                                                   kTestMessageLength);
     src->Write(data, kTestMessageLength, base::BindOnce(&OnSendCompleted));
     base::SingleThreadTaskRunner::GetCurrentDefault()->PostDelayedTask(
         FROM_HERE,
diff --git a/components/cronet/android/cronet_bidirectional_stream_adapter.cc b/components/cronet/android/cronet_bidirectional_stream_adapter.cc
index 14945d80..292a489 100644
--- a/components/cronet/android/cronet_bidirectional_stream_adapter.cc
+++ b/components/cronet/android/cronet_bidirectional_stream_adapter.cc
@@ -234,8 +234,8 @@
                            i, 1, &limit);
     DCHECK_LE(pos, limit);
     scoped_refptr<net::WrappedIOBuffer> write_buffer =
-        base::MakeRefCounted<net::WrappedIOBuffer>(static_cast<char*>(data) +
-                                                   pos);
+        base::MakeRefCounted<net::WrappedIOBuffer>(
+            static_cast<char*>(data) + pos, limit - pos);
     pending_write_data->write_buffer_list.push_back(write_buffer);
     pending_write_data->write_buffer_len_list.push_back(limit - pos);
   }
diff --git a/components/cronet/android/io_buffer_with_byte_buffer.cc b/components/cronet/android/io_buffer_with_byte_buffer.cc
index 84812d47..2011175 100644
--- a/components/cronet/android/io_buffer_with_byte_buffer.cc
+++ b/components/cronet/android/io_buffer_with_byte_buffer.cc
@@ -14,7 +14,8 @@
     void* byte_buffer_data,
     jint position,
     jint limit)
-    : net::WrappedIOBuffer(static_cast<char*>(byte_buffer_data) + position),
+    : net::WrappedIOBuffer(static_cast<char*>(byte_buffer_data) + position,
+                           limit - position),
       byte_buffer_(env, jbyte_buffer),
       initial_position_(position),
       initial_limit_(limit) {
diff --git a/components/cronet/native/io_buffer_with_cronet_buffer.cc b/components/cronet/native/io_buffer_with_cronet_buffer.cc
index 015700c9..2d82dce 100644
--- a/components/cronet/native/io_buffer_with_cronet_buffer.cc
+++ b/components/cronet/native/io_buffer_with_cronet_buffer.cc
@@ -30,7 +30,8 @@
 IOBufferWithCronet_Buffer::IOBufferWithCronet_Buffer(
     Cronet_BufferPtr cronet_buffer)
     : net::WrappedIOBuffer(
-          reinterpret_cast<const char*>(cronet_buffer->GetData())),
+          reinterpret_cast<const char*>(cronet_buffer->GetData()),
+          static_cast<size_t>(cronet_buffer->GetSize())),
       cronet_buffer_(cronet_buffer) {}
 
 IOBufferWithCronet_Buffer::~IOBufferWithCronet_Buffer() {
diff --git a/components/grpc_support/bidirectional_stream.cc b/components/grpc_support/bidirectional_stream.cc
index 3d030748..52327d5 100644
--- a/components/grpc_support/bidirectional_stream.cc
+++ b/components/grpc_support/bidirectional_stream.cc
@@ -110,7 +110,7 @@
   if (!buffer)
     return false;
   scoped_refptr<net::WrappedIOBuffer> read_buffer =
-      base::MakeRefCounted<net::WrappedIOBuffer>(buffer);
+      base::MakeRefCounted<net::WrappedIOBuffer>(buffer, capacity);
 
   PostToNetworkThread(
       FROM_HERE, base::BindOnce(&BidirectionalStream::ReadDataOnNetworkThread,
@@ -125,7 +125,7 @@
     return false;
 
   scoped_refptr<net::WrappedIOBuffer> write_buffer =
-      base::MakeRefCounted<net::WrappedIOBuffer>(buffer);
+      base::MakeRefCounted<net::WrappedIOBuffer>(buffer, count);
 
   PostToNetworkThread(
       FROM_HERE,
diff --git a/components/services/storage/service_worker/service_worker_resource_ops.cc b/components/services/storage/service_worker/service_worker_resource_ops.cc
index 201de2f..ad95a07 100644
--- a/components/services/storage/service_worker/service_worker_resource_ops.cc
+++ b/components/services/storage/service_worker/service_worker_resource_ops.cc
@@ -85,7 +85,8 @@
 class WrappedPickleIOBuffer : public net::WrappedIOBuffer {
  public:
   explicit WrappedPickleIOBuffer(std::unique_ptr<const base::Pickle> pickle)
-      : net::WrappedIOBuffer(reinterpret_cast<const char*>(pickle->data())),
+      : net::WrappedIOBuffer(reinterpret_cast<const char*>(pickle->data()),
+                             pickle->size()),
         pickle_(std::move(pickle)) {
     DCHECK(pickle_->data());
   }
diff --git a/content/browser/cache_storage/cache_storage_cache_entry_handler.cc b/content/browser/cache_storage/cache_storage_cache_entry_handler.cc
index 7f95384..d96b738 100644
--- a/content/browser/cache_storage/cache_storage_cache_entry_handler.cc
+++ b/content/browser/cache_storage/cache_storage_cache_entry_handler.cc
@@ -141,7 +141,7 @@
     int length = blob_entry_->GetSize(side_data_disk_cache_index_);
     mojo_base::BigBuffer output_buf(static_cast<size_t>(length));
     auto wrapped_buf = base::MakeRefCounted<net::WrappedIOBuffer>(
-        reinterpret_cast<char*>(output_buf.data()));
+        reinterpret_cast<char*>(output_buf.data()), output_buf.size());
 
     auto split_callback = base::SplitOnceCallback(base::BindOnce(
         [](mojo_base::BigBuffer output_buf, ReadSideDataCallback callback,
diff --git a/content/browser/service_worker/service_worker_new_script_loader.cc b/content/browser/service_worker/service_worker_new_script_loader.cc
index f1b77e4..e549ae6 100644
--- a/content/browser/service_worker/service_worker_new_script_loader.cc
+++ b/content/browser/service_worker/service_worker_new_script_loader.cc
@@ -47,7 +47,8 @@
 class ServiceWorkerNewScriptLoader::WrappedIOBuffer
     : public net::WrappedIOBuffer {
  public:
-  explicit WrappedIOBuffer(const char* data) : net::WrappedIOBuffer(data) {}
+  WrappedIOBuffer(const char* data, size_t size)
+      : net::WrappedIOBuffer(data, size) {}
 
  private:
   ~WrappedIOBuffer() override = default;
@@ -595,7 +596,8 @@
   uint32_t bytes_written = std::min<uint32_t>(kReadBufferSize, bytes_available);
 
   auto buffer = base::MakeRefCounted<WrappedIOBuffer>(
-      pending_buffer ? pending_buffer->buffer() : nullptr);
+      pending_buffer ? pending_buffer->buffer() : nullptr,
+      pending_buffer ? pending_buffer->size() : 0);
   MojoResult result = client_producer_->WriteData(
       buffer->data(), &bytes_written, MOJO_WRITE_DATA_FLAG_NONE);
   TRACE_EVENT_WITH_FLOW1("ServiceWorker",
diff --git a/content/browser/service_worker/service_worker_single_script_update_checker.cc b/content/browser/service_worker/service_worker_single_script_update_checker.cc
index a8f98c1..7f81bd79 100644
--- a/content/browser/service_worker/service_worker_single_script_update_checker.cc
+++ b/content/browser/service_worker/service_worker_single_script_update_checker.cc
@@ -93,7 +93,8 @@
 class ServiceWorkerSingleScriptUpdateChecker::WrappedIOBuffer
     : public net::WrappedIOBuffer {
  public:
-  WrappedIOBuffer(const char* data) : net::WrappedIOBuffer(data) {}
+  WrappedIOBuffer(const char* data, size_t size)
+      : net::WrappedIOBuffer(data, size) {}
 
  private:
   ~WrappedIOBuffer() override = default;
@@ -560,7 +561,8 @@
 
   DCHECK(pending_buffer || bytes_to_compare == 0);
   auto buffer = base::MakeRefCounted<WrappedIOBuffer>(
-      pending_buffer ? pending_buffer->buffer() : nullptr);
+      pending_buffer ? pending_buffer->buffer() : nullptr,
+      pending_buffer ? pending_buffer->size() : 0);
 
   // Compare the network data and the stored data.
   net::Error error = cache_writer_->MaybeWriteData(
diff --git a/content/browser/service_worker/service_worker_test_utils.cc b/content/browser/service_worker/service_worker_test_utils.cc
index 6d75c1a..f9465e3 100644
--- a/content/browser/service_worker/service_worker_test_utils.cc
+++ b/content/browser/service_worker/service_worker_test_utils.cc
@@ -772,7 +772,8 @@
       base::MakeRefCounted<net::HttpResponseHeaders>(new_headers);
   cache_writer->bytes_compared_ = bytes_compared;
   cache_writer->data_to_write_ = base::MakeRefCounted<net::WrappedIOBuffer>(
-      pending_network_buffer ? pending_network_buffer->buffer() : nullptr);
+      pending_network_buffer ? pending_network_buffer->buffer() : nullptr,
+      pending_network_buffer ? pending_network_buffer->size() : 0);
   cache_writer->len_to_write_ = consumed_size;
   cache_writer->bytes_written_ = 0;
   cache_writer->io_pending_ = true;
diff --git a/content/browser/service_worker/service_worker_updated_script_loader.cc b/content/browser/service_worker/service_worker_updated_script_loader.cc
index d8c0518..d8867341 100644
--- a/content/browser/service_worker/service_worker_updated_script_loader.cc
+++ b/content/browser/service_worker/service_worker_updated_script_loader.cc
@@ -38,7 +38,8 @@
 class ServiceWorkerUpdatedScriptLoader::WrappedIOBuffer
     : public net::WrappedIOBuffer {
  public:
-  explicit WrappedIOBuffer(const char* data) : net::WrappedIOBuffer(data) {}
+  WrappedIOBuffer(const char* data, size_t size)
+      : net::WrappedIOBuffer(data, size) {}
 
  private:
   ~WrappedIOBuffer() override = default;
@@ -396,7 +397,8 @@
   uint32_t bytes_written = std::min<uint32_t>(kReadBufferSize, bytes_available);
 
   auto buffer = base::MakeRefCounted<WrappedIOBuffer>(
-      pending_buffer ? pending_buffer->buffer() : nullptr);
+      pending_buffer ? pending_buffer->buffer() : nullptr,
+      pending_buffer ? pending_buffer->size() : 0);
   MojoResult result = client_producer_->WriteData(
       buffer->data(), &bytes_written, MOJO_WRITE_DATA_FLAG_NONE);
   switch (result) {
diff --git a/device/bluetooth/socket.cc b/device/bluetooth/socket.cc
index a20dcf8..1f03996 100644
--- a/device/bluetooth/socket.cc
+++ b/device/bluetooth/socket.cc
@@ -178,7 +178,8 @@
   }
 
   bluetooth_socket_->Send(base::MakeRefCounted<net::WrappedIOBuffer>(
-                              static_cast<const char*>(pending_read_buffer)),
+                              static_cast<const char*>(pending_read_buffer),
+                              static_cast<size_t>(pending_read_buffer_size)),
                           pending_read_buffer_size,
                           base::BindOnce(&Socket::OnBluetoothSocketSend,
                                          weak_ptr_factory_.GetWeakPtr()),
diff --git a/extensions/browser/api/bluetooth_socket/bluetooth_socket_api.cc b/extensions/browser/api/bluetooth_socket/bluetooth_socket_api.cc
index 0376457..4f9f033 100644
--- a/extensions/browser/api/bluetooth_socket/bluetooth_socket_api.cc
+++ b/extensions/browser/api/bluetooth_socket/bluetooth_socket_api.cc
@@ -554,7 +554,8 @@
 
   io_buffer_size_ = params_->data.size();
   io_buffer_ = base::MakeRefCounted<net::WrappedIOBuffer>(
-      reinterpret_cast<const char*>(params_->data.data()));
+      reinterpret_cast<const char*>(params_->data.data()),
+      params_->data.size());
 
   BluetoothApiSocket* socket = GetSocket(params_->socket_id);
   if (!socket)
diff --git a/extensions/browser/api/socket/socket.cc b/extensions/browser/api/socket/socket.cc
index f1aafc6e..90dd198 100644
--- a/extensions/browser/api/socket/socket.cc
+++ b/extensions/browser/api/socket/socket.cc
@@ -54,7 +54,8 @@
 
   DCHECK(request.byte_count >= request.bytes_written);
   io_buffer_write_ = base::MakeRefCounted<net::WrappedIOBuffer>(
-      request.io_buffer->data() + request.bytes_written);
+      request.io_buffer->data() + request.bytes_written,
+      request.byte_count - request.bytes_written);
   int result = WriteImpl(
       io_buffer_write_.get(), request.byte_count - request.bytes_written,
       base::BindOnce(&Socket::OnWriteComplete, base::Unretained(this)));
diff --git a/ios/net/crn_http_protocol_handler.mm b/ios/net/crn_http_protocol_handler.mm
index 533085c..1c52ead 100644
--- a/ios/net/crn_http_protocol_handler.mm
+++ b/ios/net/crn_http_protocol_handler.mm
@@ -515,7 +515,7 @@
   }
   read_buffer_.reset(static_cast<char*>(malloc(read_buffer_size_)));
   read_buffer_wrapper_ = base::MakeRefCounted<WrappedIOBuffer>(
-      static_cast<const char*>(read_buffer_.get()));
+      static_cast<const char*>(read_buffer_.get()), read_buffer_size_);
 }
 
 HttpProtocolHandlerCore::~HttpProtocolHandlerCore() {
diff --git a/media/cast/net/udp_transport_impl.cc b/media/cast/net/udp_transport_impl.cc
index 63f4fbc..d7cafa9 100644
--- a/media/cast/net/udp_transport_impl.cc
+++ b/media/cast/net/udp_transport_impl.cc
@@ -180,7 +180,8 @@
     if (length_or_status == net::ERR_IO_PENDING) {
       next_packet_ = std::make_unique<Packet>(media::cast::kMaxIpPacketSize);
       recv_buf_ = base::MakeRefCounted<net::WrappedIOBuffer>(
-          reinterpret_cast<char*>(&next_packet_->front()));
+          reinterpret_cast<char*>(&next_packet_->front()),
+          next_packet_->size());
       length_or_status = udp_socket_->RecvFrom(
           recv_buf_.get(), media::cast::kMaxIpPacketSize, &recv_addr_,
           base::BindOnce(&UdpTransportImpl::ReceiveNextPacket,
@@ -252,7 +253,7 @@
   }
 
   auto buf = base::MakeRefCounted<net::WrappedIOBuffer>(
-      reinterpret_cast<char*>(&packet->data.front()));
+      reinterpret_cast<char*>(&packet->data.front()), packet->data.size());
 
   int result;
   net::CompletionOnceCallback callback =
diff --git a/media/cast/test/utility/udp_proxy.cc b/media/cast/test/utility/udp_proxy.cc
index 343931b..a4c93104 100644
--- a/media/cast/test/utility/udp_proxy.cc
+++ b/media/cast/test/utility/udp_proxy.cc
@@ -721,7 +721,7 @@
     // We ignore all problems, callbacks and errors.
     // If it didn't work we just drop the packet at and call it a day.
     auto buf = base::MakeRefCounted<net::WrappedIOBuffer>(
-        reinterpret_cast<char*>(&packet->front()));
+        reinterpret_cast<char*>(&packet->front()), packet->size());
     size_t buf_size = packet->size();
     int result;
     if (destination.address().empty()) {
@@ -805,7 +805,7 @@
     while (true) {
       packet_ = std::make_unique<Packet>(kMaxPacketSize);
       auto recv_buf = base::MakeRefCounted<net::WrappedIOBuffer>(
-          reinterpret_cast<char*>(&packet_->front()));
+          reinterpret_cast<char*>(&packet_->front()), packet_->size());
       int len =
           socket_->RecvFrom(recv_buf.get(), kMaxPacketSize, &recv_address_,
                             base::BindOnce(&UDPProxyImpl::ReadCallback,
diff --git a/net/base/elements_upload_data_stream_unittest.cc b/net/base/elements_upload_data_stream_unittest.cc
index 041e005..762315b 100644
--- a/net/base/elements_upload_data_stream_unittest.cc
+++ b/net/base/elements_upload_data_stream_unittest.cc
@@ -702,7 +702,7 @@
   TestCompletionCallback read_callback1;
   std::vector<char> buf(kTestDataSize + kTestDataSize / 2);
   scoped_refptr<IOBuffer> wrapped_buffer =
-      base::MakeRefCounted<WrappedIOBuffer>(&buf[0]);
+      base::MakeRefCounted<WrappedIOBuffer>(buf.data(), buf.size());
   EXPECT_EQ(
       ERR_IO_PENDING,
       stream->Read(wrapped_buffer.get(), buf.size(),
@@ -722,7 +722,7 @@
   TestCompletionCallback read_callback2;
   std::vector<char> buf2(kTestDataSize * 2);
   scoped_refptr<IOBuffer> wrapped_buffer2 =
-      base::MakeRefCounted<WrappedIOBuffer>(&buf2[0]);
+      base::MakeRefCounted<WrappedIOBuffer>(buf2.data(), buf2.size());
   EXPECT_EQ(ERR_IO_PENDING,
             stream->Read(
                 wrapped_buffer2.get(), buf2.size(), read_callback2.callback()));
@@ -767,7 +767,7 @@
   TestCompletionCallback read_callback2;
   std::vector<char> buf2(kTestDataSize * 2);
   scoped_refptr<IOBuffer> wrapped_buffer2 =
-      base::MakeRefCounted<WrappedIOBuffer>(&buf2[0]);
+      base::MakeRefCounted<WrappedIOBuffer>(buf2.data(), buf2.size());
   EXPECT_EQ(ERR_IO_PENDING,
             stream->Read(
                 wrapped_buffer2.get(), buf2.size(), read_callback2.callback()));
@@ -811,7 +811,7 @@
   TestCompletionCallback read_callback1;
   std::vector<char> buf(kTestDataSize * 2);
   scoped_refptr<IOBuffer> wrapped_buffer =
-      base::MakeRefCounted<WrappedIOBuffer>(&buf[0]);
+      base::MakeRefCounted<WrappedIOBuffer>(buf.data(), buf.size());
   EXPECT_EQ(
       ERR_IO_PENDING,
       stream->Read(wrapped_buffer.get(), buf.size(),
@@ -829,7 +829,7 @@
   TestCompletionCallback read_callback2;
   std::vector<char> buf2(kTestDataSize * 2);
   scoped_refptr<IOBuffer> wrapped_buffer2 =
-      base::MakeRefCounted<WrappedIOBuffer>(&buf2[0]);
+      base::MakeRefCounted<WrappedIOBuffer>(buf2.data(), buf2.size());
   EXPECT_EQ(ERR_IO_PENDING,
             stream->Read(
                 wrapped_buffer2.get(), buf2.size(), read_callback2.callback()));
diff --git a/net/base/io_buffer.cc b/net/base/io_buffer.cc
index e6042129..c696e5f 100644
--- a/net/base/io_buffer.cc
+++ b/net/base/io_buffer.cc
@@ -136,9 +136,8 @@
   data_ = nullptr;
 }
 
-WrappedIOBuffer::WrappedIOBuffer(const char* data)
-    : IOBuffer(const_cast<char*>(data)) {
-}
+WrappedIOBuffer::WrappedIOBuffer(const char* data, size_t size)
+    : IOBufferWithSize(const_cast<char*>(data), size) {}
 
 WrappedIOBuffer::~WrappedIOBuffer() {
   data_ = nullptr;
diff --git a/net/base/io_buffer.h b/net/base/io_buffer.h
index b2995b015..e57489d 100644
--- a/net/base/io_buffer.h
+++ b/net/base/io_buffer.h
@@ -245,9 +245,9 @@
 // A good example is the buffer for a synchronous operation, where we can be
 // sure that nobody is keeping an extra reference to this object so the lifetime
 // of the buffer can be completely managed by its intended owner.
-class NET_EXPORT WrappedIOBuffer : public IOBuffer {
+class NET_EXPORT WrappedIOBuffer : public IOBufferWithSize {
  public:
-  explicit WrappedIOBuffer(const char* data);
+  WrappedIOBuffer(const char* data, size_t size);
 
  protected:
   ~WrappedIOBuffer() override;
diff --git a/net/base/upload_bytes_element_reader_unittest.cc b/net/base/upload_bytes_element_reader_unittest.cc
index 4f5c274..bf01e09 100644
--- a/net/base/upload_bytes_element_reader_unittest.cc
+++ b/net/base/upload_bytes_element_reader_unittest.cc
@@ -38,7 +38,7 @@
   const size_t kHalfSize = bytes_.size() / 2;
   std::vector<char> buf(kHalfSize);
   scoped_refptr<IOBuffer> wrapped_buffer =
-      base::MakeRefCounted<WrappedIOBuffer>(&buf[0]);
+      base::MakeRefCounted<WrappedIOBuffer>(buf.data(), buf.size());
   EXPECT_EQ(static_cast<int>(buf.size()),
             reader_->Read(wrapped_buffer.get(), buf.size(),
                           CompletionOnceCallback()));
@@ -50,7 +50,7 @@
 TEST_F(UploadBytesElementReaderTest, ReadAll) {
   std::vector<char> buf(bytes_.size());
   scoped_refptr<IOBuffer> wrapped_buffer =
-      base::MakeRefCounted<WrappedIOBuffer>(&buf[0]);
+      base::MakeRefCounted<WrappedIOBuffer>(buf.data(), buf.size());
   EXPECT_EQ(static_cast<int>(buf.size()),
             reader_->Read(wrapped_buffer.get(), buf.size(),
                           CompletionOnceCallback()));
@@ -65,7 +65,7 @@
   const size_t kTooLargeSize = bytes_.size() * 2;
   std::vector<char> buf(kTooLargeSize);
   scoped_refptr<IOBuffer> wrapped_buffer =
-      base::MakeRefCounted<WrappedIOBuffer>(&buf[0]);
+      base::MakeRefCounted<WrappedIOBuffer>(buf.data(), buf.size());
   EXPECT_EQ(static_cast<int>(bytes_.size()),
             reader_->Read(wrapped_buffer.get(), buf.size(),
                           CompletionOnceCallback()));
@@ -77,7 +77,7 @@
 TEST_F(UploadBytesElementReaderTest, MultipleInit) {
   std::vector<char> buf(bytes_.size());
   scoped_refptr<IOBuffer> wrapped_buffer =
-      base::MakeRefCounted<WrappedIOBuffer>(&buf[0]);
+      base::MakeRefCounted<WrappedIOBuffer>(buf.data(), buf.size());
 
   // Read all.
   EXPECT_EQ(static_cast<int>(buf.size()),
diff --git a/net/base/upload_file_element_reader_unittest.cc b/net/base/upload_file_element_reader_unittest.cc
index 77b555a..24709f2 100644
--- a/net/base/upload_file_element_reader_unittest.cc
+++ b/net/base/upload_file_element_reader_unittest.cc
@@ -112,7 +112,7 @@
   ASSERT_EQ(bytes_.size(), kHalfSize * 2);
   std::vector<char> buf(kHalfSize);
   scoped_refptr<IOBuffer> wrapped_buffer =
-      base::MakeRefCounted<WrappedIOBuffer>(&buf[0]);
+      base::MakeRefCounted<WrappedIOBuffer>(buf.data(), buf.size());
   TestCompletionCallback read_callback1;
   ASSERT_EQ(ERR_IO_PENDING,
             reader_->Read(
@@ -133,7 +133,7 @@
 TEST_P(UploadFileElementReaderTest, ReadAll) {
   std::vector<char> buf(bytes_.size());
   scoped_refptr<IOBuffer> wrapped_buffer =
-      base::MakeRefCounted<WrappedIOBuffer>(&buf[0]);
+      base::MakeRefCounted<WrappedIOBuffer>(buf.data(), buf.size());
   TestCompletionCallback read_callback;
   ASSERT_EQ(ERR_IO_PENDING,
             reader_->Read(
@@ -151,7 +151,7 @@
   const size_t kTooLargeSize = bytes_.size() * 2;
   std::vector<char> buf(kTooLargeSize);
   scoped_refptr<IOBuffer> wrapped_buffer =
-      base::MakeRefCounted<WrappedIOBuffer>(&buf[0]);
+      base::MakeRefCounted<WrappedIOBuffer>(buf.data(), buf.size());
   TestCompletionCallback read_callback;
   ASSERT_EQ(ERR_IO_PENDING,
             reader_->Read(
@@ -165,7 +165,7 @@
 TEST_P(UploadFileElementReaderTest, MultipleInit) {
   std::vector<char> buf(bytes_.size());
   scoped_refptr<IOBuffer> wrapped_buffer =
-      base::MakeRefCounted<WrappedIOBuffer>(&buf[0]);
+      base::MakeRefCounted<WrappedIOBuffer>(buf.data(), buf.size());
 
   // Read all.
   TestCompletionCallback read_callback1;
@@ -196,7 +196,7 @@
 TEST_P(UploadFileElementReaderTest, InitDuringAsyncOperation) {
   std::vector<char> buf(bytes_.size());
   scoped_refptr<IOBuffer> wrapped_buffer =
-      base::MakeRefCounted<WrappedIOBuffer>(&buf[0]);
+      base::MakeRefCounted<WrappedIOBuffer>(buf.data(), buf.size());
 
   // Start reading all.
   TestCompletionCallback read_callback1;
@@ -220,7 +220,7 @@
   // Read half.
   std::vector<char> buf2(bytes_.size() / 2);
   scoped_refptr<IOBuffer> wrapped_buffer2 =
-      base::MakeRefCounted<WrappedIOBuffer>(&buf2[0]);
+      base::MakeRefCounted<WrappedIOBuffer>(buf2.data(), buf2.size());
   TestCompletionCallback read_callback2;
   EXPECT_EQ(ERR_IO_PENDING,
             reader_->Read(
@@ -238,7 +238,7 @@
 TEST_P(UploadFileElementReaderTest, RepeatedInitDuringInit) {
   std::vector<char> buf(bytes_.size());
   scoped_refptr<IOBuffer> wrapped_buffer =
-      base::MakeRefCounted<WrappedIOBuffer>(&buf[0]);
+      base::MakeRefCounted<WrappedIOBuffer>(buf.data(), buf.size());
 
   TestCompletionCallback init_callback1;
   EXPECT_THAT(reader_->Init(init_callback1.callback()),
@@ -281,7 +281,7 @@
   EXPECT_EQ(kLength, reader_->BytesRemaining());
   std::vector<char> buf(kLength);
   scoped_refptr<IOBuffer> wrapped_buffer =
-      base::MakeRefCounted<WrappedIOBuffer>(&buf[0]);
+      base::MakeRefCounted<WrappedIOBuffer>(buf.data(), buf.size());
   TestCompletionCallback read_callback;
   ASSERT_EQ(
       ERR_IO_PENDING,
diff --git a/net/disk_cache/blockfile/sparse_control.cc b/net/disk_cache/blockfile/sparse_control.cc
index be523ccc..5c8a52d 100644
--- a/net/disk_cache/blockfile/sparse_control.cc
+++ b/net/disk_cache/blockfile/sparse_control.cc
@@ -412,7 +412,7 @@
 
   // Save the header. The bitmap is saved in the destructor.
   scoped_refptr<net::IOBuffer> buf = base::MakeRefCounted<net::WrappedIOBuffer>(
-      reinterpret_cast<char*>(&sparse_header_));
+      reinterpret_cast<char*>(&sparse_header_), sizeof(sparse_header_));
 
   int rv = entry_->WriteData(kSparseIndex, 0, buf.get(), sizeof(sparse_header_),
                              CompletionOnceCallback(), false);
@@ -442,7 +442,7 @@
     return net::ERR_CACHE_OPERATION_NOT_SUPPORTED;
 
   scoped_refptr<net::IOBuffer> buf = base::MakeRefCounted<net::WrappedIOBuffer>(
-      reinterpret_cast<char*>(&sparse_header_));
+      reinterpret_cast<char*>(&sparse_header_), sizeof(sparse_header_));
 
   // Read header.
   int rv = entry_->ReadData(kSparseIndex, 0, buf.get(), sizeof(sparse_header_),
@@ -498,7 +498,7 @@
 
   scoped_refptr<net::WrappedIOBuffer> buf =
       base::MakeRefCounted<net::WrappedIOBuffer>(
-          reinterpret_cast<char*>(&child_data_));
+          reinterpret_cast<char*>(&child_data_), sizeof(child_data_));
 
   // Read signature.
   int rv = child_->ReadData(kSparseIndex, 0, buf.get(), sizeof(child_data_),
@@ -523,7 +523,7 @@
 void SparseControl::CloseChild() {
   scoped_refptr<net::WrappedIOBuffer> buf =
       base::MakeRefCounted<net::WrappedIOBuffer>(
-          reinterpret_cast<char*>(&child_data_));
+          reinterpret_cast<char*>(&child_data_), sizeof(child_data_));
 
   // Save the allocation bitmap before closing the child entry.
   int rv = child_->WriteData(kSparseIndex, 0, buf.get(), sizeof(child_data_),
@@ -590,10 +590,10 @@
 }
 
 void SparseControl::WriteSparseData() {
-  scoped_refptr<net::IOBuffer> buf = base::MakeRefCounted<net::WrappedIOBuffer>(
-      reinterpret_cast<const char*>(children_map_.GetMap()));
-
   int len = children_map_.ArraySize() * 4;
+  scoped_refptr<net::IOBuffer> buf = base::MakeRefCounted<net::WrappedIOBuffer>(
+      reinterpret_cast<const char*>(children_map_.GetMap()), len);
+
   int rv = entry_->WriteData(kSparseIndex, sizeof(sparse_header_), buf.get(),
                              len, CompletionOnceCallback(), false);
   if (rv != len) {
@@ -690,7 +690,7 @@
 
   scoped_refptr<net::WrappedIOBuffer> buf =
       base::MakeRefCounted<net::WrappedIOBuffer>(
-          reinterpret_cast<char*>(&child_data_));
+          reinterpret_cast<char*>(&child_data_), sizeof(child_data_));
 
   int rv = child_->WriteData(kSparseIndex, 0, buf.get(), sizeof(child_data_),
                              CompletionOnceCallback(), false);
diff --git a/net/disk_cache/entry_unittest.cc b/net/disk_cache/entry_unittest.cc
index ec0e659..9a0618d8 100644
--- a/net/disk_cache/entry_unittest.cc
+++ b/net/disk_cache/entry_unittest.cc
@@ -2089,7 +2089,8 @@
   // This loop writes back to back starting from offset 0 and 9000.
   for (int i = 0; i < kSize; i += 1024) {
     scoped_refptr<net::WrappedIOBuffer> buf_3 =
-        base::MakeRefCounted<net::WrappedIOBuffer>(buf_1->data() + i);
+        base::MakeRefCounted<net::WrappedIOBuffer>(buf_1->data() + i,
+                                                   kSize - i);
     VerifySparseIO(entry, i, buf_3.get(), 1024, buf_2.get());
     VerifySparseIO(entry, 9000 + i, buf_3.get(), 1024, buf_2.get());
   }
diff --git a/net/filter/gzip_source_stream.cc b/net/filter/gzip_source_stream.cc
index 8bd5c8e..82e6f2a 100644
--- a/net/filter/gzip_source_stream.cc
+++ b/net/filter/gzip_source_stream.cc
@@ -191,7 +191,8 @@
         input_state_ = replay_state_;
         size_t bytes_used;
         scoped_refptr<IOBuffer> replay_buffer =
-            base::MakeRefCounted<WrappedIOBuffer>(replay_data_.data());
+            base::MakeRefCounted<WrappedIOBuffer>(replay_data_.data(),
+                                                  replay_data_.size());
         base::expected<size_t, Error> result =
             FilterData(output_buffer, output_buffer_size, replay_buffer.get(),
                        replay_data_.size(), &bytes_used, upstream_end_reached);
diff --git a/net/http/mock_http_cache.cc b/net/http/mock_http_cache.cc
index ddaf9b45..99d61819 100644
--- a/net/http/mock_http_cache.cc
+++ b/net/http/mock_http_cache.cc
@@ -716,9 +716,9 @@
       &pickle, skip_transient_headers, response_truncated);
 
   TestCompletionCallback cb;
-  scoped_refptr<WrappedIOBuffer> data = base::MakeRefCounted<WrappedIOBuffer>(
-      reinterpret_cast<const char*>(pickle.data()));
   int len = static_cast<int>(pickle.size());
+  scoped_refptr<WrappedIOBuffer> data = base::MakeRefCounted<WrappedIOBuffer>(
+      reinterpret_cast<const char*>(pickle.data()), len);
 
   int rv = disk_entry->WriteData(0, 0, data.get(), len, cb.callback(), true);
   rv = cb.GetResult(rv);
diff --git a/net/websockets/websocket_channel.cc b/net/websockets/websocket_channel.cc
index 60c70f3..e60d0e9 100644
--- a/net/websockets/websocket_channel.cc
+++ b/net/websockets/websocket_channel.cc
@@ -140,12 +140,13 @@
 
 class DependentIOBuffer : public WrappedIOBuffer {
  public:
-  DependentIOBuffer(scoped_refptr<IOBuffer> buffer, size_t offset)
-      : WrappedIOBuffer(buffer->data() + offset), buffer_(std::move(buffer)) {}
+  DependentIOBuffer(scoped_refptr<IOBufferWithSize> buffer, size_t offset)
+      : WrappedIOBuffer(buffer->data() + offset, buffer->size() - offset),
+        buffer_(std::move(buffer)) {}
 
  private:
   ~DependentIOBuffer() override = default;
-  scoped_refptr<IOBuffer> buffer_;
+  scoped_refptr<IOBufferWithSize> buffer_;
 };
 
 }  // namespace
diff --git a/remoting/base/compound_buffer_unittest.cc b/remoting/base/compound_buffer_unittest.cc
index 8e0da56..843c15c 100644
--- a/remoting/base/compound_buffer_unittest.cc
+++ b/remoting/base/compound_buffer_unittest.cc
@@ -173,7 +173,8 @@
     const char* data = kTestData.data();
     for (int i = 0; i < segments; ++i) {
       int size = i % 2 == 0 ? 1 : 2;
-      result->Append(base::MakeRefCounted<net::WrappedIOBuffer>(data), size);
+      result->Append(base::MakeRefCounted<net::WrappedIOBuffer>(data, size),
+                     size);
       data += size;
     }
     result->Lock();
diff --git a/remoting/host/security_key/security_key_auth_handler_posix_unittest.cc b/remoting/host/security_key/security_key_auth_handler_posix_unittest.cc
index e34c319..c8c5f929 100644
--- a/remoting/host/security_key/security_key_auth_handler_posix_unittest.cc
+++ b/remoting/host/security_key/security_key_auth_handler_posix_unittest.cc
@@ -127,7 +127,7 @@
     scoped_refptr<net::DrainableIOBuffer> request_buffer =
         base::MakeRefCounted<net::DrainableIOBuffer>(
             base::MakeRefCounted<net::WrappedIOBuffer>(
-                reinterpret_cast<const char*>(kRequestData)),
+                reinterpret_cast<const char*>(kRequestData), request_len),
             request_len);
     net::TestCompletionCallback write_callback;
     int bytes_written = 0;
diff --git a/services/network/public/cpp/net_adapters.cc b/services/network/public/cpp/net_adapters.cc
index a1f8d98..45c58d1 100644
--- a/services/network/public/cpp/net_adapters.cc
+++ b/services/network/public/cpp/net_adapters.cc
@@ -54,7 +54,8 @@
 
 NetToMojoIOBuffer::NetToMojoIOBuffer(NetToMojoPendingBuffer* pending_buffer,
                                      int offset)
-    : net::WrappedIOBuffer(pending_buffer->buffer() + offset),
+    : net::WrappedIOBuffer(pending_buffer->buffer() + offset,
+                           pending_buffer->size() - offset),
       pending_buffer_(pending_buffer) {}
 
 NetToMojoIOBuffer::~NetToMojoIOBuffer() {}
@@ -102,7 +103,7 @@
 
 MojoToNetIOBuffer::MojoToNetIOBuffer(MojoToNetPendingBuffer* pending_buffer,
                                      int bytes_to_be_read)
-    : net::WrappedIOBuffer(pending_buffer->buffer()),
+    : net::WrappedIOBuffer(pending_buffer->buffer(), pending_buffer->size()),
       pending_buffer_(pending_buffer),
       bytes_to_be_read_(bytes_to_be_read) {}
 
diff --git a/services/network/socket_data_pump.cc b/services/network/socket_data_pump.cc
index fc6b9fb7..903764a1 100644
--- a/services/network/socket_data_pump.cc
+++ b/services/network/socket_data_pump.cc
@@ -169,7 +169,8 @@
   }
   const int num_bytes = static_cast<int>(pending_send_buffer_->size());
   scoped_refptr<net::IOBuffer> buf = base::MakeRefCounted<net::WrappedIOBuffer>(
-      pending_send_buffer_->buffer());
+      pending_send_buffer_->buffer(), num_bytes);
+
   // Use WeakPtr here because |this| doesn't outlive |socket_|.
   int write_result =
       socket_->Write(buf.get(), num_bytes,