cvtnum() returns -1LL for unparseable values, but if we
assign to a signed var, we can't test it:
There are problems in fadvise, mincore & madvise.
xfs_io> mincore 0 xxx
range (0:0) is beyond mapping (0:
1048576)
For mincore & madvise, se a temporary signed var so we
can detect the error:
xfs_io> mincore 0 xxx
non-numeric length argument -- xxx
and also test whether it may overflow a size_t for
mincore & madvise.
For fadvise, posix_fadvise64 wants an off_t anyway so just
switch to that.
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
Reviewed-by: Christoph Hellwig <hch@lst.de>
int argc,
char **argv)
{
- off64_t offset = 0;
- size_t length = 0;
+ off64_t offset = 0, length = 0;
int c, range = 0, advise = POSIX_FADV_NORMAL;
while ((c = getopt(argc, argv, "dnrsw")) != EOF) {
int argc,
char **argv)
{
- off64_t offset;
+ off64_t offset, llength;
size_t length;
void *start;
int advise = MADV_NORMAL, c;
return 0;
}
optind++;
- length = cvtnum(blocksize, sectsize, argv[optind]);
- if (length < 0) {
+ llength = cvtnum(blocksize, sectsize, argv[optind]);
+ if (llength < 0) {
printf(_("non-numeric length argument -- %s\n"),
argv[optind]);
return 0;
- }
+ } else if (llength > (size_t)llength) {
+ printf(_("length argument too large -- %lld\n"),
+ llength);
+ return 0;
+ } else
+ length = (size_t)llength;
} else {
return command_usage(&madvise_cmd);
}
int argc,
char **argv)
{
- off64_t offset;
+ off64_t offset, llength;
size_t length;
size_t blocksize, sectsize;
void *start;
argv[1]);
return 0;
}
- length = cvtnum(blocksize, sectsize, argv[2]);
- if (length < 0) {
+ llength = cvtnum(blocksize, sectsize, argv[2]);
+ if (llength < 0) {
printf(_("non-numeric length argument -- %s\n"),
argv[2]);
return 0;
- }
+ } else if (llength > (size_t)llength) {
+ printf(_("length argument too large -- %lld\n"),
+ llength);
+ return 0;
+ } else
+ length = (size_t)llength;
} else {
return command_usage(&mincore_cmd);
}