From: Haomai Wang Date: Sat, 5 Dec 2015 10:40:56 +0000 (+0800) Subject: Pipe: Fix potential return code overflow X-Git-Tag: v10.0.3~30^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=3443b6d159fe4e804b46ce75f9f7168bae3a958e;p=ceph.git Pipe: Fix potential return code overflow Signed-off-by: Haomai Wang --- diff --git a/src/msg/simple/Pipe.cc b/src/msg/simple/Pipe.cc index a717c40169a0..6cd072451a0b 100644 --- a/src/msg/simple/Pipe.cc +++ b/src/msg/simple/Pipe.cc @@ -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; imsg_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; diff --git a/src/msg/simple/Pipe.h b/src/msg/simple/Pipe.h index ce24a2a1ae75..21b65a3f0ef2 100644 --- a/src/msg/simple/Pipe.h +++ b/src/msg/simple/Pipe.h @@ -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); };