]> sourceware.org Git - newlib-cygwin.git/commitdiff
* heap.cc (heap_init): Be slightly more aggressive when trying to allocate
authorChristopher Faylor <me@cgf.cx>
Sat, 10 Sep 2005 01:37:20 +0000 (01:37 +0000)
committerChristopher Faylor <me@cgf.cx>
Sat, 10 Sep 2005 01:37:20 +0000 (01:37 +0000)
heap.  Change fatal error to avoid confusion with cygheap.
* spawn.cc (linebuf::finish): New function.
(linebuf::add): Cosmetic change.
(spawn_guts): Only avoid building windows command line if the program being
executed was actually mounted with -X.  Don't return E2BIG if we hit the 32K
size and we're executing a detected cygwin program.  Just silently truncate the
windows command line, instead.

winsup/cygwin/ChangeLog
winsup/cygwin/heap.cc
winsup/cygwin/spawn.cc

index 034e350bbad878a0550e40a2e680fa5885bff760..80bd48798182382fbcb78e6f756fcddd5a713d3e 100644 (file)
@@ -1,7 +1,20 @@
+2005-09-09  Christopher Faylor  <cgf@timesys.com>
+
+       * heap.cc (heap_init): Be slightly more aggressive when trying to
+       allocate heap.  Change fatal error to avoid confusion with cygheap.
+
+       * spawn.cc (linebuf::finish): New function.
+       (linebuf::add): Cosmetic change.
+       (spawn_guts): Only avoid building windows command line if the program
+       being executed was actually mounted with -X.  Don't return E2BIG if we
+       hit the 32K size and we're executing a detected cygwin program.  Just
+       silently truncate the windows command line, instead.
+
 2005-09-08  Christopher Faylor  <cgf@timesys.com>
 
        * fhandler_serial.cc (fhandler_serial::tcgetattr): Just zero c_cflag
        here rather than clearing CBAUD after the fact.
+       * termios.cc (tcgetattr): Revert previous change.
 
 2005-09-08  Christopher Faylor  <cgf@timesys.com>
 
        dirent_saw_dev.
        * dir.cc (opendir): Don't zero __flags here.  Push that responsibility
        to opendir methods.
-       (seekdir): Preserve dirent_isrrot in __flags.
+       (seekdir): Preserve dirent_isroot in __flags.
        (rewinddir): Ditto.
        * fhandler_disk_file.cc (fhandler_disk_file::opendir): Set
        dirent_isroot appropriately.
index 9f86f9911ef3738d6bd5a48b8dcffed41f7e6bd6..739b59711475c1ca214344c9d4d88b45015756e7 100644 (file)
@@ -73,11 +73,11 @@ heap_init ()
                                     MEM_RESERVE, PAGE_READWRITE);
          if (p)
            break;
-         if ((reserve_size -= page_const) <= allocsize)
+         if ((reserve_size -= page_const) < allocsize)
            break;
        }
       if (!p)
-       api_fatal ("couldn't allocate cygwin heap, %E, base %p, top %p, "
+       api_fatal ("couldn't allocate heap, %E, base %p, top %p, "
                   "reserve_size %d, allocsize %d, page_const %d",
                   cygheap->user_heap.base, cygheap->user_heap.top,
                   reserve_size, allocsize, page_const);
index 39d2948df5fe63eb1e91e351732c7bb897eb0a0e..d419e3c070a322b849ddbbb47f7b8ddeaa3f7b3c 100644 (file)
@@ -35,6 +35,7 @@ details. */
 #include "cygtls.h"
 
 #define LINE_BUF_CHUNK (CYG_MAX_PATH * 2)
+#define MAXWINCMDLEN 32767
 
 static suffix_info std_suffixes[] =
 {
@@ -231,16 +232,30 @@ class linebuf
   size_t alloced;
   linebuf () : ix (0), buf (NULL), alloced (0) {}
   ~linebuf () {if (buf) free (buf);}
-  void add (const char *what, int len);
+  void add (const char *what, int len) __attribute__ ((regparm (3)));
   void add (const char *what) {add (what, strlen (what));}
   void prepend (const char *what, int len);
+  void finish (bool) __attribute__ ((regparm (2)));
 };
 
+void
+linebuf::finish (bool cmdlenoverflow_ok)
+{
+  if (!ix)
+    add ("", 1);
+  else
+    {
+      if (ix-- > MAXWINCMDLEN && cmdlenoverflow_ok)
+       ix = MAXWINCMDLEN - 1;
+      buf[ix] = '\0';
+    }
+}
+
 void
 linebuf::add (const char *what, int len)
 {
-  size_t newix;
-  if ((newix = ix + len) >= alloced || !buf)
+  size_t newix = ix + len;
+  if (newix >= alloced || !buf)
     {
       alloced += LINE_BUF_CHUNK + newix;
       buf = (char *) realloc (buf, alloced + 1);
@@ -470,12 +485,12 @@ spawn_guts (const char * prog_arg, const char *const *argv,
       goto out;
     }
 
-  MALLOC_CHECK;
+  bool wascygexec = real_path.iscygexec ();
   res = newargv.fixup (chtype, prog_arg, real_path, ext);
   if (res)
     goto out;
 
-  if (real_path.iscygexec ())
+  if (wascygexec)
     newargv.dup_all ();
   else
     {
@@ -522,19 +537,12 @@ spawn_guts (const char * prog_arg, const char *const *argv,
                one_line.add (a);
              one_line.add ("\"", 1);
            }
-         MALLOC_CHECK;
          one_line.add (" ", 1);
-         MALLOC_CHECK;
        }
 
-      MALLOC_CHECK;
-      if (one_line.ix)
-       one_line.buf[one_line.ix - 1] = '\0';
-      else
-       one_line.add ("", 1);
-      MALLOC_CHECK;
+      one_line.finish (real_path.iscygexec ());
 
-      if (one_line.ix > 32767)
+      if (one_line.ix >= MAXWINCMDLEN)
        {
          debug_printf ("Command line too long (>32K), return E2BIG");
          set_errno (E2BIG);
@@ -690,10 +698,8 @@ spawn_guts (const char * prog_arg, const char *const *argv,
   if (mode != _P_OVERLAY || !rc)
     cygheap->user.reimpersonate ();
 
-  MALLOC_CHECK;
   if (envblock)
     free (envblock);
-  MALLOC_CHECK;
 
   /* Set errno now so that debugging messages from it appear before our
      final debugging message [this is a general rule for debugging
This page took 0.040606 seconds and 5 git commands to generate.