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. */
>
>