bug-coreutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

plug another leak in sort


From: Jim Meyering
Subject: plug another leak in sort
Date: Mon, 13 Nov 2006 15:20:38 +0100

You can trigger this one via e.g., sort -k0:

        Plug another technically-unimportant leak in sort.
        * src/sort.c (main): Don't allocate memory for each new key here.
        (insertkey): Allocate memory for each key here, instead.
        (key_init): Rename from new_key.  Don't allocate.

diff --git a/src/sort.c b/src/sort.c
index 56a0651..bdaf032 100644
--- a/src/sort.c
+++ b/src/sort.c
@@ -2099,13 +2099,15 @@ sort (char * const *files, size_t nfiles
     }
 }

-/* Insert key KEY at the end of the key list.  */
+/* Insert a malloc'd copy of key KEY_ARG at the end of the key list.  */

 static void
-insertkey (struct keyfield *key)
+insertkey (struct keyfield *key_arg)
 {
   struct keyfield **p;
+  struct keyfield *key = xmalloc (sizeof *key);

+  *key = *key_arg;
   for (p = &keylist; *p; p = &(*p)->next)
     continue;
   *p = key;
@@ -2271,9 +2273,9 @@ set_ordering (const char *s, struct keyf
 }

 static struct keyfield *
-new_key (void)
+key_init (struct keyfield *key)
 {
-  struct keyfield *key = xzalloc (sizeof *key);
+  memset (key, 0, sizeof *key);
   key->eword = SIZE_MAX;
   return key;
 }
@@ -2282,6 +2284,7 @@ int
 main (int argc, char **argv)
 {
   struct keyfield *key;
+  struct keyfield key_buf;
   struct keyfield gkey;
   char const *s;
   int c = 0;
@@ -2408,7 +2411,7 @@ main (int argc, char **argv)
                {
                  /* Treat +POS1 [-POS2] as a key if possible; but silently
                     treat an operand as a file if it is not a valid +POS1.  */
-                 key = new_key ();
+                 key = key_init (&key_buf);
                  s = parse_field_count (optarg + 1, &key->sword, NULL);
                  if (s && *s == '.')
                    s = parse_field_count (s + 1, &key->schar, NULL);
@@ -2463,7 +2466,7 @@ main (int argc, char **argv)
          break;

        case 'k':
-         key = new_key ();
+         key = key_init (&key_buf);

          /* Get POS1. */
          s = parse_field_count (optarg, &key->sword,
M ChangeLog
M src/sort.c
Committed as 2061f0484753bb8de0fb9dd5821ee983ceda2e23




reply via email to

[Prev in Thread] Current Thread [Next in Thread]