Ensure our network layer is properly cleaned up before PuTTY exits.
[u/mdw/putty] / misc.c
diff --git a/misc.c b/misc.c
index 4af00d6..ee1abf7 100644 (file)
--- a/misc.c
+++ b/misc.c
@@ -4,7 +4,53 @@
 #include <assert.h>
 #include "putty.h"
 
-/*
+/* ----------------------------------------------------------------------
+ * String handling routines.
+ */
+
+char *dupstr(char *s)
+{
+    int len = strlen(s);
+    char *p = smalloc(len + 1);
+    strcpy(p, s);
+    return p;
+}
+
+/* Allocate the concatenation of N strings. Terminate arg list with NULL. */
+char *dupcat(char *s1, ...)
+{
+    int len;
+    char *p, *q, *sn;
+    va_list ap;
+
+    len = strlen(s1);
+    va_start(ap, s1);
+    while (1) {
+       sn = va_arg(ap, char *);
+       if (!sn)
+           break;
+       len += strlen(sn);
+    }
+    va_end(ap);
+
+    p = smalloc(len + 1);
+    strcpy(p, s1);
+    q = p + strlen(p);
+
+    va_start(ap, s1);
+    while (1) {
+       sn = va_arg(ap, char *);
+       if (!sn)
+           break;
+       strcpy(q, sn);
+       q += strlen(q);
+    }
+    va_end(ap);
+
+    return p;
+}
+
+/* ----------------------------------------------------------------------
  * Generic routines to deal with send buffers: a linked list of
  * smallish blocks, with the operations
  * 
@@ -99,7 +145,7 @@ void bufchain_prefix(bufchain *ch, void **data, int *len)
     *data = ch->head->buf + ch->head->bufpos;
 }
 
-/*
+/* ----------------------------------------------------------------------
  * My own versions of malloc, realloc and free. Because I want
  * malloc and realloc to bomb out and exit the program if they run
  * out of memory, realloc to reliably call malloc if passed a NULL
@@ -333,8 +379,13 @@ static void *minefield_c_realloc(void *p, size_t size)
 #ifdef MALLOC_LOG
 static FILE *fp = NULL;
 
+static char *mlog_file = NULL;
+static int mlog_line = 0;
+
 void mlog(char *file, int line)
 {
+    mlog_file = file;
+    mlog_line = line;
     if (!fp) {
        fp = fopen("putty_mem.log", "w");
        setvbuf(fp, NULL, _IONBF, BUFSIZ);
@@ -353,9 +404,18 @@ void *safemalloc(size_t size)
     p = malloc(size);
 #endif
     if (!p) {
-       MessageBox(NULL, "Out of memory!", "PuTTY Fatal Error",
+       char str[200];
+#ifdef MALLOC_LOG
+       sprintf(str, "Out of memory! (%s:%d, size=%d)",
+               mlog_file, mlog_line, size);
+       fprintf(fp, "*** %s\n", str);
+       fclose(fp);
+#else
+       strcpy(str, "Out of memory!");
+#endif
+       MessageBox(NULL, str, "PuTTY Fatal Error",
                   MB_SYSTEMMODAL | MB_ICONERROR | MB_OK);
-       exit(1);
+       cleanup_exit(1);
     }
 #ifdef MALLOC_LOG
     if (fp)
@@ -381,9 +441,18 @@ void *saferealloc(void *ptr, size_t size)
 #endif
     }
     if (!p) {
-       MessageBox(NULL, "Out of memory!", "PuTTY Fatal Error",
+       char str[200];
+#ifdef MALLOC_LOG
+       sprintf(str, "Out of memory! (%s:%d, size=%d)",
+               mlog_file, mlog_line, size);
+       fprintf(fp, "*** %s\n", str);
+       fclose(fp);
+#else
+       strcpy(str, "Out of memory!");
+#endif
+       MessageBox(NULL, str, "PuTTY Fatal Error",
                   MB_SYSTEMMODAL | MB_ICONERROR | MB_OK);
-       exit(1);
+       cleanup_exit(1);
     }
 #ifdef MALLOC_LOG
     if (fp)
@@ -411,6 +480,10 @@ void safefree(void *ptr)
 #endif
 }
 
+/* ----------------------------------------------------------------------
+ * Debugging routines.
+ */
+
 #ifdef DEBUG
 static FILE *debug_fp = NULL;
 static int debug_got_console = 0;