From 188a9cf68f905e71d17f95eb002f31fe85ed7600 Mon Sep 17 00:00:00 2001 From: Eshan Kelkar Date: Thu, 7 Dec 2023 10:44:58 +0530 Subject: [PATCH] sftp_aio.c, sftp.h: Add capping to sftp aio write API Signed-off-by: Eshan Kelkar Reviewed-by: Jakub Jelen --- include/libssh/sftp.h | 28 ++++++++++++++++------------ src/sftp_aio.c | 15 ++++++++++----- 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/include/libssh/sftp.h b/include/libssh/sftp.h index 78c0e743..ffa315c3 100644 --- a/include/libssh/sftp.h +++ b/include/libssh/sftp.h @@ -738,6 +738,12 @@ LIBSSH_API ssize_t sftp_aio_wait_read(sftp_aio *aio, * calling sftp_close() or to keep it open and perform some more operations * on it. * + * This function caps the length a user is allowed to write to an sftp file, + * the value of len parameter after capping is returned on success. + * + * 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 The opened sftp file handle to write to. * * @param buf Pointer to the buffer containing data to write. @@ -747,11 +753,14 @@ LIBSSH_API ssize_t sftp_aio_wait_read(sftp_aio *aio, * @param aio Pointer to a location where the sftp aio handle * (corresponding to the sent request) should be stored. * - * @returns SSH_OK on success, SSH_ERROR with sftp and ssh errors + * @returns On success, the number of bytes the server is + * requested to write (value of len parameter after + * capping). On error, SSH_ERROR with sftp and ssh errors * set. * - * @warning When calling this function, the internal offset is - * updated corresponding to the len parameter. + * @warning When calling this function, the internal file offset is + * updated corresponding to the number of bytes requested + * to write. * * @warning A call to sftp_aio_begin_write() sends a request to * the server. When the server answers, libssh allocates @@ -766,10 +775,10 @@ LIBSSH_API ssize_t sftp_aio_wait_read(sftp_aio *aio, * @see sftp_get_error() * @see ssh_get_error() */ -LIBSSH_API int sftp_aio_begin_write(sftp_file file, - const void *buf, - size_t len, - sftp_aio *aio); +LIBSSH_API ssize_t sftp_aio_begin_write(sftp_file file, + const void *buf, + size_t len, + sftp_aio *aio); /** * @brief Wait for an asynchronous write to complete. @@ -784,11 +793,6 @@ LIBSSH_API int sftp_aio_begin_write(sftp_file file, * been executed yet, this function returns SSH_AGAIN and must be called * again using the same sftp aio handle. * - * On success, this function returns the number of bytes written. - * The SFTP protocol doesn't support partial writes to remote files, - * hence on success this returned value will always be equal to the - * len passed in the previous corresponding call to sftp_aio_begin_write(). - * * @param aio Pointer to the sftp aio handle returned by * sftp_aio_begin_write(). * diff --git a/src/sftp_aio.c b/src/sftp_aio.c index 243d17c1..c1c54561 100644 --- a/src/sftp_aio.c +++ b/src/sftp_aio.c @@ -307,10 +307,10 @@ ssize_t sftp_aio_wait_read(sftp_aio *aio, return SSH_ERROR; /* not reached */ } -int sftp_aio_begin_write(sftp_file file, - const void *buf, - size_t len, - sftp_aio *aio) +ssize_t sftp_aio_begin_write(sftp_file file, + const void *buf, + size_t len, + sftp_aio *aio) { sftp_session sftp = NULL; ssh_buffer buffer = NULL; @@ -341,6 +341,11 @@ int sftp_aio_begin_write(sftp_file file, return SSH_ERROR; } + /* Apply a cap on the length a user is allowed to write */ + if (len > sftp->limits->max_write_length) { + len = sftp->limits->max_write_length; + } + if (aio == NULL) { ssh_set_error(sftp->session, SSH_FATAL, "Invalid argument, NULL passed instead of a pointer to " @@ -394,7 +399,7 @@ int sftp_aio_begin_write(sftp_file file, /* Assume we wrote len bytes to the file */ file->offset += len; *aio = aio_handle; - return SSH_OK; + return len; } ssize_t sftp_aio_wait_write(sftp_aio *aio)