]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
AsyncMessenger: Fix large bufferlist send segment fault 2895/head
authorHaomai Wang <haomaiwang@gmail.com>
Tue, 11 Nov 2014 15:54:17 +0000 (23:54 +0800)
committerHaomai Wang <haomaiwang@gmail.com>
Tue, 11 Nov 2014 16:10:48 +0000 (00:10 +0800)
If send long bufferlist exceed IOV_LEN(1024), try_send will stuck in looping
send the first IOV_LEN(1024) ptrs and raise segment fault.

Signed-off-by: Haomai Wang <haomaiwang@gmail.com>
src/msg/async/AsyncConnection.cc

index e1c82fc8d9355018f4861c50893ee0b14318ff09..7bd4341b894bfff728943ad97126f92abfba8d01 100644 (file)
@@ -237,9 +237,11 @@ int AsyncConnection::_try_send(bufferlist send_bl, bool send)
   int r = 0;
   uint64_t sended = 0;
   list<bufferptr>::const_iterator pb = outcoming_bl.buffers().begin();
-  while (outcoming_bl.length() > sended) {
+  uint64_t left_pbrs = outcoming_bl.buffers().size();
+  while (left_pbrs) {
     struct msghdr msg;
-    int size = MIN(outcoming_bl.buffers().size(), IOV_LEN);
+    uint64_t size = MIN(left_pbrs, IOV_LEN);
+    left_pbrs -= size;
     memset(&msg, 0, sizeof(msg));
     msg.msg_iovlen = 0;
     msg.msg_iov = msgvec;