summaryrefslogtreecommitdiffstats
path: root/libssh/sftp.c
diff options
context:
space:
mode:
authorAris Adamantiadis <aris@0xbadc0de.be>2005-08-25 13:44:26 +0000
committerAris Adamantiadis <aris@0xbadc0de.be>2005-08-25 13:44:26 +0000
commit35221f967ef5e9801c2496a7f10ced1408f9cd20 (patch)
treefea84b96f4de3b8fd67df8bf557efa89c42be050 /libssh/sftp.c
parent6c0503f6c68ba92638516257c9991bcfd660e41e (diff)
downloadlibssh-35221f967ef5e9801c2496a7f10ced1408f9cd20.tar.gz
libssh-35221f967ef5e9801c2496a7f10ced1408f9cd20.tar.xz
libssh-35221f967ef5e9801c2496a7f10ced1408f9cd20.zip
fixed server segfaults on exit (double frees)
sftp_server_init() git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@15 7dcaeef0-15fb-0310-b436-a5af3365683c
Diffstat (limited to 'libssh/sftp.c')
-rw-r--r--libssh/sftp.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/libssh/sftp.c b/libssh/sftp.c
index 8e293e19..a78a4b08 100644
--- a/libssh/sftp.c
+++ b/libssh/sftp.c
@@ -42,6 +42,8 @@ MA 02111-1307, USA. */
static void sftp_packet_free(SFTP_PACKET *packet);
void sftp_enqueue(SFTP_SESSION *session, SFTP_MESSAGE *msg);
static void sftp_message_free(SFTP_MESSAGE *msg);
+SFTP_PACKET *sftp_packet_read(SFTP_SESSION *sftp);
+int sftp_packet_write(SFTP_SESSION *sftp,u8 type, BUFFER *payload);
SFTP_SESSION *sftp_new(SSH_SESSION *session){
SFTP_SESSION *sftp=malloc(sizeof(SFTP_SESSION));
@@ -68,6 +70,35 @@ SFTP_SESSION *sftp_server_new(SSH_SESSION *session, CHANNEL *chan){
sftp->channel=chan;
return sftp;
}
+
+int sftp_server_init(SFTP_SESSION *sftp){
+ SFTP_PACKET *packet=sftp_packet_read(sftp);
+ u32 version;
+ BUFFER *reply;
+ if(!packet)
+ return -1;
+ if(packet->type != SSH_FXP_INIT){
+ ssh_set_error(sftp->session,SSH_FATAL,"Packet read of type %d instead of SSH_FXP_INIT",
+ packet->type);
+ sftp_packet_free(packet);
+ return -1;
+ }
+ ssh_say(2,"received SSH_FXP_INIT\n");
+ buffer_get_u32(packet->payload,&version);
+ version=ntohl(version);
+ ssh_say(2,"client version %d\n");
+ 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);
+ return -1;
+ }
+ buffer_free(reply);
+ ssh_say(2,"server version sent\n");
+ return 0;
+}
#endif
void sftp_free(SFTP_SESSION *sftp){