Bug#525048: [PATCH] sort -m: don't segfault when output file is also an input file

2009-04-22 Thread Jim Meyering
Thanks to Otavio Salvador for finding/reporting this.

Here's the patch I'm considering:

From 570beb56f58bb087a614af885bec7e9cf6b19423 Mon Sep 17 00:00:00 2001
From: Jim Meyering meyer...@redhat.com
Date: Wed, 22 Apr 2009 08:45:27 +0200
Subject: [PATCH] sort -m: don't segfault when output file is also an input file

* src/sort.c (avoid_trashing_input): Fix an off-by-one error and
guard the use of memmove.
* NEWS (Bug fixes): Mention it.
* tests/misc/sort: Add tests to exercise the offending code.
* THANKS: Update.
Reported by Otavio Salvador in http://bugs.debian.org/525048.
---
 NEWS|6 +-
 THANKS  |1 +
 src/sort.c  |   10 ++
 tests/misc/sort |   17 -
 4 files changed, 28 insertions(+), 6 deletions(-)

diff --git a/NEWS b/NEWS
index 5951bb5..ee44a23 100644
--- a/NEWS
+++ b/NEWS
@@ -1,9 +1,13 @@
 GNU coreutils NEWS-*- outline -*-

-* Noteworthy changes in release ?.? (-??-??) [?]
+* Noteworthy changes in release 7.3 (-??-??) [?]

 ** Bug fixes

+  sort -m no longer segfaults when its output file is also an input file.
+  E.g., with this, touch 1; sort -m -o 1 1, sort would segfault.
+  [introduced in coreutils-7.2]
+
   ls now aligns output correctly in the presence of abbreviated month
   names from the locale database that have differing widths.

diff --git a/THANKS b/THANKS
index fe523fe..876a6b6 100644
--- a/THANKS
+++ b/THANKS
@@ -435,6 +435,7 @@ Ole Laursen o...@hardworking.dk
 Oliver Kiddle   okid...@yahoo.co.uk
 Ørn E. Hansen   oehan...@daimi.aau.dk
 Oskar Liljeblad o...@hem.passagen.se
+Otavio Salvador ota...@ossystems.com.br
 Pádraig Brady   p...@draigbrady.com
 Patrick Mauritz oxyg...@studentenbude.ath.cx
 Paul D. Smith   psm...@gnu.org
diff --git a/src/sort.c b/src/sort.c
index 2e6ce87..f48d727 100644
--- a/src/sort.c
+++ b/src/sort.c
@@ -1,5 +1,5 @@
 /* sort - sort lines of text (with all kinds of options).
-   Copyright (C) 1988, 1991-2008 Free Software Foundation, Inc.
+   Copyright (C) 1988, 1991-2009 Free Software Foundation, Inc.

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -2602,18 +2602,20 @@ avoid_trashing_input (struct sortfile *files, size_t 
ntemps,
  pid_t pid;
  char *temp = create_temp (tftp, pid);
  size_t num_merged = 0;
- while (i + num_merged  nfiles)
+ do
{
  num_merged += mergefiles (files[i], 0, nfiles - i, tftp, temp);
  files[i].name = temp;
  files[i].pid = pid;

- memmove(files[i], files[i + num_merged],
- num_merged * sizeof *files);
+ if (i + num_merged  nfiles)
+   memmove(files[i + 1], files[i + num_merged],
+   num_merged * sizeof *files);
  ntemps += 1;
  nfiles -= num_merged - 1;;
  i += num_merged;
}
+ while (i  nfiles);
}
 }

diff --git a/tests/misc/sort b/tests/misc/sort
index 4f377df..a27f47a 100755
--- a/tests/misc/sort
+++ b/tests/misc/sort
@@ -1,6 +1,6 @@
 #!/usr/bin/perl

-# Copyright (C) 2008 Free Software Foundation, Inc.
+# Copyright (C) 2008, 2009 Free Software Foundation, Inc.

 # This program is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -339,6 +339,21 @@ my @Tests =
 [sort-numeric, '--sort=numeric', {IN=.01\n0\n}, {OUT=0\n.01\n}],
 [sort-gennum, '--sort=general-numeric',
   {IN=1e2\n2e1\n}, {OUT=2e1\n1e2\n}],
+
+# -m with output file also used as an input file
+# In coreutils-7.2, this caused a segfault.
+# This test looks a little strange.  Here's why:
+# since we're using -o f, standard output will be empty, hence OUT=''
+# We still want to ensure that the output file, f has expected contents,
+# hence the added CMP= directive.
+[output-is-input, '-m -o f', {IN= {f= a\n}}, {OUT=''},
+ {CMP= [a\n, {'f'= undef}]} ],
+[output-is-input-2, '-m -o f', {OUT=''},
+ {IN= {f= a\n}}, {IN= {g= b\n}}, {IN= {h= c\n}},
+ {CMP= [a\nb\nc\n, {'f'= undef}]} ],
+[output-is-input-3, '-m -o f', {OUT=''},
+ {IN= {g= a\n}}, {IN= {h= b\n}}, {IN= {f= c\n}},
+ {CMP= [a\nb\nc\n, {'f'= undef}]} ],
 );

 # Add _POSIX2_VERSION=199209 to the environment of each test
--
1.6.3.rc1.205.g37f8



--
To UNSUBSCRIBE, email to debian-bugs-rc-requ...@lists.debian.org
with a subject of unsubscribe. Trouble? Contact listmas...@lists.debian.org



Bug#525048: [PATCH] sort -m: don't segfault when output file is also an input file

2009-04-22 Thread Otavio Salvador
Hello Jim,

On Wed, Apr 22, 2009 at 3:51 AM, Jim Meyering j...@meyering.net wrote:
 Thanks to Otavio Salvador for finding/reporting this.

 Here's the patch I'm considering:

I think it sorts it out; it would be nice to have it fixed in Debian
in meanwhile so it makes our life easier (I'm using the stable package
right now due that issue).

Anyway, thanks by looking at it.

-- 
Otavio Salvador  O.S. Systems
E-mail: ota...@ossystems.com.br  http://www.ossystems.com.br
Mobile: +55 53 9981-7854 http://projetos.ossystems.com.br



-- 
To UNSUBSCRIBE, email to debian-bugs-rc-requ...@lists.debian.org
with a subject of unsubscribe. Trouble? Contact listmas...@lists.debian.org