summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Schneider <mail@cynapses.org>2009-04-22 14:05:11 +0000
committerAndreas Schneider <mail@cynapses.org>2009-04-22 14:05:11 +0000
commitb875ce15e8bddfe4c0639b1932fb017b57aff996 (patch)
tree75d6b65d1bafe8ac2e5876d588b6cc929558b983
parentf59630cbbceed4d35967fd3c57efd96a125b2904 (diff)
downloadlibssh-b875ce15e8bddfe4c0639b1932fb017b57aff996.tar.gz
libssh-b875ce15e8bddfe4c0639b1932fb017b57aff996.tar.xz
libssh-b875ce15e8bddfe4c0639b1932fb017b57aff996.zip
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
-rw-r--r--libssh/sftp.c112
1 files changed, 67 insertions, 45 deletions
diff --git a/libssh/sftp.c b/libssh/sftp.c
index a50bc7d..4098b90 100644
--- a/libssh/sftp.c
+++ b/libssh/sftp.c
@@ -87,60 +87,82 @@ SFTP_SESSION *sftp_new(SSH_SESSION *session){
#ifdef WITH_SERVER
SFTP_SESSION *sftp_server_new(SSH_SESSION *session, CHANNEL *chan){
- SFTP_SESSION *sftp;
+ SFTP_SESSION *sftp = NULL;
- sftp = malloc(sizeof(SFTP_SESSION));
- if (sftp == NULL) {
- return NULL;
- }
+ sftp = malloc(sizeof(SFTP_SESSION));
+ if (sftp == 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){
- struct ssh_session *session = sftp->session;
- SFTP_PACKET *packet;
- BUFFER *reply;
- u32 version;
+ struct ssh_session *session = sftp->session;
+ SFTP_PACKET *packet = NULL;
+ BUFFER *reply = NULL;
+ u32 version;
+
+ sftp_enter_function();
+
+ packet = sftp_packet_read(sftp);
+ if (packet == NULL) {
+ sftp_leave_function();
+ return -1;
+ }
+
+ if (packet->type != SSH_FXP_INIT) {
+ ssh_set_error(session, SSH_FATAL,
+ "Packet read of type %d instead of SSH_FXP_INIT",
+ packet->type);
- sftp_enter_function();
- packet=sftp_packet_read(sftp);
- if(!packet){
- sftp_leave_function();
- return -1;
- }
- if(packet->type != SSH_FXP_INIT){
- ssh_set_error(session, SSH_FATAL,
- "Packet read of type %d instead of SSH_FXP_INIT",
- packet->type);
- sftp_packet_free(packet);
- sftp_leave_function();
- return -1;
- }
- ssh_log(session, SSH_LOG_PACKET, "received SSH_FXP_INIT");
- buffer_get_u32(packet->payload,&version);
- version=ntohl(version);
- ssh_log(session, SSH_LOG_PACKET, "Client version: %d", version);
- sftp->client_version=version;
sftp_packet_free(packet);
- reply=buffer_new();
- buffer_add_u32(reply,ntohl(LIBSFTP_VERSION));
- if(sftp_packet_write(sftp,SSH_FXP_VERSION,reply)==-1){
- buffer_free(reply);
- sftp_leave_function();
- return -1;
- }
+ sftp_leave_function();
+ return -1;
+ }
+
+ ssh_log(session, SSH_LOG_PACKET, "Received SSH_FXP_INIT");
+
+ buffer_get_u32(packet->payload, &version);
+ version = ntohl(version);
+ ssh_log(session, SSH_LOG_PACKET, "Client version: %d", version);
+ sftp->client_version = version;
+
+ sftp_packet_free(packet);
+
+ reply = buffer_new();
+ if (reply == NULL) {
+ sftp_leave_function();
+ return -1;
+ }
+
+ if (buffer_add_u32(reply, ntohl(LIBSFTP_VERSION)) < 0) {
buffer_free(reply);
- ssh_log(session, SSH_LOG_RARE, "Server version sent");
- if(version > LIBSFTP_VERSION)
- sftp->version=LIBSFTP_VERSION;
- else
- sftp->version=version;
sftp_leave_function();
- return 0;
+ return -1;
+ }
+
+ if (sftp_packet_write(sftp, SSH_FXP_VERSION, reply) < 0) {
+ buffer_free(reply);
+ sftp_leave_function();
+ return -1;
+ }
+ buffer_free(reply);
+
+ ssh_log(session, SSH_LOG_RARE, "Server version sent");
+
+ if (version > LIBSFTP_VERSION) {
+ sftp->version = LIBSFTP_VERSION;
+ } else {
+ sftp->version=version;
+ }
+
+ sftp_leave_function();
+ return 0;
}
#endif /* WITH_SERVER */