X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=daemon%2Ftransfer.c;h=32f3e2814cccf98c8171674c59315e1049c00ac9;hb=b38037ff5b7c2779469cffed81da6774114807ef;hp=ee5f673b3f3ffad5acc028f290566083798f7ed7;hpb=6bd790e0e2fff47c3bae8713060e037ec5fa58e5;p=doldaconnect.git diff --git a/daemon/transfer.c b/daemon/transfer.c index ee5f673..32f3e28 100644 --- a/daemon/transfer.c +++ b/daemon/transfer.c @@ -133,6 +133,8 @@ static void localread(struct socket *sk, struct transfer *transfer) if((transfer->datapipe != NULL) && (sockqueueleft(transfer->datapipe) > 0)) { buf = sockgetinbuf(sk, &blen); + if((transfer->endpos >= 0) && (transfer->curpos + blen > transfer->endpos)) + blen = transfer->endpos - transfer->curpos; sockqueue(transfer->datapipe, buf, blen); free(buf); time(&transfer->activity); @@ -149,6 +151,8 @@ static void dataread(struct socket *sk, struct transfer *transfer) if((transfer->localend != NULL) && (sockqueueleft(transfer->localend) > 0)) { buf = sockgetinbuf(sk, &blen); + if((transfer->endpos >= 0) && (transfer->curpos + blen > transfer->endpos)) + blen = transfer->endpos - transfer->curpos; sockqueue(transfer->localend, buf, blen); free(buf); transfer->curpos += blen; @@ -179,11 +183,16 @@ static void dataerr(struct socket *sk, int errno, struct transfer *transfer) { if(transfer->curpos >= transfer->size) { transfersetstate(transfer, TRNS_DONE); - closesock(transfer->localend); - quitsock(transfer->localend); - transfer->localend = NULL; + if(transfer->localend != NULL) { + closesock(transfer->localend); + quitsock(transfer->localend); + transfer->localend = NULL; + } } else { - resettransfer(transfer); + if(transfer->dir == TRNSD_DOWN) + resettransfer(transfer); + else if(transfer->dir == TRNSD_UP) + transfer->close = 1; } }