diff options
author | Karel Zak <kzak@redhat.com> | 2010-03-30 14:10:08 +0200 |
---|---|---|
committer | Karel Zak <kzak@redhat.com> | 2010-03-30 14:45:37 +0200 |
commit | 20543e618a9d403259b4efb56145e94789814ea4 (patch) | |
tree | d06d2481814119a98aec08564aeb0ef79b66784f /disk-utils | |
parent | 69cc2ec06158d7849e6ae8c95f944f044e7b380d (diff) | |
download | util-linux-old-20543e618a9d403259b4efb56145e94789814ea4.tar.gz |
mkswap: more robust strtoull() usage
Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'disk-utils')
-rw-r--r-- | disk-utils/mkswap.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/disk-utils/mkswap.c b/disk-utils/mkswap.c index c1999375..bc6c1d29 100644 --- a/disk-utils/mkswap.c +++ b/disk-utils/mkswap.c @@ -559,13 +559,18 @@ main(int argc, char ** argv) { usage(); } if (block_count) { - /* this silly user specified the number of blocks - explicitly */ - char *tmp; - int blocks_per_page = pagesize/1024; - PAGES = strtoull(block_count,&tmp,0)/blocks_per_page; - if (*tmp) + /* this silly user specified the number of blocks explicitly */ + char *tmp = NULL; + long long blks; + + errno = 0; + blks = strtoll(block_count, &tmp, 0); + if ((tmp && *tmp) || + (errno != 0 && (blks == ULLONG_MAX || blks == 0)) || + blks < 0) usage(); + + PAGES = blks / (pagesize / 1024); } sz = get_size(device_name); if (!PAGES) { |