crimson/net: check short reads in `read_exactly()`
authorYingxin <yingxin.cheng@intel.com>
Wed, 24 Oct 2018 14:49:30 +0000 (22:49 +0800)
committerYingxin <yingxin.cheng@intel.com>
Tue, 20 Nov 2018 12:58:34 +0000 (20:58 +0800)
Signed-off-by: Yingxin <yingxin.cheng@intel.com>
src/crimson/net/Socket.cc
src/crimson/net/Socket.h

index 3c12c61d8cde9e2a61bc8b66f33fe47556dbdce2..a22e9b2eac66fdf0cf441b70bf5a891a82a71c9d 100644 (file)
@@ -67,4 +67,15 @@ seastar::future<bufferlist> Socket::read(size_t bytes)
     });
 }
 
+seastar::future<seastar::temporary_buffer<char>>
+Socket::read_exactly(size_t bytes) {
+  return in.read_exactly(bytes)
+    .then([this](auto buf) {
+      if (buf.empty()) {
+        throw std::system_error(make_error_code(error::read_eof));
+      }
+      return seastar::make_ready_future<tmp_buf>(std::move(buf));
+    });
+}
+
 } // namespace ceph::net
index 07ab18954d1a3def0b2cef91f67a99a11938b273..3c0411355088e40eaacaef849ce3c60daefdb3a2 100644 (file)
@@ -33,9 +33,7 @@ class Socket
   seastar::future<bufferlist> read(size_t bytes);
   using tmp_buf = seastar::temporary_buffer<char>;
   using packet = seastar::net::packet;
-  seastar::future<tmp_buf> read_exactly(size_t bytes) {
-    return in.read_exactly(bytes);
-  }
+  seastar::future<tmp_buf> read_exactly(size_t bytes);
 
   seastar::future<> write(packet&& buf) {
     return out.write(std::move(buf));