mirror of
https://git.libssh.org/projects/libssh.git
synced 2026-02-04 12:20:42 +09:00
sftp: format modified
Signed-off-by: tatataeki <shengzeyu19_98@163.com> Reviewed-by: Andreas Schneider <asn@cryptomilk.org> Reviewed-by: Anderson Toshiyuki Sasaki <ansasaki@redhat.com>
This commit is contained in:
@@ -375,8 +375,8 @@ int sftp_process_init_packet(sftp_client_message client_msg) {
|
||||
"1",
|
||||
"hardlink@openssh.com",
|
||||
"1",
|
||||
"statvfs@openssh.com",
|
||||
"2");
|
||||
"statvfs@openssh.com",
|
||||
"2");
|
||||
if (rc != SSH_OK) {
|
||||
ssh_set_error_oom(session);
|
||||
SSH_BUFFER_FREE(reply);
|
||||
@@ -444,7 +444,7 @@ int sftp_decode_channel_data_to_packet(sftp_session sftp, void *data) {
|
||||
if(packet->sftp == NULL)
|
||||
packet->sftp = sftp;
|
||||
|
||||
packet->type = *((uint8_t *)data + sizeof(int));
|
||||
packet->type = *((uint8_t *)data + sizeof(uint32_t));
|
||||
payload_len = PULL_BE_U32(data, 0);
|
||||
|
||||
/* We should check the legality of payload length */
|
||||
|
||||
440
src/sftpserver.c
440
src/sftpserver.c
@@ -250,235 +250,235 @@ sftp_client_message sftp_get_client_message(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;
|
||||
ssh_buffer payload;
|
||||
int rc;
|
||||
int version;
|
||||
ssh_session session = sftp->session;
|
||||
sftp_packet packet;
|
||||
sftp_client_message msg;
|
||||
ssh_buffer payload;
|
||||
int rc;
|
||||
int version;
|
||||
|
||||
msg = calloc(1, sizeof(struct sftp_client_message_struct));
|
||||
if (msg == NULL) {
|
||||
ssh_set_error_oom(session);
|
||||
return NULL;
|
||||
}
|
||||
msg = calloc(1, sizeof(struct sftp_client_message_struct));
|
||||
if (msg == NULL) {
|
||||
ssh_set_error_oom(session);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
packet = sftp->read_packet;
|
||||
if (packet == NULL) {
|
||||
ssh_set_error_oom(session);
|
||||
sftp_client_message_free(msg);
|
||||
return NULL;
|
||||
}
|
||||
packet = sftp->read_packet;
|
||||
if (packet == NULL) {
|
||||
ssh_set_error_oom(session);
|
||||
sftp_client_message_free(msg);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
payload = packet->payload;
|
||||
msg->type = packet->type;
|
||||
msg->sftp = sftp;
|
||||
payload = packet->payload;
|
||||
msg->type = packet->type;
|
||||
msg->sftp = sftp;
|
||||
|
||||
/* take a copy of the whole packet */
|
||||
msg->complete_message = ssh_buffer_new();
|
||||
if (msg->complete_message == NULL) {
|
||||
ssh_set_error_oom(session);
|
||||
sftp_client_message_free(msg);
|
||||
return NULL;
|
||||
}
|
||||
/* take a copy of the whole packet */
|
||||
msg->complete_message = ssh_buffer_new();
|
||||
if (msg->complete_message == NULL) {
|
||||
ssh_set_error_oom(session);
|
||||
sftp_client_message_free(msg);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
rc = ssh_buffer_add_data(msg->complete_message,
|
||||
ssh_buffer_get(payload),
|
||||
ssh_buffer_get_len(payload));
|
||||
if (rc < 0) {
|
||||
ssh_set_error_oom(session);
|
||||
sftp_client_message_free(msg);
|
||||
return NULL;
|
||||
}
|
||||
rc = ssh_buffer_add_data(msg->complete_message,
|
||||
ssh_buffer_get(payload),
|
||||
ssh_buffer_get_len(payload));
|
||||
if (rc < 0) {
|
||||
ssh_set_error_oom(session);
|
||||
sftp_client_message_free(msg);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if(msg->type!=SSH_FXP_INIT)
|
||||
ssh_buffer_get_u32(payload, &msg->id);
|
||||
if(msg->type!=SSH_FXP_INIT)
|
||||
ssh_buffer_get_u32(payload, &msg->id);
|
||||
|
||||
switch(msg->type) {
|
||||
case SSH_FXP_INIT:
|
||||
rc = ssh_buffer_unpack(payload,
|
||||
"d",
|
||||
&version);
|
||||
if (rc != SSH_OK) {
|
||||
ssh_set_error_oom(session);
|
||||
sftp_client_message_free(msg);
|
||||
printf("unpack init failed!\n");
|
||||
return NULL;
|
||||
}
|
||||
version = ntohl(version);
|
||||
sftp->client_version = (int)version;
|
||||
break;
|
||||
case SSH_FXP_CLOSE:
|
||||
case SSH_FXP_READDIR:
|
||||
msg->handle = ssh_buffer_get_ssh_string(payload);
|
||||
if (msg->handle == NULL) {
|
||||
ssh_set_error_oom(session);
|
||||
sftp_client_message_free(msg);
|
||||
return NULL;
|
||||
}
|
||||
break;
|
||||
case SSH_FXP_READ:
|
||||
rc = ssh_buffer_unpack(payload,
|
||||
"Sqd",
|
||||
&msg->handle,
|
||||
&msg->offset,
|
||||
&msg->len);
|
||||
if (rc != SSH_OK) {
|
||||
ssh_set_error_oom(session);
|
||||
sftp_client_message_free(msg);
|
||||
return NULL;
|
||||
}
|
||||
break;
|
||||
case SSH_FXP_WRITE:
|
||||
rc = ssh_buffer_unpack(payload,
|
||||
"SqS",
|
||||
&msg->handle,
|
||||
&msg->offset,
|
||||
&msg->data);
|
||||
if (rc != SSH_OK) {
|
||||
ssh_set_error_oom(session);
|
||||
sftp_client_message_free(msg);
|
||||
return NULL;
|
||||
}
|
||||
break;
|
||||
case SSH_FXP_REMOVE:
|
||||
case SSH_FXP_RMDIR:
|
||||
case SSH_FXP_OPENDIR:
|
||||
case SSH_FXP_READLINK:
|
||||
case SSH_FXP_REALPATH:
|
||||
rc = ssh_buffer_unpack(payload,
|
||||
"s",
|
||||
&msg->filename);
|
||||
if (rc != SSH_OK) {
|
||||
ssh_set_error_oom(session);
|
||||
sftp_client_message_free(msg);
|
||||
return NULL;
|
||||
}
|
||||
break;
|
||||
case SSH_FXP_RENAME:
|
||||
case SSH_FXP_SYMLINK:
|
||||
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;
|
||||
case SSH_FXP_MKDIR:
|
||||
case SSH_FXP_SETSTAT:
|
||||
rc = ssh_buffer_unpack(payload,
|
||||
"s",
|
||||
&msg->filename);
|
||||
if (rc != SSH_OK) {
|
||||
ssh_set_error_oom(session);
|
||||
sftp_client_message_free(msg);
|
||||
return NULL;
|
||||
}
|
||||
msg->attr = sftp_parse_attr(sftp, payload, 0);
|
||||
if (msg->attr == NULL) {
|
||||
ssh_set_error_oom(session);
|
||||
sftp_client_message_free(msg);
|
||||
return NULL;
|
||||
}
|
||||
break;
|
||||
case SSH_FXP_FSETSTAT:
|
||||
msg->handle = ssh_buffer_get_ssh_string(payload);
|
||||
if (msg->handle == NULL) {
|
||||
ssh_set_error_oom(session);
|
||||
sftp_client_message_free(msg);
|
||||
return NULL;
|
||||
}
|
||||
msg->attr = sftp_parse_attr(sftp, payload, 0);
|
||||
if (msg->attr == NULL) {
|
||||
ssh_set_error_oom(session);
|
||||
sftp_client_message_free(msg);
|
||||
return NULL;
|
||||
}
|
||||
break;
|
||||
case SSH_FXP_LSTAT:
|
||||
case SSH_FXP_STAT:
|
||||
rc = ssh_buffer_unpack(payload,
|
||||
"s",
|
||||
&msg->filename);
|
||||
if (rc != SSH_OK) {
|
||||
ssh_set_error_oom(session);
|
||||
sftp_client_message_free(msg);
|
||||
return NULL;
|
||||
}
|
||||
if(sftp->version > 3) {
|
||||
ssh_buffer_unpack(payload, "d", &msg->flags);
|
||||
}
|
||||
break;
|
||||
case SSH_FXP_OPEN:
|
||||
rc = ssh_buffer_unpack(payload,
|
||||
"sd",
|
||||
&msg->filename,
|
||||
&msg->flags);
|
||||
if (rc != SSH_OK) {
|
||||
ssh_set_error_oom(session);
|
||||
sftp_client_message_free(msg);
|
||||
return NULL;
|
||||
}
|
||||
msg->attr = sftp_parse_attr(sftp, payload, 0);
|
||||
if (msg->attr == NULL) {
|
||||
ssh_set_error_oom(session);
|
||||
sftp_client_message_free(msg);
|
||||
return NULL;
|
||||
}
|
||||
break;
|
||||
case SSH_FXP_FSTAT:
|
||||
rc = ssh_buffer_unpack(payload,
|
||||
"S",
|
||||
&msg->handle);
|
||||
if (rc != SSH_OK) {
|
||||
ssh_set_error_oom(session);
|
||||
sftp_client_message_free(msg);
|
||||
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;
|
||||
}
|
||||
switch(msg->type) {
|
||||
case SSH_FXP_INIT:
|
||||
rc = ssh_buffer_unpack(payload,
|
||||
"d",
|
||||
&version);
|
||||
if (rc != SSH_OK) {
|
||||
ssh_set_error_oom(session);
|
||||
sftp_client_message_free(msg);
|
||||
printf("unpack init failed!\n");
|
||||
return NULL;
|
||||
}
|
||||
version = ntohl(version);
|
||||
sftp->client_version = (int)version;
|
||||
break;
|
||||
case SSH_FXP_CLOSE:
|
||||
case SSH_FXP_READDIR:
|
||||
msg->handle = ssh_buffer_get_ssh_string(payload);
|
||||
if (msg->handle == NULL) {
|
||||
ssh_set_error_oom(session);
|
||||
sftp_client_message_free(msg);
|
||||
return NULL;
|
||||
}
|
||||
break;
|
||||
case SSH_FXP_READ:
|
||||
rc = ssh_buffer_unpack(payload,
|
||||
"Sqd",
|
||||
&msg->handle,
|
||||
&msg->offset,
|
||||
&msg->len);
|
||||
if (rc != SSH_OK) {
|
||||
ssh_set_error_oom(session);
|
||||
sftp_client_message_free(msg);
|
||||
return NULL;
|
||||
}
|
||||
break;
|
||||
case SSH_FXP_WRITE:
|
||||
rc = ssh_buffer_unpack(payload,
|
||||
"SqS",
|
||||
&msg->handle,
|
||||
&msg->offset,
|
||||
&msg->data);
|
||||
if (rc != SSH_OK) {
|
||||
ssh_set_error_oom(session);
|
||||
sftp_client_message_free(msg);
|
||||
return NULL;
|
||||
}
|
||||
break;
|
||||
case SSH_FXP_REMOVE:
|
||||
case SSH_FXP_RMDIR:
|
||||
case SSH_FXP_OPENDIR:
|
||||
case SSH_FXP_READLINK:
|
||||
case SSH_FXP_REALPATH:
|
||||
rc = ssh_buffer_unpack(payload,
|
||||
"s",
|
||||
&msg->filename);
|
||||
if (rc != SSH_OK) {
|
||||
ssh_set_error_oom(session);
|
||||
sftp_client_message_free(msg);
|
||||
return NULL;
|
||||
}
|
||||
break;
|
||||
case SSH_FXP_RENAME:
|
||||
case SSH_FXP_SYMLINK:
|
||||
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;
|
||||
case SSH_FXP_MKDIR:
|
||||
case SSH_FXP_SETSTAT:
|
||||
rc = ssh_buffer_unpack(payload,
|
||||
"s",
|
||||
&msg->filename);
|
||||
if (rc != SSH_OK) {
|
||||
ssh_set_error_oom(session);
|
||||
sftp_client_message_free(msg);
|
||||
return NULL;
|
||||
}
|
||||
msg->attr = sftp_parse_attr(sftp, payload, 0);
|
||||
if (msg->attr == NULL) {
|
||||
ssh_set_error_oom(session);
|
||||
sftp_client_message_free(msg);
|
||||
return NULL;
|
||||
}
|
||||
break;
|
||||
case SSH_FXP_FSETSTAT:
|
||||
msg->handle = ssh_buffer_get_ssh_string(payload);
|
||||
if (msg->handle == NULL) {
|
||||
ssh_set_error_oom(session);
|
||||
sftp_client_message_free(msg);
|
||||
return NULL;
|
||||
}
|
||||
msg->attr = sftp_parse_attr(sftp, payload, 0);
|
||||
if (msg->attr == NULL) {
|
||||
ssh_set_error_oom(session);
|
||||
sftp_client_message_free(msg);
|
||||
return NULL;
|
||||
}
|
||||
break;
|
||||
case SSH_FXP_LSTAT:
|
||||
case SSH_FXP_STAT:
|
||||
rc = ssh_buffer_unpack(payload,
|
||||
"s",
|
||||
&msg->filename);
|
||||
if (rc != SSH_OK) {
|
||||
ssh_set_error_oom(session);
|
||||
sftp_client_message_free(msg);
|
||||
return NULL;
|
||||
}
|
||||
if(sftp->version > 3) {
|
||||
ssh_buffer_unpack(payload, "d", &msg->flags);
|
||||
}
|
||||
break;
|
||||
case SSH_FXP_OPEN:
|
||||
rc = ssh_buffer_unpack(payload,
|
||||
"sd",
|
||||
&msg->filename,
|
||||
&msg->flags);
|
||||
if (rc != SSH_OK) {
|
||||
ssh_set_error_oom(session);
|
||||
sftp_client_message_free(msg);
|
||||
return NULL;
|
||||
}
|
||||
msg->attr = sftp_parse_attr(sftp, payload, 0);
|
||||
if (msg->attr == NULL) {
|
||||
ssh_set_error_oom(session);
|
||||
sftp_client_message_free(msg);
|
||||
return NULL;
|
||||
}
|
||||
break;
|
||||
case SSH_FXP_FSTAT:
|
||||
rc = ssh_buffer_unpack(payload,
|
||||
"S",
|
||||
&msg->handle);
|
||||
if (rc != SSH_OK) {
|
||||
ssh_set_error_oom(session);
|
||||
sftp_client_message_free(msg);
|
||||
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;
|
||||
}
|
||||
} else if (strcmp(msg->submessage, "statvfs@openssh.com") == 0 ){
|
||||
rc = ssh_buffer_unpack(payload,
|
||||
"s",
|
||||
&msg->filename);
|
||||
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);
|
||||
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;
|
||||
}
|
||||
} else if (strcmp(msg->submessage, "statvfs@openssh.com") == 0 ){
|
||||
rc = ssh_buffer_unpack(payload,
|
||||
"s",
|
||||
&msg->filename);
|
||||
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);
|
||||
sftp_client_message_free(msg);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return msg;
|
||||
return msg;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user