All of lore.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.