summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/expected/column/invalid-multibyte1
-rwxr-xr-xtests/ts/column/invalid-multibyte30
-rw-r--r--text-utils/column.c8
3 files changed, 38 insertions, 1 deletions
diff --git a/tests/expected/column/invalid-multibyte b/tests/expected/column/invalid-multibyte
new file mode 100644
index 000000000..7a8947266
--- /dev/null
+++ b/tests/expected/column/invalid-multibyte
@@ -0,0 +1 @@
+column: read failed: Invalid or incomplete multibyte or wide character
diff --git a/tests/ts/column/invalid-multibyte b/tests/ts/column/invalid-multibyte
new file mode 100755
index 000000000..9935a3833
--- /dev/null
+++ b/tests/ts/column/invalid-multibyte
@@ -0,0 +1,30 @@
+#!/bin/bash
+
+#
+# Copyright (C) 2014 Sami Kerola <kerolasa@iki.fi>
+#
+# This file is part of util-linux.
+#
+# This file 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 2 of the License, or
+# (at your option) any later version.
+#
+# This file 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.
+#
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="invalid multibyte"
+
+. $TS_TOPDIR/functions.sh
+ts_init "$*"
+
+ts_check_test_command "$TS_CMD_COLUMN"
+
+cd $TS_OUTDIR
+
+printf "£\n" | LC_ALL=C $TS_CMD_COLUMN >> $TS_OUTPUT 2>&1
+
+ts_finalize
diff --git a/text-utils/column.c b/text-utils/column.c
index e34184e05..0ee5a9e89 100644
--- a/text-utils/column.c
+++ b/text-utils/column.c
@@ -376,7 +376,13 @@ static int input(FILE *fp, int *maxlength, wchar_t ***list, int *entries)
if (!local_list)
local_list = xcalloc(maxentry, sizeof(wchar_t *));
- while (fgetws(buf, MAXLINELEN, fp)) {
+ while (1) {
+ if (fgetws(buf, MAXLINELEN, fp) == NULL) {
+ if (feof(fp))
+ break;
+ else
+ err(EXIT_FAILURE, _("read failed"));
+ }
for (p = buf; *p && iswspace(*p); ++p)
;
if (!*p)