Alexander Lamaison wrote:
> The changes are more extensive that I'd planned so I'd appreciate some
> careful review.  Basically, the total_read variable turned out to be
> completely pointless.

Yes. What about the loop? It's kept for the chunk stuff, so that
libssh2_sftp_read() never returns 0 bytes to the caller unless EOF?

I think it would be nice to return EAGAIN if we read 0 bytes from
transport.


> @@ -1348,13 +1334,13 @@ static ssize_t sftp_read(LIBSSH2_SFTP_HANDLE * 
> handle, char *buffer,
>                      filep->offset_sent -= (chunk->len - rc32);
>                  }
>  
> -                if(total_read + rc32 > buffer_size) {
> +                if(rc32 > buffer_size) {
>                      /* figure out the overlap amount */
> -                    filep->data_left = (total_read + rc32) - buffer_size;
> +                    filep->data_left = rc32 - buffer_size;

Doesn't this lose the bytes that we received from transport but which
do not fit into the buffer given to us by the user?


> +                /* remove the chunk we just processed keeping track of the
> +                 * next one in case we need it */
> +                next = _libssh2_list_next(&chunk->node);
> +                _libssh2_list_remove(&chunk->node);
> +                LIBSSH2_FREE(session, chunk);
> +                chunk = NULL;
> +
> +                if(rc32 > 0) {
> +                    /* we must return as we wrote some data to the buffer */
> +                    return rc32;
> +                } else {
> +                    /* A zero-byte read is not necessarily EOF so we must not
> +                     * return 0 (that would signal EOF to the caller) so
> +                     * instead we carry on to the next chunk */
> +                    chunk = next;
>                  }

Here I suggest return EAGAIN instead of having the loop and chunk
messyness.


//Peter
_______________________________________________
libssh2-devel http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel

Reply via email to