From 25eb4c69097ca4f5665b050cfa4247a19ffd8c55 Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Wed, 22 Apr 2009 08:45:27 +0200 Subject: 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. --- src/sort.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/sort.c b/src/sort.c index 2e6ce877d..f48d727df 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); } } -- cgit v1.2.3-54-g00ecf