diff -urNp coreutils-8.17-orig/src/sort.c coreutils-8.17/src/sort.c --- coreutils-8.17-orig/src/sort.c 2012-08-20 13:15:39.703470009 +0200 +++ coreutils-8.17/src/sort.c 2012-08-20 13:29:47.177468563 +0200 @@ -292,6 +292,9 @@ struct merge_node_queue when popping. */ }; +/* Used to implement --unique (-u). */ +static struct line saved_line; + /* FIXME: None of these tables work with multibyte character sets. Also, there are many other bugs when handling multibyte characters. One way to fix this is to rewrite 'sort' to use wide characters @@ -3943,13 +3946,12 @@ queue_pop (struct merge_node_queue *queu static void write_unique (struct line const *line, FILE *tfp, char const *temp_output) { - static struct line saved; if (unique) { - if (saved.text && ! compare (line, &saved)) + if (saved_line.text && ! compare (line, &saved_line)) return; - saved = *line; + saved_line = *line; } write_line (line, tfp, temp_output); @@ -4451,6 +4453,7 @@ sort (char *const *files, size_t nfiles, break; } + saved_line.text = NULL; line = buffer_linelim (&buf); if (buf.eof && !nfiles && !ntemps && !buf.left) { diff -urNp coreutils-8.17-orig/tests/misc/sort coreutils-8.17/tests/misc/sort --- coreutils-8.17-orig/tests/misc/sort 2012-02-03 10:22:06.000000000 +0100 +++ coreutils-8.17/tests/misc/sort 2012-08-20 13:31:38.685565488 +0200 @@ -226,6 +226,10 @@ my @Tests = ["15c", '-i -u', {IN=>"a\1\na\n"}, {OUT=>"a\1\n"}], ["15d", '-i -u', {IN=>"\1a\na\n"}, {OUT=>"\1a\n"}], ["15e", '-i -u', {IN=>"a\n\1\1\1\1\1a\1\1\1\1\n"}, {OUT=>"a\n"}], +# Before 8.19, this would trigger a free-memory read. +["unique-free-mem-read", '-u --p=1 -S32b', + {IN=>"a\n"."b"x900 ."\n"}, + {OUT=>"a\n"."b"x900 ."\n"}], # From Erick Branderhorst -- fixed around 1.19e ["16a", '-f',