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',