lib/ll_addr: improve ll_addr_n2a() a bit
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>
This commit is contained in:
parent
7faf1588a7
commit
f63ed3e629
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue