diff --git a/include/libssh/sftp.h b/include/libssh/sftp.h index ffa315c3..dc1ad4de 100644 --- a/include/libssh/sftp.h +++ b/include/libssh/sftp.h @@ -489,6 +489,11 @@ LIBSSH_API void sftp_file_set_blocking(sftp_file handle); /** * @brief Read from a file using an opened sftp file handle. * + * This function caps the length a user is allowed to read from an sftp file. + * + * The value used for the cap is same as the value of the max_read_length + * field of the sftp_limits_t returned by sftp_limits(). + * * @param file The opened sftp file handle to be read from. * * @param buf Pointer to buffer to receive read data. @@ -567,9 +572,10 @@ SSH_DEPRECATED LIBSSH_API int sftp_async_read(sftp_file file, /** * @brief Write to a file using an opened sftp file handle. * - * The maximum size of the SFTP packet payload is 32768 bytes so the count - * parameter is capped at this value. This is low-level function so it does not - * try to send more than this amount of data. + * This function caps the length a user is allowed to write to an sftp file. + * + * The value used for the cap is same as the value of the max_write_length + * field of the sftp_limits_t returned by sftp_limits(). * * @param file Open sftp file handle to write to. * diff --git a/src/sftp.c b/src/sftp.c index 29341d55..2bfe04e4 100644 --- a/src/sftp.c +++ b/src/sftp.c @@ -1156,6 +1156,18 @@ ssize_t sftp_read(sftp_file handle, void *buf, size_t count) { return 0; } + /* + * limit the reads to the maximum specified in Section 3 of + * https://datatracker.ietf.org/doc/html/draft-ietf-secsh-filexfer-02 + * or to the values provided by the limits@openssh.com extension. + * + * TODO: We should iterate over the blocks rather than writing less than + * requested to provide less surprises to the calling applications. + */ + if (count > sftp->limits->max_read_length) { + count = sftp->limits->max_read_length; + } + buffer = ssh_buffer_new(); if (buffer == NULL) { ssh_set_error_oom(sftp->session); @@ -1396,16 +1408,17 @@ ssize_t sftp_write(sftp_file file, const void *buf, size_t count) { id = sftp_get_new_id(file->sftp); - - /* limit the writes to the maximum specified in Section 3 of + /* + * limit the writes to the maximum specified in Section 3 of * https://datatracker.ietf.org/doc/html/draft-ietf-secsh-filexfer-02 + * or to the values provided by the limits@openssh.com extension. * - * FIXME: This value should be adjusted to the value from the - * limits@openssh.com extension if supported * TODO: We should iterate over the blocks rather than writing less than * requested to provide less surprises to the calling applications. */ - count = count > 32768 ? 32768 : count; + if (count > sftp->limits->max_write_length) { + count = sftp->limits->max_write_length; + } rc = ssh_buffer_pack(buffer, "dSqdP",