From 0a5161a7d1d3ad97e567200bb01bc93ec29ef80e Mon Sep 17 00:00:00 2001 From: tatataeki Date: Mon, 12 Sep 2022 20:49:14 +0800 Subject: [PATCH] sftp: fix format problems, style nit and building problems Signed-off-by: tatataeki Reviewed-by: Andreas Schneider Reviewed-by: Anderson Toshiyuki Sasaki --- examples/sample_sftpserver.c | 61 +++++++++++------------- include/libssh/sftp.h | 53 ++++++++++++++++---- src/libssh.map | 4 -- src/sftp.c | 12 +++-- src/sftpserver.c | 10 ++-- tests/server/test_server/sftpserver_cb.c | 19 ++------ tests/server/torture_sftpserver.c | 14 +----- 7 files changed, 91 insertions(+), 82 deletions(-) diff --git a/examples/sample_sftpserver.c b/examples/sample_sftpserver.c index ab1198b0..d60ced1f 100644 --- a/examples/sample_sftpserver.c +++ b/examples/sample_sftpserver.c @@ -53,6 +53,7 @@ The goal is to show the API in action. #include #include #include +#include #ifndef KEYS_FOLDER @@ -70,7 +71,7 @@ The goal is to show the API in action. #define MAX_HANDLE_NUM 10 #define MAX_ENTRIES_NUM_IN_PACKET 50 -#define MAX_LONG_NAME_LEN 150 +#define MAX_LONG_NAME_LEN 350 #define SSH_SFTP_CALLBACK(name) \ static int name (sftp_client_message message) @@ -184,16 +185,16 @@ static int handle_close(int handle_ind) { } static int handle_close_by_pointer(struct sftp_handle* handle) { - if(handle->type == NULL_HANDLE) + if (handle->type == NULL_HANDLE) return -1; - if(handle->fd > 0) + if (handle->fd > 0) close(handle->fd); - if(handle->dirp!=NULL) + if (handle->dirp!=NULL) closedir(handle->dirp); - if(handle->name!=NULL){ + if (handle->name!=NULL) { free(handle->name); handle->name = NULL; } @@ -202,10 +203,10 @@ static int handle_close_by_pointer(struct sftp_handle* handle) { } static void free_handles(int handle_num) { - - for(int i = 0; i < handle_num; i++) { + int i; + for(i = 0; i < handle_num; i++) { handle_close(i); - //reinit this handle + /* reinit this handle */ reinit_single_handle(&s_handle_table[i]); } return; @@ -213,12 +214,13 @@ static void free_handles(int handle_num) { static int add_handle(int type, void *dirp, int fd, const char *name, void *session_id) { int ret = SSH_ERROR; - if(dirp == NULL && fd < 0){ + int i; + if (dirp == NULL && fd < 0) { return ret; } - for(int i = 0; iname!=NULL) + if (handle != NULL && handle->name != NULL) ret = handle->name; return ret; @@ -273,33 +275,23 @@ static int unix_errno_to_ssh_stat(int u_errno) { case ENOTDIR: case EBADF: case ELOOP: - { ret = SSH_FX_NO_SUCH_FILE; break; - } case EPERM: case EACCES: case EFAULT: - { ret = SSH_FX_PERMISSION_DENIED; break; - } case ENAMETOOLONG: case EINVAL: - { ret = SSH_FX_BAD_MESSAGE; break; - } case ENOSYS: - { ret = SSH_FX_OP_UNSUPPORTED; break; - } default: - { ret = SSH_FX_FAILURE; break; - } } return ret; @@ -431,19 +423,24 @@ static int process_open(sftp_client_message client_msg) { int handle_ind = -1; int status; - if (( (msg_flag&(uint32_t)SSH_FXF_READ) == SSH_FXF_READ) && - ( (msg_flag&(uint32_t)SSH_FXF_WRITE) == SSH_FXF_WRITE)) { + 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 ){ + } 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_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; - } else if ( (msg_flag&(uint32_t)SSH_FXF_READ) == SSH_FXF_READ ){ + } else if ((msg_flag & (uint32_t)SSH_FXF_READ) == SSH_FXF_READ) { file_flag = O_RDONLY; + } else { + printf("undefined message flag\n"); + sftp_reply_status(client_msg, SSH_FX_FAILURE, "Flag error"); + ret = SSH_ERROR; + return ret; } fd = open(filename, file_flag, 0600); @@ -496,7 +493,7 @@ static int process_read(sftp_client_message client_msg) { rv = lseek(fd, client_msg->offset, SEEK_SET); if (rv == -1) { sftp_reply_status(client_msg, SSH_FX_FAILURE, NULL); - printf("error seeking file fd: %d at offset: %ld\n", fd, client_msg->offset); + printf("error seeking file fd: %d at offset: %" PRIu64 "\n", fd, client_msg->offset); ret = SSH_ERROR; return ret; } @@ -545,7 +542,7 @@ static int process_write(sftp_client_message client_msg) { rv = lseek(fd, client_msg->offset, SEEK_SET); if (rv == -1) { sftp_reply_status(client_msg, SSH_FX_FAILURE, NULL); - printf("error seeking file at offset: %ld\n", client_msg->offset); + printf("error seeking file at offset: %" PRIu64 "\n", client_msg->offset); } writen = write(fd, msg_data, len); if(writen == len) { diff --git a/include/libssh/sftp.h b/include/libssh/sftp.h index 997f1f34..d168a174 100644 --- a/include/libssh/sftp.h +++ b/include/libssh/sftp.h @@ -864,15 +864,6 @@ LIBSSH_API char *sftp_canonicalize_path(sftp_session sftp, const char *path); */ LIBSSH_API int sftp_server_version(sftp_session sftp); - -LIBSSH_API int sftp_decode_channel_data_to_packet(sftp_session sftp, void *data); - -LIBSSH_API sftp_client_message sftp_get_client_message_from_packet(sftp_session sftp); - -LIBSSH_API int sftp_process_init_packet(sftp_client_message client_msg); - -LIBSSH_API int sftp_reply_statvfs(sftp_client_message msg, sftp_statvfs_t st); - #ifdef WITH_SERVER /** * @brief Create a new sftp server session. @@ -900,6 +891,50 @@ LIBSSH_API int sftp_server_init(sftp_session sftp); * @param sftp The sftp session handle to free. */ LIBSSH_API void sftp_server_free(sftp_session sftp); + +/** + * @brief Decode the data from channel buffer into sftp read_packet. + * + * @param sftp The sftp session handle. + * + * @param data The pointer to the data buffer of channel. + * + * @return Length of data deocded. + */ +LIBSSH_API int sftp_decode_channel_data_to_packet(sftp_session sftp, void *data); + +/** + * @brief Get the client message from a sftp packet. + * + * @param sftp The sftp session handle. + * + * @return The pointer to the generated sftp client message. + */ +LIBSSH_API sftp_client_message sftp_get_client_message_from_packet(sftp_session sftp); + +/** + * @brief Handle the sftp_init request from client. + * + * @param client_msg The pointer to client message. + * + * @return 0 on success, < 0 on error with ssh and sftp error set. + * + * @see sftp_get_error() + */ +LIBSSH_API int sftp_process_init_packet(sftp_client_message client_msg); + +/** + * @brief Handle the statvfs request, return information the mounted file system. + * + * @param msg The sftp client message. + * + * @param st The statvfs state of target file. + * + * @return 0 on success, < 0 on error with ssh and sftp error set. + * + * @see sftp_get_error() + */ +LIBSSH_API int sftp_reply_statvfs(sftp_client_message msg, sftp_statvfs_t st); #endif /* WITH_SERVER */ /* sftpserver.c */ diff --git a/src/libssh.map b/src/libssh.map index cb546307..eeb625c5 100644 --- a/src/libssh.map +++ b/src/libssh.map @@ -457,9 +457,5 @@ LIBSSH_4_9_0 # Released ssh_session_set_disconnect_message; ssh_userauth_publickey_auto_get_current_identity; ssh_vlog; - sftp_get_client_message_from_packet; - sftp_process_init_packet; - sftp_decode_channel_data_to_packet; - sftp_reply_statvfs; } LIBSSH_4_8_1; diff --git a/src/sftp.c b/src/sftp.c index b2de234c..5ee0c5d6 100644 --- a/src/sftp.c +++ b/src/sftp.c @@ -354,7 +354,8 @@ void sftp_server_free(sftp_session sftp) SAFE_FREE(sftp); } -int sftp_process_init_packet(sftp_client_message client_msg) { +int sftp_process_init_packet(sftp_client_message client_msg) +{ int ret = SSH_OK; sftp_session sftp = client_msg->sftp; ssh_session session = sftp->session; @@ -434,7 +435,8 @@ void sftp_free(sftp_session sftp) SAFE_FREE(sftp); } -int sftp_decode_channel_data_to_packet(sftp_session sftp, void *data) { +int sftp_decode_channel_data_to_packet(sftp_session sftp, void *data) +{ sftp_packet packet = sftp->read_packet; int nread; int payload_len; @@ -451,12 +453,12 @@ int sftp_decode_channel_data_to_packet(sftp_session sftp, void *data) { if(payload_len > MAX_PACKET_LEN || payload_len < 0) return SSH_ERROR; - offset = sizeof(int)+sizeof(uint8_t); + offset = sizeof(int) + sizeof(uint8_t); to_read = payload_len - sizeof(uint8_t); - ssh_buffer_add_data(packet->payload, (void*)((uint8_t *)data + offset), payload_len-sizeof(uint8_t)); + ssh_buffer_add_data(packet->payload, (void*)((uint8_t *)data + offset), payload_len - sizeof(uint8_t)); nread = ssh_buffer_get_len(packet->payload); - /* We should check if we copy the whole data */ + /* We should check if we copied the whole data */ if(nread != to_read) return SSH_ERROR; diff --git a/src/sftpserver.c b/src/sftpserver.c index 50cf22c3..4664dd84 100644 --- a/src/sftpserver.c +++ b/src/sftpserver.c @@ -249,7 +249,8 @@ sftp_client_message sftp_get_client_message(sftp_session sftp) { return msg; } -sftp_client_message sftp_get_client_message_from_packet(sftp_session sftp) { +sftp_client_message sftp_get_client_message_from_packet(sftp_session sftp) +{ ssh_session session = sftp->session; sftp_packet packet; sftp_client_message msg; @@ -291,8 +292,9 @@ sftp_client_message sftp_get_client_message_from_packet(sftp_session sftp) { return NULL; } - if(msg->type!=SSH_FXP_INIT) + if (msg->type!=SSH_FXP_INIT) { ssh_buffer_get_u32(payload, &msg->id); + } switch(msg->type) { case SSH_FXP_INIT: @@ -718,8 +720,8 @@ int sftp_reply_data(sftp_client_message msg, const void *data, int len) { return 0; } -/* zeyu added */ -int sftp_reply_statvfs(sftp_client_message msg, sftp_statvfs_t st) { +int sftp_reply_statvfs(sftp_client_message msg, sftp_statvfs_t st) +{ ssh_buffer out; out = ssh_buffer_new(); diff --git a/tests/server/test_server/sftpserver_cb.c b/tests/server/test_server/sftpserver_cb.c index ae6c497d..be0f63b2 100644 --- a/tests/server/test_server/sftpserver_cb.c +++ b/tests/server/test_server/sftpserver_cb.c @@ -71,7 +71,7 @@ #define MAX_HANDLE_NUM 10 #define MAX_ENTRIES_NUM_IN_PACKET 50 -#define MAX_LONG_NAME_LEN 150 +#define MAX_LONG_NAME_LEN 300 #define SSH_SFTP_CALLBACK(name) \ static int name (sftp_client_message message) @@ -266,41 +266,30 @@ static const char* ssh_str_error(int u_errno) { static int unix_errno_to_ssh_stat(int u_errno) { int ret = SSH_OK; - switch (u_errno) - { + switch (u_errno) { case 0: break; case ENOENT: case ENOTDIR: case EBADF: case ELOOP: - { ret = SSH_FX_NO_SUCH_FILE; break; - } case EPERM: case EACCES: case EFAULT: - { ret = SSH_FX_PERMISSION_DENIED; break; - } case ENAMETOOLONG: case EINVAL: - { ret = SSH_FX_BAD_MESSAGE; break; - } case ENOSYS: - { ret = SSH_FX_OP_UNSUPPORTED; break; - } default: - { ret = SSH_FX_FAILURE; break; - } } return ret; @@ -437,13 +426,13 @@ static int process_open(sftp_client_message client_msg) { 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 ){ + } 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 ) file_flag |= O_APPEND; if ( (msg_flag&(uint32_t)SSH_FXF_CREAT) == SSH_FXF_CREAT ) file_flag |= O_CREAT; - } else if ( (msg_flag&(uint32_t)SSH_FXF_READ) == SSH_FXF_READ ){ + } else { file_flag = O_RDONLY; } diff --git a/tests/server/torture_sftpserver.c b/tests/server/torture_sftpserver.c index 263a6f50..4c5dc6d8 100644 --- a/tests/server/torture_sftpserver.c +++ b/tests/server/torture_sftpserver.c @@ -123,18 +123,6 @@ static int setup_default_server(void **state) torture_write_file(ecdsa_hostkey, torture_get_testkey(SSH_KEYTYPE_ECDSA_P521, 0)); - // sftp_server = getenv("TORTURE_SFTP_SERVER"); - // if (sftp_server == NULL) { - // for (i = 0; i < sftp_sl_size; i++) { - // sftp_server = sftp_server_locations[i]; - // rc = lstat(sftp_server, &sb); - // if (rc == 0) { - // break; - // } - // } - // } - // assert_non_null(sftp_server); - /* Create default server state */ ss = (struct server_state_st *)calloc(1, sizeof(struct server_state_st)); assert_non_null(ss); @@ -442,7 +430,7 @@ static void torture_server_test_sftp_function(void **state) assert_non_null(fichier); to = sftp_open(sftp, "ssh-copy", O_WRONLY | O_CREAT, 0700); - assert_non_null(fichier); + assert_non_null(to); read_len = sftp_read(fichier, data, 4096); write_len = sftp_write(to, data, read_len);