Because you cannot call malloc() during DLL initialization under win16,
authorRichard Basch <probe@mit.edu>
Tue, 18 Feb 1997 07:31:49 +0000 (07:31 +0000)
committerRichard Basch <probe@mit.edu>
Tue, 18 Feb 1997 07:31:49 +0000 (07:31 +0000)
we must pre-allocate an array sufficiently large to hold several error
tables.

git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@9895 dc483132-0cff-0310-8789-dd5450dbe970

src/util/et/error_message.c

index 0241409363832fb15a38465fcf6d934e6c9464bd..e24bb2ced77295fcef10f7fd107fa68a352c6c97 100644 (file)
@@ -168,6 +168,10 @@ add_error_table(et)
     const struct error_table FAR * et;
 {
     struct et_list *el = _et_list;
+#ifdef _MSDOS
+    static struct et_list etl[32];
+    static int etl_used = 0;
+#endif
 
     while (el) {
        if (el->table->base == et->base)
@@ -175,8 +179,18 @@ add_error_table(et)
        el = el->next;
     }
 
-    if (! (el = (struct et_list *)malloc(sizeof(struct et_list))))
-       return ENOMEM;
+#ifdef _MSDOS
+    /*
+     * Win16 applications cannot call malloc while the DLL is being
+     * initialized...  To get around this, we pre-allocate an array
+     * sufficient to hold several error tables.
+     */
+    if (etl_used < sizeof(etl)/sizeof(struct et_list))
+       el = &etl[etl_used++];
+    else
+#endif
+       if (!(el = (struct et_list *)malloc(sizeof(struct et_list))))
+           return ENOMEM;
 
     el->table = et;
     el->next = _et_list;