]> git.ipfire.org Git - thirdparty/make.git/commitdiff
* strcache.c (add_string): [SV 47071] Handle huge initial string.
authorPaul Smith <psmith@gnu.org>
Mon, 29 Feb 2016 02:32:18 +0000 (21:32 -0500)
committerPaul Smith <psmith@gnu.org>
Mon, 29 Feb 2016 06:35:02 +0000 (01:35 -0500)
If the very first string added to the string cache is more than
half the maximum size, we failed when moving the only strcache
buffer to the full list.

strcache.c

index ec59eeb759e87ce33f7fa65c15d4203d59aed715..ec0f0a57172188aa136773b1bd8904077fd931c3 100644 (file)
@@ -110,13 +110,13 @@ add_string (const char *str, unsigned int len)
   for (; *spp != NULL; spp = &(*spp)->next)
     if ((*spp)->bytesfree > sz)
       break;
+  sp = *spp;
 
   /* If nothing is big enough, make a new cache at the front.  */
-  sp = *spp;
   if (sp == NULL)
     {
       sp = new_cache (&strcache, BUFSIZE);
-      spp = &sp;
+      spp = &strcache;
     }
 
   /* Add the string to this cache.  */
@@ -124,9 +124,9 @@ add_string (const char *str, unsigned int len)
 
   /* If the amount free in this cache is less than the average string size,
      consider it full and move it to the full list.  */
-  if (sp->bytesfree < (total_size / total_strings) + 1)
+  if (total_strings > 20 && sp->bytesfree < (total_size / total_strings) + 1)
     {
-      *spp = (*spp)->next;
+      *spp = sp->next;
       sp->next = fullcache;
       fullcache = sp;
     }