Add more error checks to sftp server init functions.

git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@570 7dcaeef0-15fb-0310-b436-a5af3365683c
This commit is contained in:
Andreas Schneider
2009-04-22 14:05:11 +00:00
parent f59630cbbc
commit b875ce15e8

View File

@@ -87,58 +87,80 @@ SFTP_SESSION *sftp_new(SSH_SESSION *session){
#ifdef WITH_SERVER #ifdef WITH_SERVER
SFTP_SESSION *sftp_server_new(SSH_SESSION *session, CHANNEL *chan){ SFTP_SESSION *sftp_server_new(SSH_SESSION *session, CHANNEL *chan){
SFTP_SESSION *sftp; SFTP_SESSION *sftp = NULL;
sftp = malloc(sizeof(SFTP_SESSION)); sftp = malloc(sizeof(SFTP_SESSION));
if (sftp == NULL) { if (sftp == NULL) {
return NULL; return NULL;
} }
ZERO_STRUCTP(sftp);
sftp->session = session;
sftp->channel = chan;
memset(sftp,0,sizeof(SFTP_SESSION));
sftp->session=session;
sftp->channel=chan;
return sftp; return sftp;
} }
int sftp_server_init(SFTP_SESSION *sftp){ int sftp_server_init(SFTP_SESSION *sftp){
struct ssh_session *session = sftp->session; struct ssh_session *session = sftp->session;
SFTP_PACKET *packet; SFTP_PACKET *packet = NULL;
BUFFER *reply; BUFFER *reply = NULL;
u32 version; u32 version;
sftp_enter_function(); sftp_enter_function();
packet=sftp_packet_read(sftp);
if(!packet){ packet = sftp_packet_read(sftp);
if (packet == NULL) {
sftp_leave_function(); sftp_leave_function();
return -1; return -1;
} }
if(packet->type != SSH_FXP_INIT){
if (packet->type != SSH_FXP_INIT) {
ssh_set_error(session, SSH_FATAL, ssh_set_error(session, SSH_FATAL,
"Packet read of type %d instead of SSH_FXP_INIT", "Packet read of type %d instead of SSH_FXP_INIT",
packet->type); packet->type);
sftp_packet_free(packet); sftp_packet_free(packet);
sftp_leave_function(); sftp_leave_function();
return -1; return -1;
} }
ssh_log(session, SSH_LOG_PACKET, "received SSH_FXP_INIT");
buffer_get_u32(packet->payload,&version); ssh_log(session, SSH_LOG_PACKET, "Received SSH_FXP_INIT");
version=ntohl(version);
buffer_get_u32(packet->payload, &version);
version = ntohl(version);
ssh_log(session, SSH_LOG_PACKET, "Client version: %d", version); ssh_log(session, SSH_LOG_PACKET, "Client version: %d", version);
sftp->client_version=version; sftp->client_version = version;
sftp_packet_free(packet); sftp_packet_free(packet);
reply=buffer_new();
buffer_add_u32(reply,ntohl(LIBSFTP_VERSION)); reply = buffer_new();
if(sftp_packet_write(sftp,SSH_FXP_VERSION,reply)==-1){ if (reply == NULL) {
sftp_leave_function();
return -1;
}
if (buffer_add_u32(reply, ntohl(LIBSFTP_VERSION)) < 0) {
buffer_free(reply);
sftp_leave_function();
return -1;
}
if (sftp_packet_write(sftp, SSH_FXP_VERSION, reply) < 0) {
buffer_free(reply); buffer_free(reply);
sftp_leave_function(); sftp_leave_function();
return -1; return -1;
} }
buffer_free(reply); buffer_free(reply);
ssh_log(session, SSH_LOG_RARE, "Server version sent"); ssh_log(session, SSH_LOG_RARE, "Server version sent");
if(version > LIBSFTP_VERSION)
sftp->version=LIBSFTP_VERSION; if (version > LIBSFTP_VERSION) {
else sftp->version = LIBSFTP_VERSION;
} else {
sftp->version=version; sftp->version=version;
}
sftp_leave_function(); sftp_leave_function();
return 0; return 0;
} }