public inbox for linux-man@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH v1] man/man3/strtoul.3: BUGS: Signed numbers are not rejected
@ 2025-03-21 20:41 Alejandro Colomar
  2025-03-21 21:31 ` Bruno Haible
                   ` (3 more replies)
  0 siblings, 4 replies; 24+ messages in thread
From: Alejandro Colomar @ 2025-03-21 20:41 UTC (permalink / raw)
  To: linux-man, Bruno Haible; +Cc: Alejandro Colomar

[-- Attachment #1: Type: text/plain, Size: 1452 bytes --]

Reported-by: Bruno Haible <bruno@clisp.org>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
---

Hi Bruno,

This is one of the patches I will apply after your report.  Please
review.  Thanks!


Cheers,
Alex


 man/man3/strtoul.3 | 26 ++++++++++++++++++++++----
 1 file changed, 22 insertions(+), 4 deletions(-)

diff --git a/man/man3/strtoul.3 b/man/man3/strtoul.3
index 9eb260dae..62b9f65f6 100644
--- a/man/man3/strtoul.3
+++ b/man/man3/strtoul.3
@@ -204,11 +204,29 @@ .SH CAVEATS
 and then determine if an error occurred by checking whether
 .I errno
 has a nonzero value after the call.
-.P
-Negative values are considered valid input and are
-silently converted to the equivalent
-.I "unsigned long"
+.SH BUGS
+.SS Signed numbers
+Negative values
+are considered valid input and
+are silently converted to the equivalent
+.I unsigned long
 value.
+.P
+Users should reject signed numbers
+with a wrapper function.
+.IP
+.EX
+unsigned long
+strtoul_u(const char *restrict s, char **restrict endp, int base)
+{
+	while (isspace((unsigned char) *s))
+		s++;
+	if (!isxdigit((unsigned char) *s))
+		return 0;
+\&
+	return strtoul(s, endp, base);
+}
+.EE
 .SH EXAMPLES
 See the example on the
 .BR strtol (3)

Range-diff against v0:
-:  --------- > 1:  939641570 man/man3/strtoul.3: BUGS: Signed numbers are not rejected

base-commit: e921861a3d30cfc5f9263747a4e64a68e488288c
-- 
2.47.2


[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply related	[flat|nested] 24+ messages in thread

* Re: [PATCH v1] man/man3/strtoul.3: BUGS: Signed numbers are not rejected
  2025-03-21 20:41 [PATCH v1] man/man3/strtoul.3: BUGS: Signed numbers are not rejected Alejandro Colomar
@ 2025-03-21 21:31 ` Bruno Haible
  2025-03-21 22:21   ` Alejandro Colomar
  2025-03-21 22:18 ` [PATCH v2 0/2] strto[u]l(3) BUGS and CAVEATS Alejandro Colomar
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 24+ messages in thread
From: Bruno Haible @ 2025-03-21 21:31 UTC (permalink / raw)
  To: linux-man, Alejandro Colomar

Alejandro Colomar wrote:
> This is one of the patches I will apply after your report.  Please
> review.

Looks good to me, except for one line in the sample:

> +	if (!isxdigit((unsigned char) *s))

For a general base, this should be

          if (!isalnum((unsigned char) *s))

For base <= 16, it can be simplified to

          if (!isxdigit((unsigned char) *s))

For base <= 10, it can be simplified to

          if (!isdigit((unsigned char) *s))

Bruno




^ permalink raw reply	[flat|nested] 24+ messages in thread

* [PATCH v2 0/2] strto[u]l(3) BUGS and CAVEATS
  2025-03-21 20:41 [PATCH v1] man/man3/strtoul.3: BUGS: Signed numbers are not rejected Alejandro Colomar
  2025-03-21 21:31 ` Bruno Haible
@ 2025-03-21 22:18 ` Alejandro Colomar
  2025-03-21 22:18   ` [PATCH v2 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected Alejandro Colomar
  2025-03-21 22:18   ` [PATCH v2 2/2] man/man3/strtol.3: CAVEATS: Clarify how to perform range checks Alejandro Colomar
  2025-03-23  0:30 ` [PATCH v3 0/2] strto[u]l.3: BUGS and CAVEATS Alejandro Colomar
  2025-03-23 11:43 ` [PATCH v4 0/2] strto[u]l.3: BUGS and CAVEATS Alejandro Colomar
  3 siblings, 2 replies; 24+ messages in thread
From: Alejandro Colomar @ 2025-03-21 22:18 UTC (permalink / raw)
  To: linux-man, Bruno Haible; +Cc: Alejandro Colomar

[-- Attachment #1: Type: text/plain, Size: 2926 bytes --]

Hi Bruno,

This time, I've added a mention to white space.  I've decided to put
both bugs in the same commit.

And I've added a commit clarifying how to do range checks correctly.


Have a lovely night!
Alex

Alejandro Colomar (2):
  man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not
    rejected
  man/man3/strtol.3: CAVEATS: Clarify how to perform range checks

 man/man3/strtol.3  | 20 ++++++++++++++++++++
 man/man3/strtoul.3 | 19 ++++++++++++++-----
 2 files changed, 34 insertions(+), 5 deletions(-)

Range-diff against v1:
1:  939641570 ! 1:  8faa6a809 man/man3/strtoul.3: BUGS: Signed numbers are not rejected
    @@ Metadata
     Author: Alejandro Colomar <alx@kernel.org>
     
      ## Commit message ##
    -    man/man3/strtoul.3: BUGS: Signed numbers are not rejected
    +    man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected
     
         Reported-by: Bruno Haible <bruno@clisp.org>
         Signed-off-by: Alejandro Colomar <alx@kernel.org>
     
    + ## man/man3/strtol.3 ##
    +@@ man/man3/strtol.3: .SH CAVEATS
    +     goto unsupported_base;
    + .EE
    + .in
    ++.SH BUGS
    ++.SS White space
    ++These functions silently accept leading white space.
    ++One should call
    ++.BR isspace (3)
    ++before
    ++.BR strtol ()
    ++to reject white space.
    + .SH EXAMPLES
    + The program shown below demonstrates the use of
    + .BR strtol ().
    +
      ## man/man3/strtoul.3 ##
     @@ man/man3/strtoul.3: .SH CAVEATS
      and then determine if an error occurred by checking whether
    @@ man/man3/strtoul.3: .SH CAVEATS
     -Negative values are considered valid input and are
     -silently converted to the equivalent
     -.I "unsigned long"
    +-value.
     +.SH BUGS
     +.SS Signed numbers
     +Negative values
     +are considered valid input and
    -+are silently converted to the equivalent
    -+.I unsigned long
    - value.
    -+.P
    -+Users should reject signed numbers
    -+with a wrapper function.
    -+.IP
    -+.EX
    -+unsigned long
    -+strtoul_u(const char *restrict s, char **restrict endp, int base)
    -+{
    -+	while (isspace((unsigned char) *s))
    -+		s++;
    -+	if (!isxdigit((unsigned char) *s))
    -+		return 0;
    -+\&
    -+	return strtoul(s, endp, base);
    -+}
    -+.EE
    ++are silently converted to
    ++.IR "\%unsigned\ long" .
    ++.SS White space
    ++These functions silently accept leading whitespace.
    ++.SS isxdigit(3)
    ++One should call
    ++.BR isxdigit (3)
    ++before
    ++.BR strtoul ()
    ++to reject white space and/or a sign.
      .SH EXAMPLES
      See the example on the
      .BR strtol (3)
-:  --------- > 2:  b5244e62c man/man3/strtol.3: CAVEATS: Clarify how to perform range checks

base-commit: e921861a3d30cfc5f9263747a4e64a68e488288c
-- 
2.47.2


[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [PATCH v2 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected
  2025-03-21 22:18 ` [PATCH v2 0/2] strto[u]l(3) BUGS and CAVEATS Alejandro Colomar
@ 2025-03-21 22:18   ` Alejandro Colomar
  2025-03-21 22:18   ` [PATCH v2 2/2] man/man3/strtol.3: CAVEATS: Clarify how to perform range checks Alejandro Colomar
  1 sibling, 0 replies; 24+ messages in thread
From: Alejandro Colomar @ 2025-03-21 22:18 UTC (permalink / raw)
  To: linux-man, Bruno Haible; +Cc: Alejandro Colomar

[-- Attachment #1: Type: text/plain, Size: 1516 bytes --]

Reported-by: Bruno Haible <bruno@clisp.org>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
---
 man/man3/strtol.3  |  8 ++++++++
 man/man3/strtoul.3 | 19 ++++++++++++++-----
 2 files changed, 22 insertions(+), 5 deletions(-)

diff --git a/man/man3/strtol.3 b/man/man3/strtol.3
index 9323873a9..03047f10a 100644
--- a/man/man3/strtol.3
+++ b/man/man3/strtol.3
@@ -224,6 +224,14 @@ .SH CAVEATS
     goto unsupported_base;
 .EE
 .in
+.SH BUGS
+.SS White space
+These functions silently accept leading white space.
+One should call
+.BR isspace (3)
+before
+.BR strtol ()
+to reject white space.
 .SH EXAMPLES
 The program shown below demonstrates the use of
 .BR strtol ().
diff --git a/man/man3/strtoul.3 b/man/man3/strtoul.3
index 9eb260dae..1832f9d73 100644
--- a/man/man3/strtoul.3
+++ b/man/man3/strtoul.3
@@ -204,11 +204,20 @@ .SH CAVEATS
 and then determine if an error occurred by checking whether
 .I errno
 has a nonzero value after the call.
-.P
-Negative values are considered valid input and are
-silently converted to the equivalent
-.I "unsigned long"
-value.
+.SH BUGS
+.SS Signed numbers
+Negative values
+are considered valid input and
+are silently converted to
+.IR "\%unsigned\ long" .
+.SS White space
+These functions silently accept leading whitespace.
+.SS isxdigit(3)
+One should call
+.BR isxdigit (3)
+before
+.BR strtoul ()
+to reject white space and/or a sign.
 .SH EXAMPLES
 See the example on the
 .BR strtol (3)
-- 
2.47.2


[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH v2 2/2] man/man3/strtol.3: CAVEATS: Clarify how to perform range checks
  2025-03-21 22:18 ` [PATCH v2 0/2] strto[u]l(3) BUGS and CAVEATS Alejandro Colomar
  2025-03-21 22:18   ` [PATCH v2 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected Alejandro Colomar
@ 2025-03-21 22:18   ` Alejandro Colomar
  1 sibling, 0 replies; 24+ messages in thread
From: Alejandro Colomar @ 2025-03-21 22:18 UTC (permalink / raw)
  To: linux-man, Bruno Haible; +Cc: Alejandro Colomar

[-- Attachment #1: Type: text/plain, Size: 815 bytes --]

Reported-by: Bruno Haible <bruno@clisp.org>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
---
 man/man3/strtol.3 | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/man/man3/strtol.3 b/man/man3/strtol.3
index 03047f10a..973d6a78b 100644
--- a/man/man3/strtol.3
+++ b/man/man3/strtol.3
@@ -192,6 +192,7 @@ .SH HISTORY
 .BR strtoll ()
 POSIX.1-2001, C99.
 .SH CAVEATS
+.SS Range checks
 Since
 .BR strtol ()
 can legitimately return 0,
@@ -210,6 +211,17 @@ .SH CAVEATS
 .I errno == ERANGE
 after the call.
 .P
+.in +4n
+.EX
+errno = 0;
+n = strtol(s, NULL, base)
+if ((errno == ERANGE && n == min) || n < min)
+	goto too_low;
+if ((errno == ERANGE && n == max) || n > max)
+	goto too_high;
+.EE
+.in
+.SS base
 If the
 .I base
 needs to be tested,
-- 
2.47.2


[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply related	[flat|nested] 24+ messages in thread

* Re: [PATCH v1] man/man3/strtoul.3: BUGS: Signed numbers are not rejected
  2025-03-21 21:31 ` Bruno Haible
@ 2025-03-21 22:21   ` Alejandro Colomar
  0 siblings, 0 replies; 24+ messages in thread
From: Alejandro Colomar @ 2025-03-21 22:21 UTC (permalink / raw)
  To: Bruno Haible; +Cc: linux-man

[-- Attachment #1: Type: text/plain, Size: 801 bytes --]

Hi,

On Fri, Mar 21, 2025 at 10:31:39PM +0100, Bruno Haible wrote:
> Alejandro Colomar wrote:
> > This is one of the patches I will apply after your report.  Please
> > review.
> 
> Looks good to me, except for one line in the sample:
> 
> > +	if (!isxdigit((unsigned char) *s))
> 
> For a general base, this should be
> 
>           if (!isalnum((unsigned char) *s))

Hmmm, thanks!  I fogot about base 29.  :)
I'll take that for v3.

> 
> For base <= 16, it can be simplified to
> 
>           if (!isxdigit((unsigned char) *s))
> 
> For base <= 10, it can be simplified to
> 
>           if (!isdigit((unsigned char) *s))

Yep, although I won't mention that.  Since isalnum(3) works for all,
I'll say that.


Cheers,
Alex

-- 
<https://www.alejandro-colomar.es/>

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [PATCH v3 0/2] strto[u]l.3: BUGS and CAVEATS
  2025-03-21 20:41 [PATCH v1] man/man3/strtoul.3: BUGS: Signed numbers are not rejected Alejandro Colomar
  2025-03-21 21:31 ` Bruno Haible
  2025-03-21 22:18 ` [PATCH v2 0/2] strto[u]l(3) BUGS and CAVEATS Alejandro Colomar
@ 2025-03-23  0:30 ` Alejandro Colomar
  2025-03-23  0:30   ` [PATCH v3 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected Alejandro Colomar
  2025-03-23  0:30   ` [PATCH v3 2/2] man/man3/strtol.3: CAVEATS: Clarify how to perform range checks Alejandro Colomar
  2025-03-23 11:43 ` [PATCH v4 0/2] strto[u]l.3: BUGS and CAVEATS Alejandro Colomar
  3 siblings, 2 replies; 24+ messages in thread
From: Alejandro Colomar @ 2025-03-23  0:30 UTC (permalink / raw)
  To: linux-man, Bruno Haible; +Cc: Alejandro Colomar

[-- Attachment #1: Type: text/plain, Size: 1847 bytes --]

Hi!

Here's v3, suggesting alnum(3) instead of isxdigit(3), and also making
the wording slightly more precise, since not all negative numbers are
accepted; only some (I don't feel like explaining it with details; it's
easier to just say it's a bug to be workarounded).  Add a link.


Cheers,
Alex

Alejandro Colomar (2):
  man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not
    rejected
  man/man3/strtol.3: CAVEATS: Clarify how to perform range checks

 man/man3/strtol.3  | 20 ++++++++++++++++++++
 man/man3/strtoul.3 | 19 ++++++++++++++-----
 2 files changed, 34 insertions(+), 5 deletions(-)

Range-diff against v2:
1:  8faa6a809 ! 1:  3c456a1a0 man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected
    @@ Metadata
      ## Commit message ##
         man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected
     
    +    Link: <https://stackoverflow.com/questions/60955490/strtoul-what-is-the-correct-return-value-for-very-negative-strings>
         Reported-by: Bruno Haible <bruno@clisp.org>
         Signed-off-by: Alejandro Colomar <alx@kernel.org>
     
    @@ man/man3/strtoul.3: .SH CAVEATS
     -value.
     +.SH BUGS
     +.SS Signed numbers
    -+Negative values
    ++Some negative values
     +are considered valid input and
     +are silently converted to
     +.IR "\%unsigned\ long" .
     +.SS White space
     +These functions silently accept leading whitespace.
    -+.SS isxdigit(3)
    ++.SS isalnum(3)
     +One should call
    -+.BR isxdigit (3)
    ++.BR isalnum (3)
     +before
     +.BR strtoul ()
     +to reject white space and/or a sign.
2:  b5244e62c = 2:  020b468a3 man/man3/strtol.3: CAVEATS: Clarify how to perform range checks

base-commit: e921861a3d30cfc5f9263747a4e64a68e488288c
-- 
2.47.2


[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [PATCH v3 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected
  2025-03-23  0:30 ` [PATCH v3 0/2] strto[u]l.3: BUGS and CAVEATS Alejandro Colomar
@ 2025-03-23  0:30   ` Alejandro Colomar
  2025-03-23 10:27     ` Bruno Haible
  2025-03-23  0:30   ` [PATCH v3 2/2] man/man3/strtol.3: CAVEATS: Clarify how to perform range checks Alejandro Colomar
  1 sibling, 1 reply; 24+ messages in thread
From: Alejandro Colomar @ 2025-03-23  0:30 UTC (permalink / raw)
  To: linux-man, Bruno Haible; +Cc: Alejandro Colomar

[-- Attachment #1: Type: text/plain, Size: 1640 bytes --]

Link: <https://stackoverflow.com/questions/60955490/strtoul-what-is-the-correct-return-value-for-very-negative-strings>
Reported-by: Bruno Haible <bruno@clisp.org>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
---
 man/man3/strtol.3  |  8 ++++++++
 man/man3/strtoul.3 | 19 ++++++++++++++-----
 2 files changed, 22 insertions(+), 5 deletions(-)

diff --git a/man/man3/strtol.3 b/man/man3/strtol.3
index 9323873a9..03047f10a 100644
--- a/man/man3/strtol.3
+++ b/man/man3/strtol.3
@@ -224,6 +224,14 @@ .SH CAVEATS
     goto unsupported_base;
 .EE
 .in
+.SH BUGS
+.SS White space
+These functions silently accept leading white space.
+One should call
+.BR isspace (3)
+before
+.BR strtol ()
+to reject white space.
 .SH EXAMPLES
 The program shown below demonstrates the use of
 .BR strtol ().
diff --git a/man/man3/strtoul.3 b/man/man3/strtoul.3
index 9eb260dae..9e73190f5 100644
--- a/man/man3/strtoul.3
+++ b/man/man3/strtoul.3
@@ -204,11 +204,20 @@ .SH CAVEATS
 and then determine if an error occurred by checking whether
 .I errno
 has a nonzero value after the call.
-.P
-Negative values are considered valid input and are
-silently converted to the equivalent
-.I "unsigned long"
-value.
+.SH BUGS
+.SS Signed numbers
+Some negative values
+are considered valid input and
+are silently converted to
+.IR "\%unsigned\ long" .
+.SS White space
+These functions silently accept leading whitespace.
+.SS isalnum(3)
+One should call
+.BR isalnum (3)
+before
+.BR strtoul ()
+to reject white space and/or a sign.
 .SH EXAMPLES
 See the example on the
 .BR strtol (3)
-- 
2.47.2


[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH v3 2/2] man/man3/strtol.3: CAVEATS: Clarify how to perform range checks
  2025-03-23  0:30 ` [PATCH v3 0/2] strto[u]l.3: BUGS and CAVEATS Alejandro Colomar
  2025-03-23  0:30   ` [PATCH v3 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected Alejandro Colomar
@ 2025-03-23  0:30   ` Alejandro Colomar
  1 sibling, 0 replies; 24+ messages in thread
From: Alejandro Colomar @ 2025-03-23  0:30 UTC (permalink / raw)
  To: linux-man, Bruno Haible; +Cc: Alejandro Colomar

[-- Attachment #1: Type: text/plain, Size: 815 bytes --]

Reported-by: Bruno Haible <bruno@clisp.org>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
---
 man/man3/strtol.3 | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/man/man3/strtol.3 b/man/man3/strtol.3
index 03047f10a..973d6a78b 100644
--- a/man/man3/strtol.3
+++ b/man/man3/strtol.3
@@ -192,6 +192,7 @@ .SH HISTORY
 .BR strtoll ()
 POSIX.1-2001, C99.
 .SH CAVEATS
+.SS Range checks
 Since
 .BR strtol ()
 can legitimately return 0,
@@ -210,6 +211,17 @@ .SH CAVEATS
 .I errno == ERANGE
 after the call.
 .P
+.in +4n
+.EX
+errno = 0;
+n = strtol(s, NULL, base)
+if ((errno == ERANGE && n == min) || n < min)
+	goto too_low;
+if ((errno == ERANGE && n == max) || n > max)
+	goto too_high;
+.EE
+.in
+.SS base
 If the
 .I base
 needs to be tested,
-- 
2.47.2


[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply related	[flat|nested] 24+ messages in thread

* Re: [PATCH v3 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected
  2025-03-23  0:30   ` [PATCH v3 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected Alejandro Colomar
@ 2025-03-23 10:27     ` Bruno Haible
  2025-03-23 11:15       ` Alejandro Colomar
  0 siblings, 1 reply; 24+ messages in thread
From: Bruno Haible @ 2025-03-23 10:27 UTC (permalink / raw)
  To: linux-man, Alejandro Colomar

Thanks for theses BUGS sections, Alejandro.

> +.SS White space
> +These functions silently accept leading white space.
> +One should call
> +.BR isspace (3)
> +before
> +.BR strtol ()
> +to reject white space.

Just a question of wording, but it would be more straightforward to read
when written like this:

+.SS White space
+These functions silently accept leading white space.
+In situations where rejecting white space is desired instead, call
+.BR isspace (3)
+before
+.BR strtol ().

(As usual, presenting the "why" and "what" before the "how" is nicer. [1])

> +One should call
> +.BR isalnum (3)
> +before
> +.BR strtoul ()
> +to reject white space and/or a sign.

Likewise here. It is more straightforward when written like this:

+To reject white space and/or a sign, call
+.BR isalnum (3)
+before
+.BR strtoul ().

Bruno

[1] https://gitlab.com/ghwiki/gnow-how/-/wikis/Documentation/Writing




^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH v3 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected
  2025-03-23 10:27     ` Bruno Haible
@ 2025-03-23 11:15       ` Alejandro Colomar
  0 siblings, 0 replies; 24+ messages in thread
From: Alejandro Colomar @ 2025-03-23 11:15 UTC (permalink / raw)
  To: Bruno Haible; +Cc: linux-man

[-- Attachment #1: Type: text/plain, Size: 1474 bytes --]

Hi Bruno,

On Sun, Mar 23, 2025 at 11:27:53AM +0100, Bruno Haible wrote:
> Thanks for theses BUGS sections, Alejandro.
> 
> > +.SS White space
> > +These functions silently accept leading white space.
> > +One should call
> > +.BR isspace (3)
> > +before
> > +.BR strtol ()
> > +to reject white space.
> 
> Just a question of wording, but it would be more straightforward to read
> when written like this:
> 
> +.SS White space
> +These functions silently accept leading white space.
> +In situations where rejecting white space is desired instead, call
> +.BR isspace (3)
> +before
> +.BR strtol ().
> 
> (As usual, presenting the "why" and "what" before the "how" is nicer. [1])

LGTM.  I'd make it shorter, though.  How about this?

+.SS White space
+These functions silently accept leading white space.
+To reject white space, call
+.BR isspace (3)
+before
+.BR strtol ().

which BTW makes it more consistent with your proposal from below.

> 
> > +One should call
> > +.BR isalnum (3)
> > +before
> > +.BR strtoul ()
> > +to reject white space and/or a sign.
> 
> Likewise here. It is more straightforward when written like this:
> 
> +To reject white space and/or a sign, call
> +.BR isalnum (3)
> +before
> +.BR strtoul ().
> 
> Bruno
> 
> [1] https://gitlab.com/ghwiki/gnow-how/-/wikis/Documentation/Writing

Thanks!  That's useful.  :)


Have a lovely day!
Alex

-- 
<https://www.alejandro-colomar.es/>

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [PATCH v4 0/2] strto[u]l.3: BUGS and CAVEATS
  2025-03-21 20:41 [PATCH v1] man/man3/strtoul.3: BUGS: Signed numbers are not rejected Alejandro Colomar
                   ` (2 preceding siblings ...)
  2025-03-23  0:30 ` [PATCH v3 0/2] strto[u]l.3: BUGS and CAVEATS Alejandro Colomar
@ 2025-03-23 11:43 ` Alejandro Colomar
  2025-03-23 11:43   ` [PATCH v4 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected Alejandro Colomar
  2025-03-23 11:43   ` [PATCH v4 2/2] man/man3/strtol.3: CAVEATS: Clarify how to perform range checks Alejandro Colomar
  3 siblings, 2 replies; 24+ messages in thread
From: Alejandro Colomar @ 2025-03-23 11:43 UTC (permalink / raw)
  To: linux-man, Bruno Haible; +Cc: Alejandro Colomar

[-- Attachment #1: Type: text/plain, Size: 1910 bytes --]

Hi!

Here's v4, with minor wording fixes.  Bruno, I've added you as
Co-authored-by in patch 1/2.  Please sign the patch if you like it.


Cheers,
Alex

Alejandro Colomar (2):
  man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not
    rejected
  man/man3/strtol.3: CAVEATS: Clarify how to perform range checks

 man/man3/strtol.3  | 19 +++++++++++++++++++
 man/man3/strtoul.3 | 18 +++++++++++++-----
 2 files changed, 32 insertions(+), 5 deletions(-)

Range-diff against v3:
1:  3c456a1a0 ! 1:  4a1de398d man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected
    @@ Commit message
     
         Link: <https://stackoverflow.com/questions/60955490/strtoul-what-is-the-correct-return-value-for-very-negative-strings>
         Reported-by: Bruno Haible <bruno@clisp.org>
    +    Co-authored-by: Bruno Haible <bruno@clisp.org>
         Signed-off-by: Alejandro Colomar <alx@kernel.org>
     
      ## man/man3/strtol.3 ##
    @@ man/man3/strtol.3: .SH CAVEATS
     +.SH BUGS
     +.SS White space
     +These functions silently accept leading white space.
    -+One should call
    ++To reject white space, call
     +.BR isspace (3)
     +before
    -+.BR strtol ()
    -+to reject white space.
    ++.BR strtol ().
      .SH EXAMPLES
      The program shown below demonstrates the use of
      .BR strtol ().
    @@ man/man3/strtoul.3: .SH CAVEATS
     +.SS White space
     +These functions silently accept leading whitespace.
     +.SS isalnum(3)
    -+One should call
    ++To reject white space and/or a sign, call
     +.BR isalnum (3)
     +before
    -+.BR strtoul ()
    -+to reject white space and/or a sign.
    ++.BR strtoul ().
      .SH EXAMPLES
      See the example on the
      .BR strtol (3)
2:  020b468a3 = 2:  98af3aa6c man/man3/strtol.3: CAVEATS: Clarify how to perform range checks
-- 
2.47.2


[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 24+ messages in thread

* [PATCH v4 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected
  2025-03-23 11:43 ` [PATCH v4 0/2] strto[u]l.3: BUGS and CAVEATS Alejandro Colomar
@ 2025-03-23 11:43   ` Alejandro Colomar
  2025-03-23 13:20     ` Bruno Haible
  2025-03-23 11:43   ` [PATCH v4 2/2] man/man3/strtol.3: CAVEATS: Clarify how to perform range checks Alejandro Colomar
  1 sibling, 1 reply; 24+ messages in thread
From: Alejandro Colomar @ 2025-03-23 11:43 UTC (permalink / raw)
  To: linux-man, Bruno Haible; +Cc: Alejandro Colomar

[-- Attachment #1: Type: text/plain, Size: 1662 bytes --]

Link: <https://stackoverflow.com/questions/60955490/strtoul-what-is-the-correct-return-value-for-very-negative-strings>
Reported-by: Bruno Haible <bruno@clisp.org>
Co-authored-by: Bruno Haible <bruno@clisp.org>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
---
 man/man3/strtol.3  |  7 +++++++
 man/man3/strtoul.3 | 18 +++++++++++++-----
 2 files changed, 20 insertions(+), 5 deletions(-)

diff --git a/man/man3/strtol.3 b/man/man3/strtol.3
index 9323873a9..f9c9af4bc 100644
--- a/man/man3/strtol.3
+++ b/man/man3/strtol.3
@@ -224,6 +224,13 @@ .SH CAVEATS
     goto unsupported_base;
 .EE
 .in
+.SH BUGS
+.SS White space
+These functions silently accept leading white space.
+To reject white space, call
+.BR isspace (3)
+before
+.BR strtol ().
 .SH EXAMPLES
 The program shown below demonstrates the use of
 .BR strtol ().
diff --git a/man/man3/strtoul.3 b/man/man3/strtoul.3
index 9eb260dae..c4f8961a4 100644
--- a/man/man3/strtoul.3
+++ b/man/man3/strtoul.3
@@ -204,11 +204,19 @@ .SH CAVEATS
 and then determine if an error occurred by checking whether
 .I errno
 has a nonzero value after the call.
-.P
-Negative values are considered valid input and are
-silently converted to the equivalent
-.I "unsigned long"
-value.
+.SH BUGS
+.SS Signed numbers
+Some negative values
+are considered valid input and
+are silently converted to
+.IR "\%unsigned\ long" .
+.SS White space
+These functions silently accept leading whitespace.
+.SS isalnum(3)
+To reject white space and/or a sign, call
+.BR isalnum (3)
+before
+.BR strtoul ().
 .SH EXAMPLES
 See the example on the
 .BR strtol (3)
-- 
2.47.2


[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH v4 2/2] man/man3/strtol.3: CAVEATS: Clarify how to perform range checks
  2025-03-23 11:43 ` [PATCH v4 0/2] strto[u]l.3: BUGS and CAVEATS Alejandro Colomar
  2025-03-23 11:43   ` [PATCH v4 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected Alejandro Colomar
@ 2025-03-23 11:43   ` Alejandro Colomar
  1 sibling, 0 replies; 24+ messages in thread
From: Alejandro Colomar @ 2025-03-23 11:43 UTC (permalink / raw)
  To: linux-man, Bruno Haible; +Cc: Alejandro Colomar

[-- Attachment #1: Type: text/plain, Size: 815 bytes --]

Reported-by: Bruno Haible <bruno@clisp.org>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
---
 man/man3/strtol.3 | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/man/man3/strtol.3 b/man/man3/strtol.3
index f9c9af4bc..f1c5b6ec1 100644
--- a/man/man3/strtol.3
+++ b/man/man3/strtol.3
@@ -192,6 +192,7 @@ .SH HISTORY
 .BR strtoll ()
 POSIX.1-2001, C99.
 .SH CAVEATS
+.SS Range checks
 Since
 .BR strtol ()
 can legitimately return 0,
@@ -210,6 +211,17 @@ .SH CAVEATS
 .I errno == ERANGE
 after the call.
 .P
+.in +4n
+.EX
+errno = 0;
+n = strtol(s, NULL, base)
+if ((errno == ERANGE && n == min) || n < min)
+	goto too_low;
+if ((errno == ERANGE && n == max) || n > max)
+	goto too_high;
+.EE
+.in
+.SS base
 If the
 .I base
 needs to be tested,
-- 
2.47.2


[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply related	[flat|nested] 24+ messages in thread

* Re: [PATCH v4 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected
  2025-03-23 11:43   ` [PATCH v4 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected Alejandro Colomar
@ 2025-03-23 13:20     ` Bruno Haible
  2025-03-23 14:00       ` Alejandro Colomar
  0 siblings, 1 reply; 24+ messages in thread
From: Bruno Haible @ 2025-03-23 13:20 UTC (permalink / raw)
  To: linux-man, Alejandro Colomar

Looks all good to me.

Signed-off-by: Bruno Haible <bruno@clisp.org>




^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH v4 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected
  2025-03-23 13:20     ` Bruno Haible
@ 2025-03-23 14:00       ` Alejandro Colomar
  2025-03-23 15:52         ` Bruno Haible
  0 siblings, 1 reply; 24+ messages in thread
From: Alejandro Colomar @ 2025-03-23 14:00 UTC (permalink / raw)
  To: Bruno Haible; +Cc: linux-man

[-- Attachment #1: Type: text/plain, Size: 435 bytes --]

Hi Bruno,

On Sun, Mar 23, 2025 at 02:20:28PM +0100, Bruno Haible wrote:
> Looks all good to me.
> 
> Signed-off-by: Bruno Haible <bruno@clisp.org>

Thanks!  I've applied this patch:
<https://www.alejandro-colomar.es/src/alx/linux/man-pages/man-pages.git/commit/?h=contrib&id=cbcf76d19f864da8c54e41b600ff5661b195b58e>

Is patch 2/2 also good to you?


Have a lovely day!
Alex

-- 
<https://www.alejandro-colomar.es/>

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH v4 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected
  2025-03-23 14:00       ` Alejandro Colomar
@ 2025-03-23 15:52         ` Bruno Haible
  2025-03-23 16:55           ` Alejandro Colomar
  2025-03-23 18:55           ` Alejandro Colomar
  0 siblings, 2 replies; 24+ messages in thread
From: Bruno Haible @ 2025-03-23 15:52 UTC (permalink / raw)
  To: Alejandro Colomar; +Cc: linux-man

Alejandro Colomar wrote:
> Is patch 2/2 also good to you?

I couldn't tell without looking at the entire page
("groff -Tutf8 -mandoc strtol.3 | less -R"). But now...

> <https://www.alejandro-colomar.es/src/alx/linux/man-pages/man-pages.git/commit/?h=contrib&id=cbcf76d19f864da8c54e41b600ff5661b195b58e>

you gave me the information where to look at your work-in-progress tree.

Here are my findings on these two pages:

* In strtol.3, the example has three mistakes:
  - Missing semicolon at the end of the second line.
  - If LONG_MIN < min < LONG_MAX, the condition (errno == ERANGE && n == min)
    will never be true.
    If LONG_MIN < max < LONG_MAX, the condition (errno == ERANGE && n == max)
    will never be true.
  - It does not distinguish success with value 0 from failure due to
    no digits. (This matters when min <= 0 <= max.) Since errno is not
    guaranteed to be set in this case, the caller needs to look at *endptr.
    The example thus becomes:

           char *end;
           errno = 0;
           n = strtol(s, &end, base);
           if (end == s)
                goto no_number;
           if ((errno == ERANGE && n == LONG_MIN) || n < min)
                goto too_low;
           if ((errno == ERANGE && n == LONG_MAX) || n > max)
                goto too_high;

* strtol.3 and strtoul.3 mention
  "If base is zero or 16, the string may then include a "0x" or "0X" prefix,
   and the number will be read in base 16"
  They should also mention:
  "If base is zero or 2, the string may then include a "0b" or "0B" prefix,
   and the number will be read in base 2"
  References:
  - ISO C 23 § 7.24.1.7.(3)
  - https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=64924422a99690d147a166b4de3103f3bf3eaf6c

Bruno




^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH v4 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected
  2025-03-23 15:52         ` Bruno Haible
@ 2025-03-23 16:55           ` Alejandro Colomar
  2025-03-23 17:03             ` Alejandro Colomar
  2025-03-23 18:55           ` Alejandro Colomar
  1 sibling, 1 reply; 24+ messages in thread
From: Alejandro Colomar @ 2025-03-23 16:55 UTC (permalink / raw)
  To: Bruno Haible; +Cc: linux-man

[-- Attachment #1: Type: text/plain, Size: 2691 bytes --]

Hi Bruno,

On Sun, Mar 23, 2025 at 04:52:15PM +0100, Bruno Haible wrote:
> Alejandro Colomar wrote:
> > Is patch 2/2 also good to you?
> 
> I couldn't tell without looking at the entire page
> ("groff -Tutf8 -mandoc strtol.3 | less -R"). But now...
> 
> > <https://www.alejandro-colomar.es/src/alx/linux/man-pages/man-pages.git/commit/?h=contrib&id=cbcf76d19f864da8c54e41b600ff5661b195b58e>
> 
> you gave me the information where to look at your work-in-progress tree.

Yup.  :)

> Here are my findings on these two pages:
> 
> * In strtol.3, the example has three mistakes:
>   - Missing semicolon at the end of the second line.

Thanks!

>   - If LONG_MIN < min < LONG_MAX, the condition (errno == ERANGE && n == min)
>     will never be true.
>     If LONG_MIN < max < LONG_MAX, the condition (errno == ERANGE && n == max)
>     will never be true.

D'oh!  I'm too used to strtoi(3bsd) that I make these mistakes when
switching to strtol(3).

>   - It does not distinguish success with value 0 from failure due to
>     no digits. (This matters when min <= 0 <= max.) Since errno is not
>     guaranteed to be set in this case, the caller needs to look at *endptr.
>     The example thus becomes:

Yeah, I wanted to isolate the range checking from the rest.  Maybe I
should just put this in that sample code?:

         if ((errno == ERANGE && n == LONG_MIN) || n < min)
              goto too_low;
         if ((errno == ERANGE && n == LONG_MAX) || n > max)
              goto too_high;

Without having the strtol(3) call at all?

> 
>            char *end;
>            errno = 0;
>            n = strtol(s, &end, base);
>            if (end == s)
>                 goto no_number;
>            if ((errno == ERANGE && n == LONG_MIN) || n < min)
>                 goto too_low;
>            if ((errno == ERANGE && n == LONG_MAX) || n > max)
>                 goto too_high;

On the other hand, I should put this in the EXAMPLES section, to have
a full example.

> 
> * strtol.3 and strtoul.3 mention
>   "If base is zero or 16, the string may then include a "0x" or "0X" prefix,
>    and the number will be read in base 16"
>   They should also mention:
>   "If base is zero or 2, the string may then include a "0b" or "0B" prefix,
>    and the number will be read in base 2"

Yep, I need to update many pages for C23.  I'll do this update for this
page now.

Thanks!


Cheers,
Alex

>   References:
>   - ISO C 23 § 7.24.1.7.(3)
>   - https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=64924422a99690d147a166b4de3103f3bf3eaf6c
> 
> Bruno
> 
> 
> 
> 

-- 
<https://www.alejandro-colomar.es/>

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH v4 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected
  2025-03-23 16:55           ` Alejandro Colomar
@ 2025-03-23 17:03             ` Alejandro Colomar
  2025-03-23 17:11               ` Bruno Haible
  0 siblings, 1 reply; 24+ messages in thread
From: Alejandro Colomar @ 2025-03-23 17:03 UTC (permalink / raw)
  To: Bruno Haible; +Cc: linux-man

[-- Attachment #1: Type: text/plain, Size: 3158 bytes --]

On Sun, Mar 23, 2025 at 05:55:50PM +0100, Alejandro Colomar wrote:
> Hi Bruno,
> 
> On Sun, Mar 23, 2025 at 04:52:15PM +0100, Bruno Haible wrote:
> > Alejandro Colomar wrote:
> > > Is patch 2/2 also good to you?
> > 
> > I couldn't tell without looking at the entire page
> > ("groff -Tutf8 -mandoc strtol.3 | less -R"). But now...
> > 
> > > <https://www.alejandro-colomar.es/src/alx/linux/man-pages/man-pages.git/commit/?h=contrib&id=cbcf76d19f864da8c54e41b600ff5661b195b58e>
> > 
> > you gave me the information where to look at your work-in-progress tree.
> 
> Yup.  :)
> 
> > Here are my findings on these two pages:
> > 
> > * In strtol.3, the example has three mistakes:
> >   - Missing semicolon at the end of the second line.
> 
> Thanks!
> 
> >   - If LONG_MIN < min < LONG_MAX, the condition (errno == ERANGE && n == min)
> >     will never be true.
> >     If LONG_MIN < max < LONG_MAX, the condition (errno == ERANGE && n == max)
> >     will never be true.
> 
> D'oh!  I'm too used to strtoi(3bsd) that I make these mistakes when
> switching to strtol(3).
> 
> >   - It does not distinguish success with value 0 from failure due to
> >     no digits. (This matters when min <= 0 <= max.) Since errno is not
> >     guaranteed to be set in this case, the caller needs to look at *endptr.
> >     The example thus becomes:
> 
> Yeah, I wanted to isolate the range checking from the rest.  Maybe I
> should just put this in that sample code?:
> 
>          if ((errno == ERANGE && n == LONG_MIN) || n < min)
>               goto too_low;
>          if ((errno == ERANGE && n == LONG_MAX) || n > max)
>               goto too_high;
> 
> Without having the strtol(3) call at all?
> 
> > 
> >            char *end;
> >            errno = 0;
> >            n = strtol(s, &end, base);
> >            if (end == s)
> >                 goto no_number;
> >            if ((errno == ERANGE && n == LONG_MIN) || n < min)
> >                 goto too_low;
> >            if ((errno == ERANGE && n == LONG_MAX) || n > max)
> >                 goto too_high;
> 

I ended up doing what you said:

<https://www.alejandro-colomar.es/src/alx/linux/man-pages/man-pages.git/commit/?h=contrib&id=ebe5a89dcd431d15c54ebc22eaa35721496fee4b>

> On the other hand, I should put this in the EXAMPLES section, to have
> a full example.
> 
> > 
> > * strtol.3 and strtoul.3 mention
> >   "If base is zero or 16, the string may then include a "0x" or "0X" prefix,
> >    and the number will be read in base 16"
> >   They should also mention:
> >   "If base is zero or 2, the string may then include a "0b" or "0B" prefix,
> >    and the number will be read in base 2"
> 
> Yep, I need to update many pages for C23.  I'll do this update for this
> page now.
> 
> Thanks!
> 
> 
> Cheers,
> Alex
> 
> >   References:
> >   - ISO C 23 § 7.24.1.7.(3)
> >   - https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=64924422a99690d147a166b4de3103f3bf3eaf6c
> > 
> > Bruno
> > 
> > 
> > 
> > 
> 
> -- 
> <https://www.alejandro-colomar.es/>



-- 
<https://www.alejandro-colomar.es/>

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH v4 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected
  2025-03-23 17:03             ` Alejandro Colomar
@ 2025-03-23 17:11               ` Bruno Haible
  2025-03-23 18:35                 ` Alejandro Colomar
  0 siblings, 1 reply; 24+ messages in thread
From: Bruno Haible @ 2025-03-23 17:11 UTC (permalink / raw)
  To: Alejandro Colomar; +Cc: linux-man

Alejandro,

> I ended up doing what you said:
> 
> <https://www.alejandro-colomar.es/src/alx/linux/man-pages/man-pages.git/commit/?h=contrib&id=ebe5a89dcd431d15c54ebc22eaa35721496fee4b>

+if ((errno == ERANGE && n == LONG_MIN) || n > max)

Here: LONG_MIN -> LONG_MAX

Signed-off-by: Bruno Haible <bruno@clisp.org>




^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH v4 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected
  2025-03-23 17:11               ` Bruno Haible
@ 2025-03-23 18:35                 ` Alejandro Colomar
  0 siblings, 0 replies; 24+ messages in thread
From: Alejandro Colomar @ 2025-03-23 18:35 UTC (permalink / raw)
  To: Bruno Haible; +Cc: linux-man

[-- Attachment #1: Type: text/plain, Size: 502 bytes --]

On Sun, Mar 23, 2025 at 06:11:39PM +0100, Bruno Haible wrote:
> Alejandro,
> 
> > I ended up doing what you said:
> > 
> > <https://www.alejandro-colomar.es/src/alx/linux/man-pages/man-pages.git/commit/?h=contrib&id=ebe5a89dcd431d15c54ebc22eaa35721496fee4b>
> 
> +if ((errno == ERANGE && n == LONG_MIN) || n > max)
> 
> Here: LONG_MIN -> LONG_MAX
> 
> Signed-off-by: Bruno Haible <bruno@clisp.org>

Thanks!  Ameded and pushed.

Cheers,
Alex

-- 
<https://www.alejandro-colomar.es/>

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH v4 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected
  2025-03-23 15:52         ` Bruno Haible
  2025-03-23 16:55           ` Alejandro Colomar
@ 2025-03-23 18:55           ` Alejandro Colomar
  2025-03-23 19:26             ` Bruno Haible
  1 sibling, 1 reply; 24+ messages in thread
From: Alejandro Colomar @ 2025-03-23 18:55 UTC (permalink / raw)
  To: Bruno Haible; +Cc: linux-man

[-- Attachment #1: Type: text/plain, Size: 4865 bytes --]

Hi Bruno,

On Sun, Mar 23, 2025 at 04:52:15PM +0100, Bruno Haible wrote:
> * strtol.3 and strtoul.3 mention
>   "If base is zero or 16, the string may then include a "0x" or "0X" prefix,
>    and the number will be read in base 16"
>   They should also mention:
>   "If base is zero or 2, the string may then include a "0b" or "0B" prefix,
>    and the number will be read in base 2"
>   References:
>   - ISO C 23 § 7.24.1.7.(3)
>   - https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=64924422a99690d147a166b4de3103f3bf3eaf6c

Here's the proposed fix:

<https://www.alejandro-colomar.es/src/alx/linux/man-pages/man-pages.git/commit/?h=contrib&id=4f35fc20ec258842b713da6b0e7d06fd59b70abe>

	alx@devuan:~/src/linux/man-pages/man-pages/contrib$ git show
	commit 4f35fc20ec258842b713da6b0e7d06fd59b70abe (HEAD -> contrib, alx/contrib)
	Author: Alejandro Colomar <alx@kernel.org>
	Date:   Sun Mar 23 19:47:33 2025 +0100

	    man/man3/strto[u]l.3: C23 added "0b" and "0B"
	    
	    Link: <https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=64924422a99690d147a166b4de3103f3bf3eaf6c>
	    Reported-by: Bruno Haible <bruno@clisp.org>
	    Signed-off-by: Alejandro Colomar <alx@kernel.org>

	diff --git a/man/man3/strtol.3 b/man/man3/strtol.3
	index 2ae48119b..9c8791b07 100644
	--- a/man/man3/strtol.3
	+++ b/man/man3/strtol.3
	@@ -53,8 +53,13 @@ .SH DESCRIPTION
	 If
	 .I base
	 is zero or 16, the string may then include a
	-"0x" or "0X" prefix, and the number will be read in base 16; otherwise, a
	-zero
	+"0x" or "0X" prefix, and the number will be read in base 16;
	+if
	+.I base
	+is zero or 2, the string may then include a
	+"0b" or "0B" prefix, and the number will be read in base 2;
	+otherwise,
	+a zero
	 .I base
	 is taken as 10 (decimal) unless the next character
	 is \[aq]0\[aq], in which case it is taken as 8 (octal).
	diff --git a/man/man3/strtoul.3 b/man/man3/strtoul.3
	index c6a2bb9be..4e85f7a30 100644
	--- a/man/man3/strtoul.3
	+++ b/man/man3/strtoul.3
	@@ -59,8 +59,13 @@ .SH DESCRIPTION
	 If
	 .I base
	 is zero or 16, the string may then include a
	-"0x" or "0X" prefix, and the number will be read in base 16; otherwise, a
	-zero
	+"0x" or "0X" prefix, and the number will be read in base 16;
	+if
	+.I base
	+is zero or 2, the string may then include a
	+"0b" or "0B" prefix, and the number will be read in base 2;
	+otherwise,
	+a zero
	 .I base
	 is taken as 10 (decimal) unless the next character
	 is \[aq]0\[aq], in which case it is taken as 8 (octal).
	@@ -182,7 +187,7 @@ .SH VERSIONS
	 or to
	 .BR strtoul ().
	 .SH STANDARDS
	-C11, POSIX.1-2008.
	+C23, POSIX.1-2008.
	 .SH HISTORY
	 .TP
	 .BR strtoul ()
	@@ -190,6 +195,10 @@ .SH HISTORY
	 .TP
	 .BR strtoull ()
	 POSIX.1-2001, C99.
	+.TP
	+"0b", "0B"
	+C23.
	+glibc 2.38.
	 .SH CAVEATS
	 Since
	 .BR strtoul ()

And here's a diff of the rendered pages:

	alx@devuan:~/src/linux/man-pages/man-pages/contrib$ diffman-git HEAD
	--- HEAD^:man/man3/strtol.3
	+++ HEAD:man/man3/strtol.3
	@@ -32,7 +32,9 @@
	      space (as determined by isspace(3)) followed by  a  single
	      optional  '+'  or  '-'  sign.   If base is zero or 16, the
	      string may then include a "0x" or  "0X"  prefix,  and  the
	-     number  will be read in base 16; otherwise, a zero base is
	+     number  will be read in base 16; if base is zero or 2, the
	+     string may then include a "0b" or  "0B"  prefix,  and  the
	+     number  will  be read in base 2; otherwise, a zero base is
	      taken as 10 (decimal) unless the next character is '0', in
	      which case it is taken as 8 (octal).
	 
	--- HEAD^:man/man3/strtoul.3
	+++ HEAD:man/man3/strtoul.3
	@@ -32,7 +32,9 @@
	      space  (as  determined by isspace(3)) followed by a single
	      optional '+' or '-' sign.  If base  is  zero  or  16,  the
	      string  may  then  include  a "0x" or "0X" prefix, and the
	-     number will be read in base 16; otherwise, a zero base  is
	+     number will be read in base 16; if base is zero or 2,  the
	+     string  may  then  include  a "0b" or "0B" prefix, and the
	+     number will be read in base 2; otherwise, a zero  base  is
	      taken as 10 (decimal) unless the next character is '0', in
	      which case it is taken as 8 (octal).
	 
	@@ -100,7 +102,7 @@
	      lent to strtoull() or to strtoul().
	 
	 STANDARDS
	-     C11, POSIX.1‐2008.
	+     C23, POSIX.1‐2008.
	 
	 HISTORY
	      strtoul()
	@@ -109,6 +111,9 @@
	      strtoull()
		     POSIX.1‐2001, C99.
	 
	+     "0b", "0B"
	+            C23.  glibc 2.38.
	+
	 CAVEATS
	      Since strtoul() can legitimately  return  0  or  ULONG_MAX
	      (ULLONG_MAX  for  strtoull()) on both success and failure,


Have a lovely night!
Alex

-- 
<https://www.alejandro-colomar.es/>

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH v4 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected
  2025-03-23 18:55           ` Alejandro Colomar
@ 2025-03-23 19:26             ` Bruno Haible
  2025-03-23 19:47               ` Alejandro Colomar
  0 siblings, 1 reply; 24+ messages in thread
From: Bruno Haible @ 2025-03-23 19:26 UTC (permalink / raw)
  To: Alejandro Colomar; +Cc: linux-man

Alejandro Colomar wrote:
> 	diff --git a/man/man3/strtoul.3 b/man/man3/strtoul.3
> 	index c6a2bb9be..4e85f7a30 100644
> 	--- a/man/man3/strtoul.3
> 	+++ b/man/man3/strtoul.3
> 	@@ -182,7 +187,7 @@ .SH VERSIONS
> 	 or to
> 	 .BR strtoul ().
> 	 .SH STANDARDS
> 	-C11, POSIX.1-2008.
> 	+C23, POSIX.1-2008.
> 	 .SH HISTORY
> 	 .TP
> 	 .BR strtoul ()
> 	@@ -190,6 +195,10 @@ .SH HISTORY
> 	 .TP
> 	 .BR strtoull ()
> 	 POSIX.1-2001, C99.
> 	+.TP
> 	+"0b", "0B"
> 	+C23.
> 	+glibc 2.38.
> 	 .SH CAVEATS
> 	 Since
> 	 .BR strtoul ()

These same two hunks could also be applied to strtol.3.

Bruno




^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH v4 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected
  2025-03-23 19:26             ` Bruno Haible
@ 2025-03-23 19:47               ` Alejandro Colomar
  0 siblings, 0 replies; 24+ messages in thread
From: Alejandro Colomar @ 2025-03-23 19:47 UTC (permalink / raw)
  To: Bruno Haible; +Cc: linux-man

[-- Attachment #1: Type: text/plain, Size: 1388 bytes --]

On Sun, Mar 23, 2025 at 08:26:02PM +0100, Bruno Haible wrote:
> Alejandro Colomar wrote:
> > 	diff --git a/man/man3/strtoul.3 b/man/man3/strtoul.3
> > 	index c6a2bb9be..4e85f7a30 100644
> > 	--- a/man/man3/strtoul.3
> > 	+++ b/man/man3/strtoul.3
> > 	@@ -182,7 +187,7 @@ .SH VERSIONS
> > 	 or to
> > 	 .BR strtoul ().
> > 	 .SH STANDARDS
> > 	-C11, POSIX.1-2008.
> > 	+C23, POSIX.1-2008.
> > 	 .SH HISTORY
> > 	 .TP
> > 	 .BR strtoul ()
> > 	@@ -190,6 +195,10 @@ .SH HISTORY
> > 	 .TP
> > 	 .BR strtoull ()
> > 	 POSIX.1-2001, C99.
> > 	+.TP
> > 	+"0b", "0B"
> > 	+C23.
> > 	+glibc 2.38.
> > 	 .SH CAVEATS
> > 	 Since
> > 	 .BR strtoul ()
> 
> These same two hunks could also be applied to strtol.3.

Yep, I had forgotten.  I've applied them a moment ago.  BTW, I also
updated the info about POSIX too:

<https://www.alejandro-colomar.es/src/alx/linux/man-pages/man-pages.git/commit/?h=contrib&id=2b2519c7722166dbe4313da6ec048d137ea42ba7>

	@@ -183,7 +188,7 @@ .SH VERSIONS
	 or to
	 .BR strtol ().
	 .SH STANDARDS
	-C11, POSIX.1-2008.
	+C23, POSIX.1-2024.
	 .SH HISTORY
	 .TP
	 .BR strtol ()
	@@ -191,6 +196,11 @@ .SH HISTORY
	 .TP
	 .BR strtoll ()
	 POSIX.1-2001, C99.
	+.TP
	+"0b", "0B"
	+C23.
	+glibc 2.38.
	+(Not in POSIX.)
	 .SH CAVEATS
	 .SS Range checks
	 Since


Cheers,
Alex

-- 
<https://www.alejandro-colomar.es/>

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 24+ messages in thread

end of thread, other threads:[~2025-03-23 19:47 UTC | newest]

Thread overview: 24+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-03-21 20:41 [PATCH v1] man/man3/strtoul.3: BUGS: Signed numbers are not rejected Alejandro Colomar
2025-03-21 21:31 ` Bruno Haible
2025-03-21 22:21   ` Alejandro Colomar
2025-03-21 22:18 ` [PATCH v2 0/2] strto[u]l(3) BUGS and CAVEATS Alejandro Colomar
2025-03-21 22:18   ` [PATCH v2 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected Alejandro Colomar
2025-03-21 22:18   ` [PATCH v2 2/2] man/man3/strtol.3: CAVEATS: Clarify how to perform range checks Alejandro Colomar
2025-03-23  0:30 ` [PATCH v3 0/2] strto[u]l.3: BUGS and CAVEATS Alejandro Colomar
2025-03-23  0:30   ` [PATCH v3 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected Alejandro Colomar
2025-03-23 10:27     ` Bruno Haible
2025-03-23 11:15       ` Alejandro Colomar
2025-03-23  0:30   ` [PATCH v3 2/2] man/man3/strtol.3: CAVEATS: Clarify how to perform range checks Alejandro Colomar
2025-03-23 11:43 ` [PATCH v4 0/2] strto[u]l.3: BUGS and CAVEATS Alejandro Colomar
2025-03-23 11:43   ` [PATCH v4 1/2] man/man3/strto[u]l.3: BUGS: Signed numbers and white space are not rejected Alejandro Colomar
2025-03-23 13:20     ` Bruno Haible
2025-03-23 14:00       ` Alejandro Colomar
2025-03-23 15:52         ` Bruno Haible
2025-03-23 16:55           ` Alejandro Colomar
2025-03-23 17:03             ` Alejandro Colomar
2025-03-23 17:11               ` Bruno Haible
2025-03-23 18:35                 ` Alejandro Colomar
2025-03-23 18:55           ` Alejandro Colomar
2025-03-23 19:26             ` Bruno Haible
2025-03-23 19:47               ` Alejandro Colomar
2025-03-23 11:43   ` [PATCH v4 2/2] man/man3/strtol.3: CAVEATS: Clarify how to perform range checks Alejandro Colomar

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox