PR/57828: Alejandro Colomar: Prioritize test for ERANGE before testing for

fully consuming the string. Adjust strtonum(3) to behave as before. Document
the order of the tests and sync the man pages (I should really autogenerate
one of the two man pages...)
This commit is contained in:
christos 2024-01-20 16:13:39 +00:00
parent 12ddec6097
commit f1987b28c8
4 changed files with 54 additions and 35 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: _strtoi.h,v 1.2 2015/01/18 17:55:22 christos Exp $ */ /* $NetBSD: _strtoi.h,v 1.3 2024/01/20 16:13:39 christos Exp $ */
/*- /*-
* Copyright (c) 1990, 1993 * Copyright (c) 1990, 1993
@ -100,26 +100,26 @@ INT_FUNCNAME(_int_, _FUNCNAME, _l)(const char * __restrict nptr,
errno = serrno; errno = serrno;
#endif #endif
if (*rstatus == 0) { /* No digits were found */
/* No digits were found */ if (*rstatus == 0 && nptr == *endptr)
if (nptr == *endptr) *rstatus = ECANCELED;
*rstatus = ECANCELED;
/* There are further characters after number */
else if (**endptr != '\0')
*rstatus = ENOTSUP;
}
if (im < lo) { if (im < lo) {
if (*rstatus == 0) if (*rstatus == 0)
*rstatus = ERANGE; *rstatus = ERANGE;
return lo; return lo;
} }
if (im > hi) { if (im > hi) {
if (*rstatus == 0) if (*rstatus == 0)
*rstatus = ERANGE; *rstatus = ERANGE;
return hi; return hi;
} }
/* There are further characters after number */
if (*rstatus == 0 && **endptr != '\0')
*rstatus = ENOTSUP;
return im; return im;
} }

View File

@ -1,4 +1,4 @@
.\" $NetBSD: strtoi.3,v 1.7 2017/07/03 21:32:50 wiz Exp $ .\" $NetBSD: strtoi.3,v 1.8 2024/01/20 16:13:39 christos Exp $
.\" .\"
.\" Copyright (c) 1990, 1991, 1993 .\" Copyright (c) 1990, 1991, 1993
.\" The Regents of the University of California. All rights reserved. .\" The Regents of the University of California. All rights reserved.
@ -36,12 +36,12 @@
.\" Created by Kamil Rytarowski, based on ID: .\" Created by Kamil Rytarowski, based on ID:
.\" NetBSD: strtol.3,v 1.31 2015/03/11 09:57:35 wiz Exp .\" NetBSD: strtol.3,v 1.31 2015/03/11 09:57:35 wiz Exp
.\" .\"
.Dd November 13, 2015 .Dd January 20, 2024
.Dt STRTOI 3 .Dt STRTOI 3
.Os .Os
.Sh NAME .Sh NAME
.Nm strtoi .Nm strtoi
.Nd convert string value to an intmax_t integer .Nd convert a string value to an intmax_t integer
.Sh LIBRARY .Sh LIBRARY
.Lb libc .Lb libc
.Sh SYNOPSIS .Sh SYNOPSIS
@ -58,8 +58,7 @@
.Sh DESCRIPTION .Sh DESCRIPTION
The The
.Fn strtoi .Fn strtoi
function function converts the string in
converts the string in
.Fa nptr .Fa nptr
to an to an
.Ft intmax_t .Ft intmax_t
@ -117,10 +116,11 @@ is taken as 10 (decimal) unless the next character is
.Ql 0 , .Ql 0 ,
in which case it is taken as 8 (octal). in which case it is taken as 8 (octal).
.Pp .Pp
The remainder of the string is converted to a The remainder of the string is converted to an
.Em intmax_t .Em intmax_t
value in the obvious manner, value in the obvious manner,
stopping at the first character which is not a valid digit stopping at the end of the string
or at the first character which is not a valid digit
in the given base. in the given base.
(In bases above 10, the letter (In bases above 10, the letter
.Ql A .Ql A
@ -201,6 +201,12 @@ or the range given was invalid, i.e.
> >
.Fa hi . .Fa hi .
.El .El
.Pp
The range check is important than the unconverted characters check,
and it is performed first.
If a program needs to know if there were unconverted characters when an
out of range number has been provided, it needs to supply and test
.Fa endptr.
.Sh SEE ALSO .Sh SEE ALSO
.Xr atof 3 , .Xr atof 3 ,
.Xr atoi 3 , .Xr atoi 3 ,

View File

@ -1,4 +1,4 @@
/* $NetBSD: strtonum.c,v 1.6 2018/12/06 06:29:56 kamil Exp $ */ /* $NetBSD: strtonum.c,v 1.7 2024/01/20 16:13:39 christos Exp $ */
/*- /*-
* Copyright (c) 2014 The NetBSD Foundation, Inc. * Copyright (c) 2014 The NetBSD Foundation, Inc.
* All rights reserved. * All rights reserved.
@ -29,7 +29,7 @@
*/ */
#include <sys/cdefs.h> #include <sys/cdefs.h>
__RCSID("$NetBSD: strtonum.c,v 1.6 2018/12/06 06:29:56 kamil Exp $"); __RCSID("$NetBSD: strtonum.c,v 1.7 2024/01/20 16:13:39 christos Exp $");
#include "namespace.h" #include "namespace.h"
@ -46,26 +46,33 @@ strtonum(const char *nptr, long long minval, long long maxval,
int e; int e;
long long rv; long long rv;
const char *resp; const char *resp;
char *eptr;
if (errstr == NULL) if (errstr == NULL)
errstr = &resp; errstr = &resp;
if (minval > maxval) { if (minval > maxval)
*errstr = "invalid"; goto out;
return 0;
}
rv = (long long)strtoi(nptr, NULL, 10, minval, maxval, &e); rv = (long long)strtoi(nptr, &eptr, 10, minval, maxval, &e);
if (e == 0) { switch (e) {
case 0:
*errstr = NULL; *errstr = NULL;
return rv; return rv;
case ECANCELED:
case ENOTSUP:
goto out;
case ERANGE:
if (*eptr)
goto out;
*errstr = rv == maxval ? "too large" : "too small";
return 0;
default:
abort();
} }
if (e == ERANGE) out:
*errstr = (rv == maxval ? "too large" : "too small"); *errstr = "invalid";
else
*errstr = "invalid";
return 0; return 0;
} }

View File

@ -1,4 +1,4 @@
.\" $NetBSD: strtou.3,v 1.7 2017/07/03 21:32:50 wiz Exp $ .\" $NetBSD: strtou.3,v 1.8 2024/01/20 16:13:39 christos Exp $
.\" .\"
.\" Copyright (c) 1990, 1991, 1993 .\" Copyright (c) 1990, 1991, 1993
.\" The Regents of the University of California. All rights reserved. .\" The Regents of the University of California. All rights reserved.
@ -36,12 +36,12 @@
.\" Created by Kamil Rytarowski, based on ID: .\" Created by Kamil Rytarowski, based on ID:
.\" NetBSD: strtoul.3,v 1.29 2015/03/10 13:00:58 christos Exp .\" NetBSD: strtoul.3,v 1.29 2015/03/10 13:00:58 christos Exp
.\" .\"
.Dd November 13, 2015 .Dd January 20, 2024
.Dt STRTOU 3 .Dt STRTOU 3
.Os .Os
.Sh NAME .Sh NAME
.Nm strtou .Nm strtou
.Nd convert a string to an uintmax_t integer .Nd convert a string value to an uintmax_t integer
.Sh LIBRARY .Sh LIBRARY
.Lb libc .Lb libc
.Sh SYNOPSIS .Sh SYNOPSIS
@ -120,7 +120,7 @@ The remainder of the string is converted to an
.Em uintmax_t .Em uintmax_t
value in the obvious manner, value in the obvious manner,
stopping at the end of the string stopping at the end of the string
or at the first character that does not produce a valid digit or at the first character which is not a valid digit
in the given base. in the given base.
(In bases above 10, the letter (In bases above 10, the letter
.Ql A .Ql A
@ -195,12 +195,18 @@ In this case,
.Fa endptr .Fa endptr
points to the first unconverted character. points to the first unconverted character.
.It Bq Er ERANGE .It Bq Er ERANGE
The given string was out of range; the value converted has been clamped; or The given string was out of range; the value converted has been clamped;
the range given was invalid, i.e. or the range given was invalid, i.e.
.Fa lo .Fa lo
> >
.Fa hi . .Fa hi .
.El .El
.Pp
The range check is important than the unconverted characters check,
and it is performed first.
If a program needs to know if there were unconverted characters when an
out of range number has been provided, it needs to supply and test
.Fa endptr.
.Sh SEE ALSO .Sh SEE ALSO
.Xr atof 3 , .Xr atof 3 ,
.Xr atoi 3 , .Xr atoi 3 ,