diff --git a/src/xpdev/sockwrap.c b/src/xpdev/sockwrap.c index a31d1e512918262bf61853f8963e6e81e028dfc0..31e2949bfd804f9b4eb405f09b1670b4455a4fa6 100644 --- a/src/xpdev/sockwrap.c +++ b/src/xpdev/sockwrap.c @@ -188,17 +188,20 @@ off_t sendfilesocket(int sock, int file, off_t *offset, off_t count) } while(total<count) { - rd=read(file,buf,sizeof(buf)); - if(rd==-1) + rd = read(file, buf, sizeof(buf)); + if (rd < 0) return(-1); - if(rd==0) + if (rd == 0) break; - for(i=wr=0;i<rd;i+=wr) { - wr=sendsocket(sock,buf+i,rd-i); - if(wr>0) + for (i = wr = 0; i < rd; i += wr) { + wr = sendsocket(sock,buf+i,rd-i); + if (wr > 0) { + if ((SSIZE_MAX - i) < wr) + wr = SSIZE_MAX - i; continue; - if(wr==SOCKET_ERROR && SOCKET_ERRNO==EWOULDBLOCK) { - wr=0; + } + if (wr == SOCKET_ERROR && SOCKET_ERRNO == EWOULDBLOCK) { + wr = 0; SLEEP(1); continue; }