]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
cut: avoid a redundant heap allocation
authorCojocaru Alexandru <xojoc@gmx.com>
Thu, 6 Dec 2012 02:03:41 +0000 (03:03 +0100)
committerPádraig Brady <P@draigBrady.com>
Thu, 6 Dec 2012 18:29:23 +0000 (18:29 +0000)
* src/cut.c (set_fields): Don't allocate memory for
`printable_field' if there are no finite ranges.
This is achieved by keeping max_range_endpoint as 0 when
there are no finite ranges.  max_range_endpoint is then
used throughout the code to guard against allocation of,
and access to the bit array.
The extra allocation was introduced via commit v8.10-3-g2e636af.

src/cut.c

index dc830721df9c2b39964a8610f573615ed5fc4c63..de9320c9fb6bcf6b1834025aa94713312862bbb5 100644 (file)
--- a/src/cut.c
+++ b/src/cut.c
@@ -500,14 +500,13 @@ set_fields (const char *fieldstr)
       if (rp[i].hi > max_range_endpoint)
         max_range_endpoint = rp[i].hi;
     }
-  if (max_range_endpoint < eol_range_start)
-    max_range_endpoint = eol_range_start;
 
   /* Allocate an array large enough so that it may be indexed by
      the field numbers corresponding to all finite ranges
      (i.e. '2-6' or '-4', but not '5-') in FIELDSTR.  */
 
-  printable_field = xzalloc (max_range_endpoint / CHAR_BIT + 1);
+  if (max_range_endpoint)
+    printable_field = xzalloc (max_range_endpoint / CHAR_BIT + 1);
 
   qsort (rp, n_rp, sizeof (rp[0]), compare_ranges);
 
@@ -531,7 +530,8 @@ set_fields (const char *fieldstr)
 
   if (output_delimiter_specified
       && !complement
-      && eol_range_start && !is_printable_field (eol_range_start))
+      && eol_range_start
+      && max_range_endpoint && !is_printable_field (eol_range_start))
     mark_range_start (eol_range_start);
 
   free (rp);