On 12/22/22 19:28, Alejandro Colomar wrote:>> 1) Use strncpy() instead of strlcpy() > > Would someone please add a function to glibc that truncates a string, while > still producing a string (as opposed to a null-padded fixed-width character > sequence)? > > Here goes an extract of the yet-unreleased strncpy(3) manual page from the Linux > man-pages master branch: > > > DESCRIPTION >        These functions copy the string pointed to by src  into  a  null‐padded >        character sequence at the fixed‐width buffer pointed to by dst.  If the >        destination buffer, limited by its size, isn’t large enough to hold the >        copy,  the  resulting character sequence is truncated.  For the differ‐ >        ence between the two functions, see RETURN VALUE. > >        An implementation of these functions might be: > >            char * >            stpncpy(char *restrict dst, const char *restrict src, size_t sz) >            { >                bzero(dst, sz); >                return mempcpy(dst, src, strnlen(src, sz)); >            } > >            char * >            strncpy(char *restrict dst, const char *restrict src, size_t sz) >            { >                stpncpy(dst, src, sz); >                return dst; >            } > >        [...] > > CAVEATS >        The name of these functions is confusing.  These  functions  produce  a >        null‐padded character sequence, not a string (see string_copying(7)). > >        It’s  impossible  to  distinguish truncation by the result of the call, >        from a character sequence that just fits the destination buffer;  trun‐ >        cation  should  be detected by comparing the length of the input string >        with the size of the destination buffer. > > I'll be releasing the a new man-pages version very soon (a week at most), so > that this page and also the new string_copying(7) overview are widely available. I released a moment ago. So, I'd suggest either adding strlcpy(3)&strlcat(3) to glibc, or stpecpy(3) (defined here: ). Or even both, since each of them serves a purpose: strlcpy(3)&strlcat(3) are for simpler code where performance and truncation are not a concern, and stpecpy(3) does the same but faster with just a few more bytes of code (and detecting truncation is even simpler). I'll send an actual patch for adding stpecpy(3), to discuss with some actual code. Cheers, Alex --