From a59d587060dcc1bd99a4947b36c22b21e4162a41 Mon Sep 17 00:00:00 2001 From: Eshan Kelkar Date: Sat, 15 Mar 2025 17:50:33 +0530 Subject: [PATCH] sftpserver.c: Add support for O_TRUNC while opening files Signed-off-by: Eshan Kelkar Reviewed-by: Jakub Jelen --- src/sftpserver.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/sftpserver.c b/src/sftpserver.c index 2acde1e3..e3845c8d 100644 --- a/src/sftpserver.c +++ b/src/sftpserver.c @@ -882,17 +882,26 @@ process_open(sftp_client_message client_msg) SSH_LOG(SSH_LOG_PROTOCOL, "Processing open: filename %s, mode=0%o" PRIu32, filename, mode); - if (((msg_flag & (uint32_t)SSH_FXF_READ) == SSH_FXF_READ) && - ((msg_flag & (uint32_t)SSH_FXF_WRITE) == SSH_FXF_WRITE)) { - file_flag = O_RDWR; // file must exist - if ((msg_flag & (uint32_t)SSH_FXF_CREAT) == SSH_FXF_CREAT) - file_flag |= O_CREAT; - } else if ((msg_flag & (uint32_t)SSH_FXF_WRITE) == SSH_FXF_WRITE) { - file_flag = O_WRONLY; - if ((msg_flag & (uint32_t)SSH_FXF_APPEND) == SSH_FXF_APPEND) + if ((msg_flag & (uint32_t)SSH_FXF_WRITE) == SSH_FXF_WRITE) { + if ((msg_flag & (uint32_t)SSH_FXF_READ) == SSH_FXF_READ) { + /* Both read and write */ + file_flag = O_RDWR; + } else { + /* Only write */ + file_flag = O_WRONLY; + } + + if ((msg_flag & (uint32_t)SSH_FXF_APPEND) == SSH_FXF_APPEND) { file_flag |= O_APPEND; - if ((msg_flag & (uint32_t)SSH_FXF_CREAT) == SSH_FXF_CREAT) + } + + if ((msg_flag & (uint32_t)SSH_FXF_CREAT) == SSH_FXF_CREAT) { file_flag |= O_CREAT; + } + + if ((msg_flag & (uint32_t)SSH_FXF_TRUNC) == SSH_FXF_TRUNC) { + file_flag |= O_TRUNC; + } } else if ((msg_flag & (uint32_t)SSH_FXF_READ) == SSH_FXF_READ) { file_flag = O_RDONLY; } else {