[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Bugfix patches + SFTP append support
[Thread Prev] | [Thread Next]
[Date Prev] | [Date Next]
- Subject: Bugfix patches + SFTP append support
- From: Tilo Eckert <tilo.eckert@xxxxxxx>
- Reply-to: libssh@xxxxxxxxxx
- Date: Fri, 01 Jul 2016 16:13:40 +0200
- To: libssh@xxxxxxxxxx
Hi, I attached some patches: - The SSH_FXF_READ flag was always set when opening a file via SFTP - I added support for opening files in append mode. Due to bad protocol design I had to query the file size through the stat() function to get the EOF offset, which makes opening a file in append mode non-atomic. - The current master was not compilable on Windows since November. Regards Tilo
From d47a6b435a37bc811a77651891b768c41ee1afb4 Mon Sep 17 00:00:00 2001 From: Tilo Eckert <tilo.eckert@xxxxxxx> Date: Thu, 30 Jun 2016 12:27:43 +0200 Subject: [PATCH 1/3] bug fix: SFTP flag SSH_FXF_READ was always set (even on O_WRONLY) because O_RDONLY == 0 Comparison ((flags & O_RDONLY) == O_RDONLY) is always true. Also, O_RDWR, O_WRONLY and O_RDONLY are mutually exclusive => no need to check all of them Signed-off-by: Tilo Eckert <tilo.eckert@xxxxxxx> --- src/sftp.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/sftp.c b/src/sftp.c index f99683d..db5b088 100644 --- a/src/sftp.c +++ b/src/sftp.c @@ -1625,12 +1625,12 @@ sftp_file sftp_open(sftp_session sftp, const char *file, int flags, attr.permissions = mode; attr.flags = SSH_FILEXFER_ATTR_PERMISSIONS; - if ((flags & O_RDONLY) == O_RDONLY) - sftp_flags |= SSH_FXF_READ; - if ((flags & O_WRONLY) == O_WRONLY) - sftp_flags |= SSH_FXF_WRITE; if ((flags & O_RDWR) == O_RDWR) sftp_flags |= (SSH_FXF_WRITE | SSH_FXF_READ); + else if ((flags & O_WRONLY) == O_WRONLY) + sftp_flags |= SSH_FXF_WRITE; + else + sftp_flags |= SSH_FXF_READ; if ((flags & O_CREAT) == O_CREAT) sftp_flags |= SSH_FXF_CREAT; if ((flags & O_TRUNC) == O_TRUNC) -- 2.9.0
From a12d8c856a52cedba408e7817881e09411520b6b Mon Sep 17 00:00:00 2001 From: Tilo Eckert <tilo.eckert@xxxxxxx> Date: Fri, 1 Jul 2016 10:57:38 +0200 Subject: [PATCH 2/3] add append support to sftp_open() Signed-off-by: Tilo Eckert <tilo.eckert@xxxxxxx> --- src/sftp.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/sftp.c b/src/sftp.c index db5b088..ae8418b 100644 --- a/src/sftp.c +++ b/src/sftp.c @@ -1605,6 +1605,7 @@ sftp_file sftp_open(sftp_session sftp, const char *file, int flags, sftp_file handle; ssh_string filename; ssh_buffer buffer; + sftp_attributes statData; uint32_t sftp_flags = 0; uint32_t id; @@ -1637,6 +1638,8 @@ sftp_file sftp_open(sftp_session sftp, const char *file, int flags, sftp_flags |= SSH_FXF_TRUNC; if ((flags & O_EXCL) == O_EXCL) sftp_flags |= SSH_FXF_EXCL; + if ((flags & O_APPEND) == O_APPEND) + sftp_flags |= SSH_FXF_APPEND; SSH_LOG(SSH_LOG_PACKET,"Opening file %s with sftp flags %x",file,sftp_flags); id = sftp_get_new_id(sftp); if (ssh_buffer_add_u32(buffer, htonl(id)) < 0 || @@ -1684,6 +1687,19 @@ sftp_file sftp_open(sftp_session sftp, const char *file, int flags, case SSH_FXP_HANDLE: handle = parse_handle_msg(msg); sftp_message_free(msg); + if ((flags & O_APPEND) == O_APPEND) { + statData = sftp_stat(sftp, file); + if (statData==NULL) { + sftp_close(handle); + return NULL; + } + if ((statData->flags & SSH_FILEXFER_ATTR_SIZE) != SSH_FILEXFER_ATTR_SIZE) { + ssh_set_error(sftp->session, SSH_FATAL, "Cannot open in append mode. Unknown file size."); + sftp_close(handle); + return NULL; + } + handle->offset = statData->size; + } return handle; default: ssh_set_error(sftp->session, SSH_FATAL, -- 2.9.0
From b2b1c02f828d07082847f851e270cc37ad66ee9f Mon Sep 17 00:00:00 2001 From: Tilo Eckert <tilo.eckert@xxxxxxx> Date: Fri, 1 Jul 2016 10:58:39 +0200 Subject: [PATCH 3/3] Add missing ifdef that prevented Windows builds Signed-off-by: Tilo Eckert <tilo.eckert@xxxxxxx> --- src/session.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/session.c b/src/session.c index 6885866..31bb2a7 100644 --- a/src/session.c +++ b/src/session.c @@ -270,7 +270,9 @@ void ssh_free(ssh_session session) { ssh_list_free(session->opts.identity); } +#ifndef _WIN32 ssh_agent_state_free (session->agent_state); +#endif session->agent_state = NULL; SAFE_FREE(session->auth_auto_state); -- 2.9.0
Archive administrator: postmaster@lists.cynapses.org