JSch's Channels$MyPipedInputStream#read() does not return -1 when EOF is reached. This causes the reading thread to block and never to resume. This happens only when more bytes are requested to be read than available from the stream. It does not read at most bytes. So one has to know the last less-than-the-buffer-length chunk and recalculate remaining bytes. This worked conincidentially because it worked that way.
This is brittle, as long as the upstream bug is not fixed we will restore the previous AbstractWagon#transfer() implementation in AbstractJschWagon.