aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRyan Moeller <[email protected]>2019-09-22 18:27:53 -0400
committerBrian Behlendorf <[email protected]>2019-09-22 15:27:53 -0700
commit73d7820bba26dd61085cb6dd8348ebf0bb41b951 (patch)
treec22291211ee2d86ba4ee82e9cd37ad790f9dfba9
parentd49d7336dd42d19de00ee24d1112d496829ff027 (diff)
Use signed types to prevent subtraction overflow
The difference between the sizes could be positive or negative. Leaving the types as unsigned means the result overflows when the difference is negative and removing the labs() means we'll have introduced a bug. The subtraction results in the correct value when the unsigned integer is interpreted as a signed integer by labs(). Clang doesn't see that we're doing a subtraction and abusing the types. It sees the result of the subtraction, an unsigned value, being passed to an absolute value function and emits a warning which we treat as an error. Reviewed by: Youzhong Yang <[email protected]> Reviewed-by: Igor Kozhukhov <[email protected]> Reviewed-by: Brian Behlendorf <[email protected]> Signed-off-by: Ryan Moeller <[email protected]> Closes #9355
-rw-r--r--cmd/zpool/zpool_vdev.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/cmd/zpool/zpool_vdev.c b/cmd/zpool/zpool_vdev.c
index ef2a30996..527fca08b 100644
--- a/cmd/zpool/zpool_vdev.c
+++ b/cmd/zpool/zpool_vdev.c
@@ -829,7 +829,7 @@ get_replication(nvlist_t *nvroot, boolean_t fatal)
rep.zprl_children = 1;
rep.zprl_parity = 0;
} else {
- uint64_t vdev_size;
+ int64_t vdev_size;
/*
* This is a mirror or RAID-Z vdev. Go through and make
@@ -859,12 +859,12 @@ get_replication(nvlist_t *nvroot, boolean_t fatal)
*/
type = NULL;
dontreport = 0;
- vdev_size = -1ULL;
+ vdev_size = -1LL;
for (c = 0; c < children; c++) {
nvlist_t *cnv = child[c];
char *path;
struct stat64 statbuf;
- uint64_t size = -1ULL;
+ int64_t size = -1LL;
char *childtype;
int fd, err;
@@ -955,7 +955,7 @@ get_replication(nvlist_t *nvroot, boolean_t fatal)
* (~16MB) then report an error.
*/
if (!dontreport &&
- (vdev_size != -1ULL &&
+ (vdev_size != -1LL &&
(labs(size - vdev_size) >
ZPOOL_FUZZ))) {
if (ret != NULL)