aboutsummaryrefslogtreecommitdiff
path: root/src/sftpserver.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sftpserver.c')
-rw-r--r--src/sftpserver.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/sftpserver.c b/src/sftpserver.c
index 68fdb3d2..3cb30090 100644
--- a/src/sftpserver.c
+++ b/src/sftpserver.c
@@ -202,6 +202,29 @@ sftp_client_message sftp_get_client_message(sftp_session sftp) {
return NULL;
}
break;
+ case SSH_FXP_EXTENDED:
+ rc = ssh_buffer_unpack(payload,
+ "s",
+ &msg->submessage);
+ if (rc != SSH_OK) {
+ ssh_set_error_oom(session);
+ sftp_client_message_free(msg);
+ return NULL;
+ }
+
+ if (strcmp(msg->submessage, "hardlink@openssh.com") == 0 ||
+ strcmp(msg->submessage, "posix-rename@openssh.com") == 0) {
+ rc = ssh_buffer_unpack(payload,
+ "sS",
+ &msg->filename,
+ &msg->data);
+ if (rc != SSH_OK) {
+ ssh_set_error_oom(session);
+ sftp_client_message_free(msg);
+ return NULL;
+ }
+ }
+ break;
default:
ssh_set_error(sftp->session, SSH_FATAL,
"Received unhandled sftp message %d", msg->type);
@@ -242,12 +265,17 @@ uint32_t sftp_client_message_get_flags(sftp_client_message msg){
return msg->flags;
}
+const char *sftp_client_message_get_submessage(sftp_client_message msg){
+ return msg->submessage;
+}
+
void sftp_client_message_free(sftp_client_message msg) {
if (msg == NULL) {
return;
}
SAFE_FREE(msg->filename);
+ SAFE_FREE(msg->submessage);
ssh_string_free(msg->data);
ssh_string_free(msg->handle);
sftp_attributes_free(msg->attr);