diff options
author | Jim Meyering <meyering@redhat.com> | 2008-06-25 23:15:06 +0200 |
---|---|---|
committer | Jim Meyering <meyering@redhat.com> | 2008-06-26 07:48:25 +0200 |
commit | 3d309aa725e529a5e90aacc5594565e21f966537 (patch) | |
tree | 06819a06087f0d60dd30c13fd66a370e19c8953e /src | |
parent | 4f4700cca8927c961ea3319b830b866f036cd990 (diff) | |
download | coreutils-3d309aa725e529a5e90aacc5594565e21f966537.tar.xz |
truncate: handle the case in which off_t != intmax_t
* src/truncate.c (parse_len): Use a temporary of type intmax_t,
rather than off_t; detect out of range [OFF_T_MIN..OFF_T_MAX].
(main) [IF_LINT]: Initialize, to avoid an unwarranted
"may be used uninitialized" warning.
Reported by Michael Geng.
Signed-off-by: Pádraig Brady <P@draigBrady.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/truncate.c | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/src/truncate.c b/src/truncate.c index 8febd5895..2435a1277 100644 --- a/src/truncate.c +++ b/src/truncate.c @@ -74,10 +74,21 @@ static int parse_len (char const *str, off_t *size) { enum strtol_error e; - /* OFF_T_MAX = INTMAX_MAX */ - e = xstrtoimax (str, NULL, 10, size, "EgGkKmMPtTYZ0"); - errno = (e == LONGINT_OVERFLOW) ? EOVERFLOW : 0; - return (e == LONGINT_OK) ? 0 : -1; + intmax_t tmp_size; + e = xstrtoimax (str, NULL, 10, &tmp_size, "EgGkKmMPtTYZ0"); + if (e == LONGINT_OK + && !(OFF_T_MIN <= tmp_size && tmp_size <= OFF_T_MAX)) + e = LONGINT_OVERFLOW; + + if (e == LONGINT_OK) + { + errno = 0; + *size = tmp_size; + return 0; + } + + errno = (e == LONGINT_OVERFLOW ? EOVERFLOW : 0); + return -1; } static void @@ -243,7 +254,7 @@ int main (int argc, char **argv) { bool got_size = false; - off_t size; + off_t size IF_LINT (= 0); rel_mode_t rel_mode = rm_abs; mode_t omode; int c, errors = 0, fd = -1, oflags; |