diff options
-rw-r--r-- | NEWS | 5 | ||||
-rw-r--r-- | src/df.c | 24 | ||||
-rw-r--r-- | tests/Makefile.am | 1 | ||||
-rwxr-xr-x | tests/df/problematic-chars | 44 |
4 files changed, 73 insertions, 1 deletions
@@ -13,6 +13,11 @@ GNU coreutils NEWS -*- outline -*- date: invalid date '\260' [This bug was present in "the beginning".] + df no longer outputs control characters present in the mount point name. + Such characters are replaced with '?', so for example, scripts consuming + lines output by df, can work reliably. + [This bug was present in "the beginning".] + head --lines=-N (-n-N) now resets the read pointer of a seekable input file. This means that "head -n-3" no longer consumes all of its input, and lines not output by head may be processed by other programs. For example, this @@ -192,6 +192,23 @@ static struct option const long_options[] = {NULL, 0, NULL, 0} }; +/* Replace problematic chars with '?'. + Since only control characters are currently considered, + this should work in all encodings. */ + +static char* +hide_problematic_chars (char *cell) +{ + char *p = cell; + while (*p) + { + if (iscntrl (to_uchar (*p))) + *p = '?'; + p++; + } + return cell; +} + /* Dynamically allocate a row of pointers in TABLE, which can then be accessed with standard 2D array notation. */ @@ -315,6 +332,8 @@ get_header (void) if (!cell) xalloc_die (); + hide_problematic_chars (cell); + table[nrows-1][field] = cell; widths[field] = MAX (widths[field], mbswidth (cell, 0)); @@ -661,7 +680,10 @@ get_dev (char const *disk, char const *mount_point, } if (cell) - widths[field] = MAX (widths[field], mbswidth (cell, 0)); + { + hide_problematic_chars (cell); + widths[field] = MAX (widths[field], mbswidth (cell, 0)); + } table[nrows-1][field] = cell; } } diff --git a/tests/Makefile.am b/tests/Makefile.am index dfac9a0f3..944c7d2e1 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -31,6 +31,7 @@ root_tests = \ cp/capability \ cp/sparse-fiemap \ dd/skip-seek-past-dev \ + df/problematic-chars \ install/install-C-root \ ls/capability \ ls/nameless-uid \ diff --git a/tests/df/problematic-chars b/tests/df/problematic-chars new file mode 100755 index 000000000..801c4d9cf --- /dev/null +++ b/tests/df/problematic-chars @@ -0,0 +1,44 @@ +#!/bin/sh +# Ensure that df outputs one line per entry + +# Copyright (C) 2012 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 +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src +print_ver_ df +require_root_ + +mnt='mount +point' + +cwd=$(pwd) +cleanup_() { cd /; umount "$cwd/$mnt"; } + +skip=0 +# Create a file system, then mount it. +dd if=/dev/zero of=blob bs=8192 count=200 > /dev/null 2>&1 \ + || skip=1 +mkdir "$mnt" || skip=1 +mkfs -t ext2 -F blob \ + || skip_ "failed to create ext2 file system" + +mount -oloop blob "$mnt" || skip=1 + +test $skip = 1 \ + && skip_ "insufficient mount/ext2 support" + +test $(df "$mnt" | wc -l) = 2 || fail=1 + +Exit $fail |