Don't let the length argument overflow size_t. This is mostly a problem
on 32-bit platforms.
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
{
long long src_off = 0;
long long dst_off = 0;
+ long long llen;
size_t len = 0;
bool len_specified = false;
int opt;
}
break;
case 'l':
- len = cvtnum(fsblocksize, fssectsize, optarg);
- if (len == -1LL) {
+ llen = cvtnum(fsblocksize, fssectsize, optarg);
+ if (llen == -1LL) {
printf(_("invalid length -- %s\n"), optarg);
return 0;
}
+ /*
+ * If size_t can't hold what's in llen, report a
+ * length overflow.
+ */
+ if ((size_t)llen != llen) {
+ errno = EOVERFLOW;
+ perror("copy_range");
+ return 0;
+ }
+ len = llen;
len_specified = true;
break;
case 'f':