Fix the SSH2 key re-exchange bug. Session id != exchange hash,
[u/mdw/putty] / scp.c
diff --git a/scp.c b/scp.c
index a4c0303..c53e6b6 100644 (file)
--- a/scp.c
+++ b/scp.c
@@ -20,6 +20,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <time.h>
+#include <assert.h>
 /* GUI Adaptation - Sept 2000 */
 #include <winuser.h>
 #include <winbase.h>
@@ -74,9 +75,18 @@ static void send_str_msg(unsigned int msg_id, char *str);
 static void gui_update_stats(char *name, unsigned long size,
                              int percentage, unsigned long elapsed);
 
-void begin_session(void) { }
 void logevent(char *string) { }
 
+void ldisc_send(char *buf, int len) {
+    /*
+     * This is only here because of the calls to ldisc_send(NULL,
+     * 0) in ssh.c. Nothing in PSCP actually needs to use the ldisc
+     * as an ldisc. So if we get called with any real data, I want
+     * to know about it.
+     */
+    assert(len == 0);
+}
+
 void verify_ssh_host_key(char *host, int port, char *keytype,
                          char *keystr, char *fingerprint) {
     int ret;
@@ -299,8 +309,8 @@ void from_backend(int is_stderr, char *data, int datalen) {
     if (len > 0) {
         if (pendsize < pendlen + len) {
             pendsize = pendlen + len + 4096;
-            pending = (pending ? realloc(pending, pendsize) :
-                       malloc(pendsize));
+            pending = (pending ? srealloc(pending, pendsize) :
+                       smalloc(pendsize));
             if (!pending)
                 fatalbox("Out of memory");
         }
@@ -327,7 +337,7 @@ static int ssh_scp_recv(unsigned char *buf, int len) {
         pendlen -= pendused;
         if (pendlen == 0) {
             pendsize = 0;
-            free(pending);
+            sfree(pending);
             pending = NULL;
         }
         if (outlen == 0)
@@ -436,6 +446,7 @@ static int get_password(const char *prompt, char *str, int maxlen)
 static void do_cmd(char *host, char *user, char *cmd)
 {
     char *err, *realhost;
+    DWORD namelen;
 
     if (host == NULL || host[0] == '\0')
        bump("Empty host name");
@@ -455,7 +466,15 @@ static void do_cmd(char *host, char *user, char *cmd)
        strncpy(cfg.username, user, sizeof(cfg.username)-1);
        cfg.username[sizeof(cfg.username)-1] = '\0';
     } else if (cfg.username[0] == '\0') {
-       bump("Empty user name");
+       namelen = 0;
+       if (GetUserName(user, &namelen) == FALSE)
+           bump("Empty user name");
+       user = smalloc(namelen * sizeof(char));
+       GetUserName(user, &namelen);
+       if (verbose) tell_user(stderr, "Guessing user name: %s", user);
+       strncpy(cfg.username, user, sizeof(cfg.username)-1);
+       cfg.username[sizeof(cfg.username)-1] = '\0';
+       free(user);
     }
 
     if (cfg.protocol != PROT_SSH)