Allocate the decompression buffer for the --manual option on the heap
authorDan Fandrich <dan@coneharvesters.com>
Mon, 21 Apr 2008 23:17:20 +0000 (23:17 +0000)
committerDan Fandrich <dan@coneharvesters.com>
Mon, 21 Apr 2008 23:17:20 +0000 (23:17 +0000)
instead of the stack.

src/mkhelp.pl

index 871aabc..7fb37db 100644 (file)
@@ -120,6 +120,7 @@ HEAD
     ;
 if($c) {
     print <<HEAD
+#include <stdlib.h>
 #include <zlib.h>
 static const unsigned char hugehelpgz[] = {
   /* This mumbo-jumbo is the huge help text compressed with gzip.
@@ -144,10 +145,11 @@ HEAD
     print "\n};\n";
 
     print <<EOF
+#define BUF_SIZE 0x10000
 /* Decompress and send to stdout a gzip-compressed buffer */
 void hugehelp(void)
 {
-  unsigned char buf[0x10000];
+  unsigned char* buf;
   int status,headerlen;
   z_stream z;
 
@@ -165,17 +167,21 @@ void hugehelp(void)
   if (inflateInit2(&z, -MAX_WBITS) != Z_OK)
     return;
 
-  while(1) {
-    z.avail_out = (int)sizeof(buf);
-    z.next_out = buf;
-    status = inflate(&z, Z_SYNC_FLUSH);
-    if (status == Z_OK || status == Z_STREAM_END) {
-      fwrite(buf, sizeof(buf) - z.avail_out, 1, stdout);
-      if (status == Z_STREAM_END)
-         break;
+  buf = malloc(BUF_SIZE);
+  if (buf) {
+    while(1) {
+      z.avail_out = BUF_SIZE;
+      z.next_out = buf;
+      status = inflate(&z, Z_SYNC_FLUSH);
+      if (status == Z_OK || status == Z_STREAM_END) {
+       fwrite(buf, BUF_SIZE - z.avail_out, 1, stdout);
+       if (status == Z_STREAM_END)
+          break;
+      }
+       else
+       break;    /* Error */
     }
-     else
-      break;    /* Error */
+    free(buf);
   }
   inflateEnd(&z);
 }