* src/bdf/bdflib.c (bdf_load_font): Allocate the _bdf_parse_t
structure with FT_ALLOC instead of using the stack.
diff --git a/src/bdf/bdflib.c b/src/bdf/bdflib.c
index 89c4a68..7496e60 100644
--- a/src/bdf/bdflib.c
+++ b/src/bdf/bdflib.c
@@ -2202,96 +2202,98 @@
                  bdf_font_t*    *font )
   {
     unsigned long  lineno;
-    _bdf_parse_t   p;
+    _bdf_parse_t   *p;
 
-    FT_Memory      memory = NULL;
+    FT_Memory      memory = extmemory;
     FT_Error       error  = BDF_Err_Ok;
 
 
-    FT_MEM_ZERO( &p, sizeof ( _bdf_parse_t ) );
+    if ( FT_ALLOC( p, sizeof ( _bdf_parse_t ) ) )
+      goto Exit;
 
-    p.opts   = (bdf_options_t*)( ( opts != 0 ) ? opts : &_bdf_opts );
-    p.minlb  = 32767;
-    p.memory = extmemory;  /* only during font creation */
+    memory    = NULL;
+    p->opts   = (bdf_options_t*)( ( opts != 0 ) ? opts : &_bdf_opts );
+    p->minlb  = 32767;
+    p->memory = extmemory;  /* only during font creation */
 
     error = _bdf_readstream( stream, _bdf_parse_start,
-                             (void *)&p, &lineno );
+                             (void *)p, &lineno );
     if ( error )
       goto Exit;
 
-    if ( p.font != 0 )
+    if ( p->font != 0 )
     {
       /* If the font is not proportional, set the font's monowidth */
       /* field to the width of the font bounding box.              */
-      memory = p.font->memory;
+      memory = p->font->memory;
 
-      if ( p.font->spacing != BDF_PROPORTIONAL )
-        p.font->monowidth = p.font->bbx.width;
+      if ( p->font->spacing != BDF_PROPORTIONAL )
+        p->font->monowidth = p->font->bbx.width;
 
       /* If the number of glyphs loaded is not that of the original count, */
       /* indicate the difference.                                          */
-      if ( p.cnt != p.font->glyphs_used + p.font->unencoded_used )
+      if ( p->cnt != p->font->glyphs_used + p->font->unencoded_used )
       {
-        FT_TRACE2(( "bdf_load_font: " ACMSG15, p.cnt,
-                    p.font->glyphs_used + p.font->unencoded_used ));
-        p.font->modified = 1;
+        FT_TRACE2(( "bdf_load_font: " ACMSG15, p->cnt,
+                    p->font->glyphs_used + p->font->unencoded_used ));
+        p->font->modified = 1;
       }
 
       /* Once the font has been loaded, adjust the overall font metrics if */
       /* necessary.                                                        */
-      if ( p.opts->correct_metrics != 0 &&
-           ( p.font->glyphs_used > 0 || p.font->unencoded_used > 0 ) )
+      if ( p->opts->correct_metrics != 0 &&
+           ( p->font->glyphs_used > 0 || p->font->unencoded_used > 0 ) )
       {
-        if ( p.maxrb - p.minlb != p.font->bbx.width )
+        if ( p->maxrb - p->minlb != p->font->bbx.width )
         {
           FT_TRACE2(( "bdf_load_font: " ACMSG3,
-                      p.font->bbx.width, p.maxrb - p.minlb ));
-          p.font->bbx.width = (unsigned short)( p.maxrb - p.minlb );
-          p.font->modified  = 1;
+                      p->font->bbx.width, p->maxrb - p->minlb ));
+          p->font->bbx.width = (unsigned short)( p->maxrb - p->minlb );
+          p->font->modified  = 1;
         }
 
-        if ( p.font->bbx.x_offset != p.minlb )
+        if ( p->font->bbx.x_offset != p->minlb )
         {
           FT_TRACE2(( "bdf_load_font: " ACMSG4,
-                      p.font->bbx.x_offset, p.minlb ));
-          p.font->bbx.x_offset = p.minlb;
-          p.font->modified     = 1;
+                      p->font->bbx.x_offset, p->minlb ));
+          p->font->bbx.x_offset = p->minlb;
+          p->font->modified     = 1;
         }
 
-        if ( p.font->bbx.ascent != p.maxas )
+        if ( p->font->bbx.ascent != p->maxas )
         {
           FT_TRACE2(( "bdf_load_font: " ACMSG5,
-                      p.font->bbx.ascent, p.maxas ));
-          p.font->bbx.ascent = p.maxas;
-          p.font->modified   = 1;
+                      p->font->bbx.ascent, p->maxas ));
+          p->font->bbx.ascent = p->maxas;
+          p->font->modified   = 1;
         }
 
-        if ( p.font->bbx.descent != p.maxds )
+        if ( p->font->bbx.descent != p->maxds )
         {
           FT_TRACE2(( "bdf_load_font: " ACMSG6,
-                      p.font->bbx.descent, p.maxds ));
-          p.font->bbx.descent  = p.maxds;
-          p.font->bbx.y_offset = (short)( -p.maxds );
-          p.font->modified     = 1;
+                      p->font->bbx.descent, p->maxds ));
+          p->font->bbx.descent  = p->maxds;
+          p->font->bbx.y_offset = (short)( -p->maxds );
+          p->font->modified     = 1;
         }
 
-        if ( p.maxas + p.maxds != p.font->bbx.height )
+        if ( p->maxas + p->maxds != p->font->bbx.height )
         {
           FT_TRACE2(( "bdf_load_font: " ACMSG7,
-                      p.font->bbx.height, p.maxas + p.maxds ));
-          p.font->bbx.height = (unsigned short)( p.maxas + p.maxds );
+                      p->font->bbx.height, p->maxas + p->maxds ));
+          p->font->bbx.height = (unsigned short)( p->maxas + p->maxds );
         }
 
-        if ( p.flags & _BDF_SWIDTH_ADJ )
+        if ( p->flags & _BDF_SWIDTH_ADJ )
           FT_TRACE2(( "bdf_load_font: " ACMSG8 ));
       }
     }
 
-    if ( p.flags & _BDF_START )
+    if ( p->flags & _BDF_START )
     {
       {
         /* The ENDFONT field was never reached or did not exist. */
-        if ( !( p.flags & _BDF_GLYPHS ) )
+        if ( !( p->flags & _BDF_GLYPHS ) )
           /* Error happened while parsing header. */
           FT_ERROR(( "bdf_load_font: " ERRMSG2, lineno ));
         else
@@ -2302,28 +2304,34 @@
 
     /* Free up the list used during the parsing. */
     if ( memory != NULL )
-      FT_FREE( p.list.field );
+      FT_FREE( p->list.field );
 
-    if ( p.font != 0 )
+    if ( p->font != 0 )
     {
       /* Make sure the comments are NULL terminated if they exist. */
-      memory = p.font->memory;
+      memory = p->font->memory;
 
-      if ( p.font->comments_len > 0 ) {
-        if ( FT_RENEW_ARRAY( p.font->comments,
-                             p.font->comments_len,
-                             p.font->comments_len + 1 ) )
+      if ( p->font->comments_len > 0 ) {
+        if ( FT_RENEW_ARRAY( p->font->comments,
+                             p->font->comments_len,
+                             p->font->comments_len + 1 ) )
           goto Exit;
 
-        p.font->comments[p.font->comments_len] = 0;
+        p->font->comments[p->font->comments_len] = 0;
       }
     }
     else if ( error == BDF_Err_Ok )
       error = BDF_Err_Invalid_File_Format;
 
-    *font = p.font;
+    *font = p->font;
 
   Exit:
+    if ( p )
+    {
+      memory = extmemory;
+      FT_FREE( p );
+    }
+
     return error;
   }