summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/split.c10
-rwxr-xr-xtests/misc/split-fail3
2 files changed, 12 insertions, 1 deletions
diff --git a/src/split.c b/src/split.c
index 61ae265d8..a391ecc12 100644
--- a/src/split.c
+++ b/src/split.c
@@ -432,6 +432,13 @@ main (int argc, char **argv)
error (0, 0, _("%s: invalid number of bytes"), optarg);
usage (EXIT_FAILURE);
}
+ /* If input is a pipe, we could get more data than is possible
+ to write to a single file, so indicate that immediately
+ rather than having possibly future invocations fail. */
+ if (OFF_T_MAX < n_units)
+ error (EXIT_FAILURE, EFBIG,
+ _("%s: invalid number of bytes"), optarg);
+
break;
case 'l':
@@ -456,6 +463,9 @@ main (int argc, char **argv)
error (0, 0, _("%s: invalid number of bytes"), optarg);
usage (EXIT_FAILURE);
}
+ if (OFF_T_MAX < n_units)
+ error (EXIT_FAILURE, EFBIG,
+ _("%s: invalid number of bytes"), optarg);
break;
case '0':
diff --git a/tests/misc/split-fail b/tests/misc/split-fail
index 68c9d7334..0ce6f5734 100755
--- a/tests/misc/split-fail
+++ b/tests/misc/split-fail
@@ -45,7 +45,8 @@ split -1 in 2> /dev/null || fail=1
split -0 in 2> /dev/null && fail=1
split --lines=$UINTMAX_MAX in || fail=1
-split --bytes=$UINTMAX_MAX in || fail=1
+split --bytes=$OFF_T_MAX in || fail=1
+split --line-bytes=$OFF_T_OFLOW 2> /dev/null in && fail=1
split --line-bytes=$SIZE_OFLOW 2> /dev/null in && fail=1
# Make sure that a huge obsolete option evokes the right failure.