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 <ali_farzan...@riseup.net> 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. */
> 
> 

Reply via email to