]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
Pipe: Fix potential return code overflow
authorHaomai Wang <haomai@xsky.com>
Sat, 5 Dec 2015 10:40:56 +0000 (18:40 +0800)
committerHaomai Wang <haomai@xsky.com>
Sat, 5 Dec 2015 16:34:40 +0000 (00:34 +0800)
Signed-off-by: Haomai Wang <haomai@xsky.com>
src/msg/simple/Pipe.cc
src/msg/simple/Pipe.h

index a717c40169a0e31de4045488aabb958e2a2eaed1..6cd072451a0b42038abd57f165f869fa20338639 100644 (file)
@@ -2029,7 +2029,7 @@ int Pipe::read_message(Message **pm, AuthSessionHandler* auth_handler)
       bufferptr bp = blp.get_current_ptr();
       int read = MIN(bp.length(), left);
       ldout(msgr->cct,20) << "reader reading nonblocking into " << (void*)bp.c_str() << " len " << bp.length() << dendl;
-      int got = tcp_read_nonblocking(bp.c_str(), read);
+      ssize_t got = tcp_read_nonblocking(bp.c_str(), read);
       ldout(msgr->cct,30) << "reader read " << got << " of " << read << dendl;
       connection_state->lock.Unlock();
       if (got < 0)
@@ -2188,12 +2188,12 @@ void Pipe::restore_sigpipe()
 }
 
 
-int Pipe::do_sendmsg(struct msghdr *msg, int len, bool more)
+int Pipe::do_sendmsg(struct msghdr *msg, unsigned len, bool more)
 {
   suppress_sigpipe();
   while (len > 0) {
     if (0) { // sanity
-      int l = 0;
+      unsigned l = 0;
       for (unsigned i=0; i<msg->msg_iovlen; i++)
        l += msg->msg_iov[i].iov_len;
       assert(l == len);
@@ -2384,13 +2384,13 @@ int Pipe::write_message(const ceph_msg_header& header, const ceph_msg_footer& fo
     msglen += donow;
     msg.msg_iovlen++;
     
+    assert(left >= donow);
     left -= donow;
-    assert(left >= 0);
     b_off += donow;
     bl_pos += donow;
     if (left == 0)
       break;
-    while (b_off == (int)pb->length()) {
+    while (b_off == pb->length()) {
       ++pb;
       b_off = 0;
     }
@@ -2435,7 +2435,7 @@ int Pipe::write_message(const ceph_msg_header& header, const ceph_msg_footer& fo
 }
 
 
-int Pipe::tcp_read(char *buf, int len)
+int Pipe::tcp_read(char *buf, unsigned len)
 {
   if (sd < 0)
     return -1;
@@ -2452,7 +2452,7 @@ int Pipe::tcp_read(char *buf, int len)
     if (tcp_read_wait() < 0)
       return -1;
 
-    int got = tcp_read_nonblocking(buf, len);
+    ssize_t got = tcp_read_nonblocking(buf, len);
 
     if (got < 0)
       return -1;
@@ -2461,7 +2461,7 @@ int Pipe::tcp_read(char *buf, int len)
     buf += got;
     //lgeneric_dout(cct, DBL) << "tcp_read got " << got << ", " << len << " left" << dendl;
   }
-  return len;
+  return 0;
 }
 
 int Pipe::tcp_read_wait()
@@ -2495,10 +2495,10 @@ int Pipe::tcp_read_wait()
   return 0;
 }
 
-int Pipe::do_recv(char *buf, size_t len, int flags)
+ssize_t Pipe::do_recv(char *buf, size_t len, int flags)
 {
 again:
-  int got = ::recv( sd, buf, len, flags );
+  ssize_t got = ::recv( sd, buf, len, flags );
   if (got < 0) {
     if (errno == EAGAIN || errno == EINTR) {
       goto again;
@@ -2513,10 +2513,10 @@ again:
   return got;
 }
 
-int Pipe::buffered_recv(char *buf, size_t len, int flags)
+ssize_t Pipe::buffered_recv(char *buf, size_t len, int flags)
 {
-  int left = len;
-  int total_recv = 0;
+  size_t left = len;
+  ssize_t total_recv = 0;
   if (recv_len > recv_ofs) {
     int to_read = MIN(recv_len - recv_ofs, left);
     memcpy(buf, &recv_buf[recv_ofs], to_read);
@@ -2533,7 +2533,7 @@ int Pipe::buffered_recv(char *buf, size_t len, int flags)
 
   if (len > (size_t)recv_max_prefetch) {
     /* this was a large read, we don't prefetch for these */
-    int ret = do_recv(buf, left, flags );
+    ssize_t ret = do_recv(buf, left, flags );
     if (ret < 0) {
       if (total_recv > 0)
         return total_recv;
@@ -2544,7 +2544,7 @@ int Pipe::buffered_recv(char *buf, size_t len, int flags)
   }
 
 
-  int got = do_recv(recv_buf, recv_max_prefetch, flags);
+  ssize_t got = do_recv(recv_buf, recv_max_prefetch, flags);
   if (got <= 0) {
     if (total_recv > 0)
       return total_recv;
@@ -2552,17 +2552,17 @@ int Pipe::buffered_recv(char *buf, size_t len, int flags)
     return got;
   }
 
-  recv_len = got;
-  got = MIN(left, got);
+  recv_len = (size_t)got;
+  got = MIN(left, (size_t)got);
   memcpy(buf, recv_buf, got);
   recv_ofs = got;
   total_recv += got;
   return total_recv;
 }
 
-int Pipe::tcp_read_nonblocking(char *buf, int len)
+ssize_t Pipe::tcp_read_nonblocking(char *buf, unsigned len)
 {
-  int got = buffered_recv(buf, len, MSG_DONTWAIT );
+  ssize_t got = buffered_recv(buf, len, MSG_DONTWAIT );
   if (got < 0) {
     ldout(msgr->cct, 10) << __func__ << " socket " << sd << " returned "
                         << got << " " << cpp_strerror(errno) << dendl;
@@ -2578,7 +2578,7 @@ int Pipe::tcp_read_nonblocking(char *buf, int len)
   return got;
 }
 
-int Pipe::tcp_write(const char *buf, int len)
+int Pipe::tcp_write(const char *buf, unsigned len)
 {
   if (sd < 0)
     return -1;
index ce24a2a1ae75aba0e0e44c98154b8b76fc179118..21b65a3f0ef23844a2495abafe10e38001d00ad3 100644 (file)
@@ -146,9 +146,9 @@ class DispatchQueue;
     }
 
     char *recv_buf;
-    int recv_max_prefetch;
-    int recv_ofs;
-    int recv_len;
+    size_t recv_max_prefetch;
+    size_t recv_ofs;
+    size_t recv_len;
 
     enum {
       STATE_ACCEPTING,
@@ -247,7 +247,7 @@ class DispatchQueue;
      * @param more Should be set true if this is one part of a larger message
      * @return 0, or -1 on failure (unrecoverable -- close the socket).
      */
-    int do_sendmsg(struct msghdr *msg, int len, bool more=false);
+    int do_sendmsg(struct msghdr *msg, unsigned len, bool more=false);
     int write_ack(uint64_t s);
     int write_keepalive();
     int write_keepalive2(char tag, const utime_t &t);
@@ -342,8 +342,8 @@ class DispatchQueue;
       recv_len = 0;
       recv_ofs = 0;
     }
-    int do_recv(char *buf, size_t len, int flags);
-    int buffered_recv(char *buf, size_t len, int flags);
+    ssize_t do_recv(char *buf, size_t len, int flags);
+    ssize_t buffered_recv(char *buf, size_t len, int flags);
     bool has_pending_data() { return recv_len > recv_ofs; }
 
     /**
@@ -353,7 +353,7 @@ class DispatchQueue;
      * @param len exact number of bytes to read
      * @return 0 for success, or -1 on error
      */
-    int tcp_read(char *buf, int len);
+    int tcp_read(char *buf, unsigned len);
 
     /**
      * wait for bytes to become available on the socket
@@ -372,7 +372,7 @@ class DispatchQueue;
      * @param len maximum number of bytes to read
      * @return bytes read, or -1 on error or when there is no data
      */
-    int tcp_read_nonblocking(char *buf, int len);
+    ssize_t tcp_read_nonblocking(char *buf, unsigned len);
 
     /**
      * blocking write of bytes to socket
@@ -381,7 +381,7 @@ class DispatchQueue;
      * @param len number of bytes to write
      * @return 0 for success, or -1 on error
      */
-    int tcp_write(const char *buf, int len);
+    int tcp_write(const char *buf, unsigned len);
 
   };