[dm-devel] [PATCH 12/35] libmultipath: strlcpy()/strlcat(): use restrict qualifier

Martin Wilck mwilck at suse.com
Tue Aug 4 15:36:31 UTC 2020


On Thu, 2020-07-16 at 17:18 -0500, Benjamin Marzinski wrote:
> On Thu, Jul 09, 2020 at 12:15:57PM +0200, mwilck at suse.com wrote:
> > From: Martin Wilck <mwilck at suse.com>
> > 
> > Also remove the redundant local variables. It's not necessary to
> > make "restrict" work, but it makes the intention more clear.
> > 
> > Signed-off-by: Martin Wilck <mwilck at suse.com>
> > ---
> >  libmultipath/util.c | 28 ++++++++++++----------------
> >  libmultipath/util.h |  4 ++--
> >  2 files changed, 14 insertions(+), 18 deletions(-)
> > 
> > diff --git a/libmultipath/util.c b/libmultipath/util.c
> > index 957fb97..f965094 100644
> > --- a/libmultipath/util.c
> > +++ b/libmultipath/util.c
> > 
> > -size_t strlcat(char *dst, const char *src, size_t size)
> > +size_t strlcat(char * restrict dst, const char * restrict src,
> > size_t size)
> >  {
> >  	size_t bytes = 0;
> > -	char *q = dst;
> > -	const char *p = src;
> >  	char ch;
> >  
> > -	while (bytes < size && *q) {
> > -		q++;
> > +	while (bytes < size && *dst) {
> > +		dst++;
> >  		bytes++;
> >  	}
> >  	if (bytes == size)
> 
> this should return the strlen(dst) + strlen(src). It wouldn't in the
> admittedly weird case where size isn't large enough to fit dst.

Are you sure?

https://linux.die.net/man/3/strlcat

"Note, however, that if strlcat() traverses size characters without
finding a NUL, the length of the string is considered to be size and
the destination string will not be NUL-terminated (since there was no
space for the NUL)."

The way I understand this is that the current code is actually correct
in returning bytes + strlen(src).

This is also consistent with what I see elsewhere

https://github.com/ffainelli/uClibc/blob/master/libc/string/strlcat.c
https://github.com/freebsd/freebsd/blob/master/crypto/heimdal/lib/roken/strlcat.c

Regards
Martin





More information about the dm-devel mailing list