]> git.proxmox.com Git - mirror_iproute2.git/commitdiff
utils: strlcpy() and strlcat() don't clobber dst
authorPhil Sutter <phil@nwl.cc>
Wed, 6 Sep 2017 16:51:42 +0000 (18:51 +0200)
committerStephen Hemminger <stephen@networkplumber.org>
Thu, 7 Sep 2017 22:06:47 +0000 (15:06 -0700)
As David Laight correctly pointed out, the first version of strlcpy()
modified dst buffer behind the string copied into it. Fix this by
writing NUL to the byte immediately following src string instead of to
the last byte in dst. Doing so also allows to reduce overhead by using
memcpy().

Improve strlcat() by avoiding the call to strlcpy() if dst string is
already full, not just as sanity check.

Signed-off-by: Phil Sutter <phil@nwl.cc>
lib/utils.c

index 330ab073c2068266706de901969ff9bb20fc97ce..bbd3cbc46a0e576effb0e825695c77e78a88d5ef 100644 (file)
@@ -1233,18 +1233,22 @@ int get_real_family(int rtm_type, int rtm_family)
 
 size_t strlcpy(char *dst, const char *src, size_t size)
 {
+       size_t srclen = strlen(src);
+
        if (size) {
-               strncpy(dst, src, size - 1);
-               dst[size - 1] = '\0';
+               size_t minlen = min(srclen, size - 1);
+
+               memcpy(dst, src, minlen);
+               dst[minlen] = '\0';
        }
-       return strlen(src);
+       return srclen;
 }
 
 size_t strlcat(char *dst, const char *src, size_t size)
 {
        size_t dlen = strlen(dst);
 
-       if (dlen > size)
+       if (dlen >= size)
                return dlen + strlen(src);
 
        return dlen + strlcpy(dst + dlen, src, size - dlen);