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 _______________________________________________ Bug-coreutils mailing list Bug-coreutils@gnu.org http://lists.gnu.org/mailman/listinfo/bug-coreutils