]> git.ipfire.org Git - thirdparty/iproute2.git/commitdiff
lib/ll_addr: improve ll_addr_n2a() a bit
authorPhil Sutter <phil@nwl.cc>
Tue, 22 Mar 2016 18:35:19 +0000 (19:35 +0100)
committerStephen Hemminger <stephen@networkplumber.org>
Sun, 27 Mar 2016 17:37:35 +0000 (10:37 -0700)
Apart from making the code a bit more compact and efficient, this also
prevents a potential buffer overflow if the passed buffer is really too
small: Although correctly decrementing the size parameter passed to
snprintf, it could become negative which would then wrap since snprintf
uses (unsigned) size_t for the parameter.

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

index 2ce9abfbb8c69d19b13cbedbd6feddee1c533550..465ed6fa4d9a2192d68d74017b342610196236c9 100644 (file)
@@ -41,18 +41,9 @@ const char *ll_addr_n2a(const unsigned char *addr, int alen, int type, char *buf
        if (alen == 16 && type == ARPHRD_TUNNEL6) {
                return inet_ntop(AF_INET6, addr, buf, blen);
        }
-       l = 0;
-       for (i=0; i<alen; i++) {
-               if (i==0) {
-                       snprintf(buf+l, blen, "%02x", addr[i]);
-                       blen -= 2;
-                       l += 2;
-               } else {
-                       snprintf(buf+l, blen, ":%02x", addr[i]);
-                       blen -= 3;
-                       l += 3;
-               }
-       }
+       snprintf(buf, blen, "%02x", addr[0]);
+       for (i = 1, l = 2; i < alen && l < blen; i++, l += 3)
+               snprintf(buf + l, blen - l, ":%02x", addr[i]);
        return buf;
 }