]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
lib/utils kr_inaddr_str(): avoid another copy
authorVladimír Čunát <vladimir.cunat@nic.cz>
Thu, 15 Nov 2018 17:13:35 +0000 (18:13 +0100)
committerVladimír Čunát <vladimir.cunat@nic.cz>
Wed, 21 Nov 2018 14:33:41 +0000 (15:33 +0100)
... and avoid a scan-build error.

lib/utils.c
lib/utils.h

index 678cec22b253c69d1c119f7349210f1c5dd110a5..9a7a69e6fbc0ead82644a6b7fdc0976459cb991a 100644 (file)
@@ -424,27 +424,24 @@ void kr_inaddr_set_port(struct sockaddr *addr, uint16_t port)
 
 int kr_inaddr_str(const struct sockaddr *addr, char *buf, size_t *buflen)
 {
-       int ret = kr_ok();
        if (!addr || !buf || !buflen) {
                return kr_error(EINVAL);
        }
 
-       char str[INET6_ADDRSTRLEN + 6];
-       if (!inet_ntop(addr->sa_family, kr_inaddr(addr), str, sizeof(str))) {
+       if (!inet_ntop(addr->sa_family, kr_inaddr(addr), buf, *buflen)) {
                return kr_error(errno);
        }
-       int len = strlen(str);
-       str[len] = '#';
-       u16tostr((uint8_t *)&str[len + 1], kr_inaddr_port(addr));
-       len += 6;
-       str[len] = 0;
-       if (len >= *buflen) {
-               ret = kr_error(ENOSPC);
-       } else {
-               memcpy(buf, str, len + 1);
+       const int len = strlen(buf);
+       const int len_need = len + 1 + 5 + 1;
+       if (len_need > *buflen) {
+               *buflen = len_need;
+               return kr_error(ENOSPC);
        }
-       *buflen = len;
-       return ret;
+       *buflen = len_need;
+       buf[len] = '#';
+       u16tostr((uint8_t *)&buf[len + 1], kr_inaddr_port(addr));
+       buf[len_need - 1] = 0;
+       return kr_ok();
 }
 
 int kr_straddr_family(const char *addr)
index db6f5317a824d86bf4fc434b02e6ae804d1632c9..b61b4f76c39e59f1ea73ef1ab312841a397310ca 100644 (file)
@@ -393,7 +393,7 @@ static inline char *kr_straddr(const struct sockaddr *addr)
 {
        assert(addr != NULL);
        /* We are the sinle-threaded application */
-       static char str[INET6_ADDRSTRLEN + 6];
+       static char str[INET6_ADDRSTRLEN + 1 + 5 + 1];
        size_t len = sizeof(str);
        int ret = kr_inaddr_str(addr, str, &len);
        return ret != kr_ok() || len == 0 ? NULL : str;