public inbox for linux-man@vger.kernel.org
 help / color / mirror / Atom feed
From: Alejandro Colomar <alx.manpages@gmail.com>
To: linux-man@vger.kernel.org
Cc: Alejandro Colomar <alx@kernel.org>,
	Martin Sebor <msebor@redhat.com>,
	"G. Branden Robinson" <g.branden.robinson@gmail.com>,
	Douglas McIlroy <douglas.mcilroy@dartmouth.edu>,
	Jakub Wilk <jwilk@jwilk.net>, Serge Hallyn <serge@hallyn.com>,
	Iker Pedrosa <ipedrosa@redhat.com>,
	Andrew Pinski <pinskia@gmail.com>
Subject: Re: [PATCH v5 3/5] stpcpy.3, strcpy.3, strcat.3: Document in a single page
Date: Fri, 16 Dec 2022 15:46:01 +0100	[thread overview]
Message-ID: <8c5dceff-0156-ae5a-1d51-009dfb5eccd3@gmail.com> (raw)
In-Reply-To: <20221215002648.35111-4-alx@kernel.org>


[-- Attachment #1.1: Type: text/plain, Size: 13361 bytes --]

Hi!

The formatted version of this page was sent accidentally as reply to 2/3.
Since 2/5 are only link pages, there's no formatted page for them.

Cheers,

Alex

On 12/15/22 01:26, Alejandro Colomar wrote:
> Rewrite to be consistent with the new string_copy.7 page.
> 
> Cc: Martin Sebor <msebor@redhat.com>
> Cc: "G. Branden Robinson" <g.branden.robinson@gmail.com>
> Cc: Douglas McIlroy <douglas.mcilroy@dartmouth.edu>
> Cc: Jakub Wilk <jwilk@jwilk.net>
> Cc: Serge Hallyn <serge@hallyn.com>
> Cc: Iker Pedrosa <ipedrosa@redhat.com>
> Cc: Andrew Pinski <pinskia@gmail.com>
> Signed-off-by: Alejandro Colomar <alx@kernel.org>
> ---
>   man3/stpcpy.3 |  13 ---
>   man3/strcat.3 | 161 +----------------------------------
>   man3/strcpy.3 | 226 +++++++++++++++++++++++++++++++-------------------
>   3 files changed, 143 insertions(+), 257 deletions(-)
> 
> diff --git a/man3/stpcpy.3 b/man3/stpcpy.3
> index 5770790fc..d01c0239b 100644
> --- a/man3/stpcpy.3
> +++ b/man3/stpcpy.3
> @@ -14,19 +14,6 @@ .SH SYNOPSIS
>   .PP
>   .BI "char *stpcpy(char *restrict " dest ", const char *restrict " src );
>   .fi
> -.PP
> -.RS -4
> -Feature Test Macro Requirements for glibc (see
> -.BR feature_test_macros (7)):
> -.RE
> -.PP
> -.BR stpcpy ():
> -.nf
> -    Since glibc 2.10:
> -        _POSIX_C_SOURCE >= 200809L
> -    Before glibc 2.10:
> -        _GNU_SOURCE
> -.fi
>   .SH DESCRIPTION
>   The
>   .BR stpcpy ()
> diff --git a/man3/strcat.3 b/man3/strcat.3
> index 277e5b1e4..ff7476a84 100644
> --- a/man3/strcat.3
> +++ b/man3/strcat.3
> @@ -1,160 +1 @@
> -.\" Copyright 1993 David Metcalfe (david@prism.demon.co.uk)
> -.\"
> -.\" SPDX-License-Identifier: Linux-man-pages-copyleft
> -.\"
> -.\" References consulted:
> -.\"     Linux libc source code
> -.\"     Lewine's _POSIX Programmer's Guide_ (O'Reilly & Associates, 1991)
> -.\"     386BSD man pages
> -.\" Modified Sat Jul 24 18:11:47 1993 by Rik Faith (faith@cs.unc.edu)
> -.\" 2007-06-15, Marc Boyer <marc.boyer@enseeiht.fr> + mtk
> -.\"     Improve discussion of strncat().
> -.TH strcat 3 (date) "Linux man-pages (unreleased)"
> -.SH NAME
> -strcat \- concatenate two strings
> -.SH LIBRARY
> -Standard C library
> -.RI ( libc ", " \-lc )
> -.SH SYNOPSIS
> -.nf
> -.B #include <string.h>
> -.PP
> -.BI "char *strcat(char *restrict " dest ", const char *restrict " src );
> -.fi
> -.SH DESCRIPTION
> -The
> -.BR strcat ()
> -function appends the
> -.I src
> -string to the
> -.I dest
> -string,
> -overwriting the terminating null byte (\(aq\e0\(aq) at the end of
> -.IR dest ,
> -and then adds a terminating null byte.
> -The strings may not overlap, and the
> -.I dest
> -string must have
> -enough space for the result.
> -If
> -.I dest
> -is not large enough, program behavior is unpredictable;
> -.IR "buffer overruns are a favorite avenue for attacking secure programs" .
> -.SH RETURN VALUE
> -The
> -.BR strcat ()
> -function returns a pointer to the resulting string
> -.IR dest .
> -.SH ATTRIBUTES
> -For an explanation of the terms used in this section, see
> -.BR attributes (7).
> -.ad l
> -.nh
> -.TS
> -allbox;
> -lbx lb lb
> -l l l.
> -Interface	Attribute	Value
> -T{
> -.BR strcat (),
> -.BR strncat ()
> -T}	Thread safety	MT-Safe
> -.TE
> -.hy
> -.ad
> -.sp 1
> -.SH STANDARDS
> -POSIX.1-2001, POSIX.1-2008, C89, C99, SVr4, 4.3BSD.
> -.SH NOTES
> -Some systems (the BSDs, Solaris, and others) provide the following function:
> -.PP
> -.in +4n
> -.EX
> -size_t strlcat(char *dest, const char *src, size_t size);
> -.EE
> -.in
> -.PP
> -This function appends the null-terminated string
> -.I src
> -to the string
> -.IR dest ,
> -copying at most
> -.I size\-strlen(dest)\-1
> -from
> -.IR src ,
> -and adds a terminating null byte to the result,
> -.I unless
> -.I size
> -is less than
> -.IR strlen(dest) .
> -This function fixes the buffer overrun problem of
> -.BR strcat (),
> -but the caller must still handle the possibility of data loss if
> -.I size
> -is too small.
> -The function returns the length of the string
> -.BR strlcat ()
> -tried to create; if the return value is greater than or equal to
> -.IR size ,
> -data loss occurred.
> -If data loss matters, the caller
> -.I must
> -either check the arguments before the call, or test the function return value.
> -.BR strlcat ()
> -is not present in glibc and is not standardized by POSIX,
> -.\" https://lwn.net/Articles/506530/
> -but is available on Linux via the
> -.I libbsd
> -library.
> -.\"
> -.SH EXAMPLES
> -Because
> -.BR strcat ()
> -must find the null byte that terminates the string
> -.I dest
> -using a search that starts at the beginning of the string,
> -the execution time of this function
> -scales according to the length of the string
> -.IR dest .
> -This can be demonstrated by running the program below.
> -(If the goal is to concatenate many strings to one target,
> -then manually copying the bytes from each source string
> -while maintaining a pointer to the end of the target string
> -will provide better performance.)
> -.\"
> -.SS Program source
> -\&
> -.\" SRC BEGIN (strcat.c)
> -.EX
> -#include <stdint.h>
> -#include <stdio.h>
> -#include <string.h>
> -#include <time.h>
> -
> -int
> -main(void)
> -{
> -#define LIM 4000000
> -    char p[LIM + 1];    /* +1 for terminating null byte */
> -    time_t base;
> -
> -    base = time(NULL);
> -    p[0] = \(aq\e0\(aq;
> -
> -    for (unsigned int j = 0; j < LIM; j++) {
> -        if ((j % 10000) == 0)
> -            printf("%u %jd\en", j, (intmax_t) (time(NULL) \- base));
> -        strcat(p, "a");
> -    }
> -}
> -.EE
> -.\" SRC END
> -.SH SEE ALSO
> -.BR bcopy (3),
> -.BR memccpy (3),
> -.BR memcpy (3),
> -.BR strcpy (3),
> -.BR string (3),
> -.BR strlcat (3bsd),
> -.BR wcscat (3),
> -.BR wcsncat (3)
> +.so man3/strcpy.3
> diff --git a/man3/strcpy.3 b/man3/strcpy.3
> index 74c3180ae..424648c46 100644
> --- a/man3/strcpy.3
> +++ b/man3/strcpy.3
> @@ -1,20 +1,10 @@
> -.\" Copyright (C) 1993 David Metcalfe (david@prism.demon.co.uk)
> +.\" Copyright 2022 Alejandro Colomar <alx@kernel.org>
>   .\"
>   .\" SPDX-License-Identifier: Linux-man-pages-copyleft
>   .\"
> -.\" References consulted:
> -.\"     Linux libc source code
> -.\"     Lewine's _POSIX Programmer's Guide_ (O'Reilly & Associates, 1991)
> -.\"     386BSD man pages
> -.\" Modified Sat Jul 24 18:06:49 1993 by Rik Faith (faith@cs.unc.edu)
> -.\" Modified Fri Aug 25 23:17:51 1995 by Andries Brouwer (aeb@cwi.nl)
> -.\" Modified Wed Dec 18 00:47:18 1996 by Andries Brouwer (aeb@cwi.nl)
> -.\" 2007-06-15, Marc Boyer <marc.boyer@enseeiht.fr> + mtk
> -.\"     Improve discussion of strncpy().
> -.\"
>   .TH strcpy 3 (date) "Linux man-pages (unreleased)"
>   .SH NAME
> -strcpy \- copy a string
> +strcpy \- copy or catenate a string
>   .SH LIBRARY
>   Standard C library
>   .RI ( libc ", " \-lc )
> @@ -22,26 +12,87 @@ .SH SYNOPSIS
>   .nf
>   .B #include <string.h>
>   .PP
> -.BI "char *strcpy(char *restrict " dest ", const char *restrict " src );
> +.BI "char *stpcpy(char *restrict " dst ", const char *restrict " src );
> +.BI "char *strcpy(char *restrict " dst ", const char *restrict " src );
> +.BI "char *strcat(char *restrict " dst ", const char *restrict " src );
> +.fi
> +.PP
> +.RS -4
> +Feature Test Macro Requirements for glibc (see
> +.BR feature_test_macros (7)):
> +.RE
> +.PP
> +.BR stpcpy ():
> +.nf
> +    Since glibc 2.10:
> +        _POSIX_C_SOURCE >= 200809L
> +    Before glibc 2.10:
> +        _GNU_SOURCE
>   .fi
>   .SH DESCRIPTION
> -The
> +.TP
> +.BR stpcpy ()
> +.TQ
>   .BR strcpy ()
> -function copies the string pointed to by
> +These functions copy the string pointed to by
>   .IR src ,
> -including the terminating null byte (\(aq\e0\(aq),
> -to the buffer pointed to by
> -.IR dest .
> -The strings may not overlap, and the destination string
> -.I dest
> -must be large enough to receive the copy.
> -.I Beware of buffer overruns!
> -(See BUGS.)
> +into a string
> +at the buffer pointed to by
> +.IR dst .
> +The programmer is responsible for allocating a buffer large enough,
> +that is,
> +.IR "strlen(src) + 1" .
> +They only differ in the return value.
> +.TP
> +.BR strcat ()
> +This function catenates the string pointed to by
> +.IR src ,
> +at the end of the string pointed to by
> +.IR dst .
> +The programmer is responsible for allocating a buffer large enough,
> +that is,
> +.IR "strlen(dst) + strlen(src) + 1" .
> +.PP
> +An implementation of these functions might be:
> +.PP
> +.in +4n
> +.EX
> +char *
> +stpcpy(char *restrict dst, const char *restrict src)
> +{
> +    char  *end;
> +
> +    end = mempcpy(dst, src, strlen(src));
> +    *end = \(aq\e0\(aq;
> +
> +    return end;
> +}
> +
> +char *
> +strcpy(char *restrict dst, const char *restrict src)
> +{
> +    stpcpy(dst, src);
> +    return dst;
> +}
> +
> +char *
> +strcat(char *restrict dst, const char *restrict src)
> +{
> +    stpcpy(dst + strlen(dst), src);
> +    return dst;
> +}
> +.EE
> +.in
>   .SH RETURN VALUE
> -The
> +.TP
> +.BR stpcpy ()
> +This function returns
> +a pointer to the terminating null byte at the end of the copied string.
> +.TP
>   .BR strcpy ()
> -function returns a pointer to
> -the destination string
> +.TQ
> +.BR strcat ()
> +These functions return
>   .IR dest .
>   .SH ATTRIBUTES
>   For an explanation of the terms used in this section, see
> @@ -54,73 +105,80 @@ .SH ATTRIBUTES
>   l l l.
>   Interface	Attribute	Value
>   T{
> -.BR strcpy ()
> +.BR stpcpy (),
> +.BR strcpy (),
> +.BR strcat ()
>   T}	Thread safety	MT-Safe
>   .TE
>   .hy
>   .ad
>   .sp 1
>   .SH STANDARDS
> +.TP
> +.BR stpcpy ()
> +POSIX.1-2008.
> +.TP
> +.BR strcpy ()
> +.TQ
> +.BR strcat ()
>   POSIX.1-2001, POSIX.1-2008, C89, C99, SVr4, 4.3BSD.
> -.SH NOTES
> -.SS strlcpy()
> -Some systems (the BSDs, Solaris, and others) provide the following function:
> +.SH CAVEATS
> +The strings
> +.I src
> +and
> +.I dst
> +may not overlap.
>   .PP
> -.in +4n
> -.EX
> -size_t strlcpy(char *dest, const char *src, size_t size);
> -.EE
> -.in
> -.PP
> -.\" http://static.usenix.org/event/usenix99/full_papers/millert/millert_html/index.html
> -.\"     "strlcpy and strlcat - consistent, safe, string copy and concatenation"
> -.\"     1999 USENIX Annual Technical Conference
> -This function is similar to
> -.BR strcpy (),
> -but it copies at most
> -.I size\-1
> -bytes to
> -.IR dest ,
> -truncating the string as necessary.
> -It always adds a terminating null byte.
> -This function fixes some of the problems of
> -.BR strcpy ()
> -but the caller must still handle the possibility of data loss if
> -.I size
> -is too small.
> -The return value of the function is the length of
> -.IR src ,
> -which allows truncation to be easily detected:
> -if the return value is greater than or equal to
> -.IR size ,
> -truncation occurred.
> -If loss of data matters, the caller
> -.I must
> -either check the arguments before the call,
> -or test the function return value.
> -.BR strlcpy ()
> -is not present in glibc and is not standardized by POSIX,
> -.\" https://lwn.net/Articles/506530/
> -but is available on Linux via the
> -.I libbsd
> -library.
> +If the destination buffer is not large enough,
> +the behavior is undefined.
> +See
> +.B _FORTIFY_SOURCE
> +in
> +.BR feature_test_macros (7).
>   .SH BUGS
> -If the destination string of a
> -.BR strcpy ()
> -is not large enough, then anything might happen.
> -Overflowing fixed-length string buffers is a favorite cracker technique
> -for taking complete control of the machine.
> -Any time a program reads or copies data into a buffer,
> -the program first needs to check that there's enough space.
> -This may be unnecessary if you can show that overflow is impossible,
> -but be careful: programs can get changed over time,
> -in ways that may make the impossible possible.
> +.TP
> +.BR strcat ()
> +This function can be very inefficient.
> +Read about
> +.UR https://www.joelonsoftware.com/\:2001/12/11/\:back\-to\-basics/
> +Shlemiel the painter
> +.UE .
> +.SH EXAMPLES
> +.EX
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <string.h>
> +
> +int
> +main(void)
> +{
> +    char    *p;
> +    char    buf1[BUFSIZ];
> +    char    buf2[BUFSIZ];
> +    size_t  len;
> +
> +    p = buf1;
> +    p = stpcpy(p, "Hello ");
> +    p = stpcpy(p, "world");
> +    p = stpcpy(p, "!");
> +    len = p \- buf1;
> +
> +    printf("[len = %zu]: ", len);
> +    puts(buf1);  // "Hello world!"
> +
> +    strcpy(buf2, "Hello ");
> +    strcat(buf2, "world");
> +    strcat(buf2, "!");
> +    len = strlen(buf2);
> +
> +    printf("[len = %zu]: ", len);
> +    puts(buf2);  // "Hello world!"
> +
> +    exit(EXIT_SUCCESS);
> +}
> +.EE
>   .SH SEE ALSO
> -.BR bcopy (3),
> -.BR memccpy (3),
> -.BR memcpy (3),
> -.BR memmove (3),
> -.BR stpcpy (3),
>   .BR strdup (3),
>   .BR string (3),
> -.BR wcscpy (3)
> +.BR wcscpy (3),
> +.BR string_copy (7)

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

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

  reply	other threads:[~2022-12-16 14:46 UTC|newest]

Thread overview: 53+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-12-11 23:59 string_copy(7): New manual page documenting string copying functions Alejandro Colomar
2022-12-12  0:17 ` Alejandro Colomar
2022-12-12  0:25 ` Alejandro Colomar
2022-12-12  0:32 ` Alejandro Colomar
2022-12-12 14:24 ` [PATCH 1/3] strcpy.3: Rewrite page to document all string-copying functions Alejandro Colomar
2022-12-12 17:33   ` Alejandro Colomar
2022-12-12 18:38     ` groff man(7) extensions (was: [PATCH 1/3] strcpy.3: Rewrite page to document all string-copying functions) G. Branden Robinson
2022-12-13 15:45       ` a Q quotation macro for man(7) (was: groff man(7) extensions) G. Branden Robinson
2022-12-12 23:00   ` [PATCH v2 0/3] Rewrite strcpy(3) Alejandro Colomar
2022-12-13 20:56     ` Jakub Wilk
2022-12-13 20:57       ` Alejandro Colomar
2022-12-13 22:05       ` Alejandro Colomar
2022-12-13 22:46         ` Alejandro Colomar
2022-12-14  0:03     ` [PATCH v3 0/1] Rewritten page for string-copying functions Alejandro Colomar
2022-12-14  0:14       ` Alejandro Colomar
2022-12-14  0:16         ` Alejandro Colomar
2022-12-14 16:17       ` [PATCH v4 " Alejandro Colomar
2022-12-15  0:26         ` [PATCH v5 0/5] Rewrite pages about " Alejandro Colomar
2022-12-19 21:02           ` [PATCH v6 0/5] Rewrite documentation for " Alejandro Colomar
2022-12-19 21:02           ` [PATCH v6 1/5] string_copy.7: Add page to document all " Alejandro Colomar
2022-12-20 15:00             ` Stefan Puiu
2022-12-20 15:03               ` Alejandro Colomar
2023-01-20  3:43             ` Eric Biggers
2023-01-20 12:55               ` Alejandro Colomar
2022-12-19 21:02           ` [PATCH v6 2/5] stpecpy.3, stpecpyx.3, ustpcpy.3, ustr2stp.3, zustr2stp.3, zustr2ustp.3: Add new links to string_copy(7) Alejandro Colomar
2022-12-19 21:02           ` [PATCH v6 3/5] stpcpy.3, strcpy.3, strcat.3: Document in a single page Alejandro Colomar
2022-12-19 21:02           ` [PATCH v6 4/5] stpncpy.3, strncpy.3: " Alejandro Colomar
2022-12-19 21:02           ` [PATCH v6 5/5] strncat.3: Rewrite to be consistent with string_copy.7 Alejandro Colomar
2022-12-15  0:26         ` [PATCH v5 1/5] string_copy.7: Add page to document all string-copying functions Alejandro Colomar
2022-12-15  0:30           ` Alejandro Colomar
2022-12-15  0:26         ` [PATCH v5 2/5] stpecpy.3, stpecpyx.3, ustpcpy.3, ustr2stp.3, zustr2stp.3, zustr2ustp.3: Add new links to string_copy(7) Alejandro Colomar
2022-12-15  0:27           ` Alejandro Colomar
2022-12-16 18:47             ` Stefan Puiu
2022-12-16 19:03               ` Alejandro Colomar
2022-12-16 19:09                 ` Alejandro Colomar
2022-12-15  0:26         ` [PATCH v5 3/5] stpcpy.3, strcpy.3, strcat.3: Document in a single page Alejandro Colomar
2022-12-16 14:46           ` Alejandro Colomar [this message]
2022-12-16 14:47             ` Alejandro Colomar
2022-12-15  0:26         ` [PATCH v5 4/5] stpncpy.3, strncpy.3: " Alejandro Colomar
2022-12-15  0:28           ` Alejandro Colomar
2022-12-15  0:26         ` [PATCH v5 5/5] strncat.3: Rewrite to be consistent with string_copy.7 Alejandro Colomar
2022-12-15  0:29           ` Alejandro Colomar
2022-12-14 16:17       ` [PATCH v4 1/1] strcpy.3: Rewrite page to document all string-copying functions Alejandro Colomar
2022-12-14  0:03     ` [PATCH v3 " Alejandro Colomar
2022-12-14 16:22       ` Douglas McIlroy
2022-12-14 16:36         ` Alejandro Colomar
2022-12-14 17:11           ` Alejandro Colomar
2022-12-14 17:19             ` Alejandro Colomar
2022-12-12 23:00   ` [PATCH v2 1/3] " Alejandro Colomar
2022-12-12 23:00   ` [PATCH v2 2/3] stpcpy.3, stpncpy.3, strcat.3, strncat.3, strncpy.3: Transform the old pages into links to strcpy(3) Alejandro Colomar
2022-12-12 23:00   ` [PATCH v2 3/3] stpecpy.3, stpecpyx.3, strlcat.3, strlcpy.3, strscpy.3: Add new " Alejandro Colomar
2022-12-12 14:24 ` [PATCH 2/3] stpcpy.3, stpncpy.3, strcat.3, strncat.3, strncpy.3: Transform the old pages into " Alejandro Colomar
2022-12-12 14:24 ` [PATCH 3/3] stpecpy.3, stpecpyx.3, strlcat.3, strlcpy.3, strscpy.3: Add new " Alejandro Colomar

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=8c5dceff-0156-ae5a-1d51-009dfb5eccd3@gmail.com \
    --to=alx.manpages@gmail.com \
    --cc=alx@kernel.org \
    --cc=douglas.mcilroy@dartmouth.edu \
    --cc=g.branden.robinson@gmail.com \
    --cc=ipedrosa@redhat.com \
    --cc=jwilk@jwilk.net \
    --cc=linux-man@vger.kernel.org \
    --cc=msebor@redhat.com \
    --cc=pinskia@gmail.com \
    --cc=serge@hallyn.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox