Hi Ali, In this case, ULLONG_MAX is implicitly cast to double, isn't it?
Do you have any problems if you don't cast to double? -- ASOU Masato From: Ali Farzanrad <[email protected]> Date: Wed, 23 Jun 2021 20:24:27 +0000 > Oh, my bad, sorry. > I assumed that val is always integer. > I guess it is better to ignore val == ULLONG_MAX: > > =================================================================== > RCS file: /cvs/src/sbin/disklabel/editor.c,v > retrieving revision 1.368 > diff -u -p -r1.368 editor.c > --- editor.c 2021/05/30 19:02:30 1.368 > +++ editor.c 2021/06/23 20:23:03 > @@ -2418,7 +2418,7 @@ apply_unit(double val, u_char unit, u_int64_t *n) > } > > val *= factor / DEV_BSIZE; > - if (val > ULLONG_MAX) > + if (val >= (double)ULLONG_MAX) > return (-1); > *n = val; > return (0); > @@ -2429,7 +2429,7 @@ parse_sizespec(const char *buf, double *val, char **un > { > errno = 0; > *val = strtod(buf, unit); > - if (errno == ERANGE || *val < 0 || *val > ULLONG_MAX) > + if (errno == ERANGE || *val < 0 || *val >= (double)ULLONG_MAX) > return (-1); /* too big/small */ > if (*val == 0 && *unit == buf) > return (-1); /* No conversion performed. */ > > Ali Farzanrad <[email protected]> wrote: >> Hi tech@, >> >> disklabel shows a warning at build time which might be important. >> Following diff will surpass the warning. >> >> =================================================================== >> RCS file: /cvs/src/sbin/disklabel/editor.c,v >> retrieving revision 1.368 >> diff -u -p -r1.368 editor.c >> --- editor.c 2021/05/30 19:02:30 1.368 >> +++ editor.c 2021/06/23 19:25:45 >> @@ -2418,7 +2418,7 @@ apply_unit(double val, u_char unit, u_int64_t *n) >> } >> >> val *= factor / DEV_BSIZE; >> - if (val > ULLONG_MAX) >> + if (val != (double)(u_int64_t)val) >> return (-1); >> *n = val; >> return (0); >> @@ -2429,7 +2429,7 @@ parse_sizespec(const char *buf, double *val, char **un >> { >> errno = 0; >> *val = strtod(buf, unit); >> - if (errno == ERANGE || *val < 0 || *val > ULLONG_MAX) >> + if (errno == ERANGE || *val < 0 || *val != (double)(u_int64_t)*val) >> return (-1); /* too big/small */ >> if (*val == 0 && *unit == buf) >> return (-1); /* No conversion performed. */ >> >> >
