Incoming ftp session cannot be same as sending session (when
[silc.git] / lib / silcclient / client_ftp.c
index 24233fc8fc5a2f84056f3dcd05a69182abec5d6f..aed0f01cc60ed7d8b5123343c90a6bb4f4674015 100644 (file)
@@ -313,12 +313,8 @@ static void silc_client_ftp_open_handle(SilcSFTP sftp,
 
   /* Open the actual local file */
   memset(path, 0, sizeof(path));
-  if (session->path && strlen(session->path) < sizeof(path))
-    strncat(path, session->path, strlen(session->path));
-  if (strlen(session->filepath) > sizeof(path) - strlen(path))
-    strncat(path, session->filepath, sizeof(path) - strlen(path) - 1);
-  else
-    strncat(path, session->filepath, strlen(session->filepath));
+  snprintf(path, sizeof(path) - 1, "%s%s", session->path ?
+          session->path : "", session->filepath);
   session->fd = silc_file_open(path, O_RDWR | O_CREAT | O_EXCL);
   if (session->fd < 0) {
     /* Call monitor callback */
@@ -697,7 +693,6 @@ void silc_client_ftp_free_sessions(SilcClient client,
       silc_client_ftp_session_free(session);
     }
     silc_dlist_del(conn->ftp_sessions, session);
-    silc_dlist_uninit(conn->ftp_sessions);
   }
 }
 
@@ -730,7 +725,11 @@ void silc_client_ftp_session_free(SilcClientFtpSession session)
 
   SILC_LOG_DEBUG(("Free session"));
 
-  silc_dlist_del(session->conn->ftp_sessions, session);
+  if (session->conn && session->conn->ftp_sessions)
+    silc_dlist_del(session->conn->ftp_sessions, session);
+
+  if (session->conn && session->conn->active_session == session)
+    session->conn->active_session = NULL;
 
   if (session->sftp) {
     if (session->server)
@@ -773,6 +772,8 @@ void silc_client_ftp_session_free(SilcClientFtpSession session)
 
   silc_free(session->hostname);
   silc_free(session->filepath);
+  silc_free(session->path);
+  memset(session, 'F', sizeof(*session));
   silc_free(session);
 }
 
@@ -1034,7 +1035,7 @@ static void silc_client_ftp_resolve_cb(SilcClient client,
 
   silc_dlist_start(conn->ftp_sessions);
   while ((session = silc_dlist_get(conn->ftp_sessions)) != SILC_LIST_END) {
-    if (session->client_entry == client_entry)
+    if (session->client_entry == client_entry && !session->server)
       break;
   }