Skip to content

Commit 2e4cc51

Browse files
committed
MEDIUM: log: use lf_rawtext for lf_ip() and lf_port() hex strings
Same as the previous commit, but for ip and port oriented values when +X option is provided. No functional change should be expected. Because of this patch, we add a little overhead because we first generate the text into a temporary variable and then use lf_rawtext() to print it. Thus we have a double-copy, and this could have some performance implications that were not yet evaluated. Due to the small number of bytes that can end up being copied twice, we could be lucky and have no visible performance impact, but if we happen to see a significant impact, it could be useful to add a passthrough mechanism (to keep historical behavior) when no encoding is involved.
1 parent 3a3bdf1 commit 2e4cc51

File tree

1 file changed

+28
-13
lines changed

1 file changed

+28
-13
lines changed

src/log.c

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1958,26 +1958,41 @@ char *lf_ip(char *dst, const struct sockaddr *sockaddr, size_t size, const struc
19581958
unsigned char *addr = NULL;
19591959
switch (sockaddr->sa_family) {
19601960
case AF_INET:
1961+
{
1962+
char ip4_hex[9]; // 8 bytes + \0
1963+
19611964
addr = (unsigned char *)&((struct sockaddr_in *)sockaddr)->sin_addr.s_addr;
1962-
iret = snprintf(dst, size, "%02X%02X%02X%02X", addr[0], addr[1], addr[2], addr[3]);
1965+
iret = snprintf(ip4_hex, sizeof(ip4_hex), "%02X%02X%02X%02X",
1966+
addr[0], addr[1], addr[2], addr[3]);
1967+
if (iret < 0 || iret >= size)
1968+
return NULL;
1969+
ret = lf_rawtext(dst, ip4_hex, size, node);
1970+
19631971
break;
1972+
}
19641973
case AF_INET6:
1974+
{
1975+
char ip6_hex[33]; // 32 bytes + \0
1976+
19651977
addr = (unsigned char *)&((struct sockaddr_in6 *)sockaddr)->sin6_addr.s6_addr;
1966-
iret = snprintf(dst, size, "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
1967-
addr[0], addr[1], addr[2], addr[3], addr[4], addr[5], addr[6], addr[7],
1968-
addr[8], addr[9], addr[10], addr[11], addr[12], addr[13], addr[14], addr[15]);
1978+
iret = snprintf(ip6_hex, sizeof(ip6_hex),
1979+
"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
1980+
addr[0], addr[1], addr[2], addr[3],
1981+
addr[4], addr[5], addr[6], addr[7],
1982+
addr[8], addr[9], addr[10], addr[11],
1983+
addr[12], addr[13], addr[14], addr[15]);
1984+
if (iret < 0 || iret >= size)
1985+
return NULL;
1986+
ret = lf_rawtext(dst, ip6_hex, size, node);
1987+
19691988
break;
1989+
}
19701990
default:
19711991
return NULL;
19721992
}
1973-
if (iret < 0 || iret >= size)
1974-
return NULL;
1975-
ret += iret;
19761993
} else {
19771994
addr_to_str((struct sockaddr_storage *)sockaddr, pn, sizeof(pn));
19781995
ret = lf_text(dst, pn, size, node);
1979-
if (ret == NULL)
1980-
return NULL;
19811996
}
19821997
return ret;
19831998
}
@@ -2024,16 +2039,16 @@ char *lf_port(char *dst, const struct sockaddr *sockaddr, size_t size, const str
20242039
int iret;
20252040

20262041
if (node->options & LOG_OPT_HEXA) {
2042+
char port_hex[5]; // 4 bytes + \0
20272043
const unsigned char *port = (const unsigned char *)&((struct sockaddr_in *)sockaddr)->sin_port;
2028-
iret = snprintf(dst, size, "%02X%02X", port[0], port[1]);
2044+
2045+
iret = snprintf(port_hex, sizeof(port_hex), "%02X%02X", port[0], port[1]);
20292046
if (iret < 0 || iret >= size)
20302047
return NULL;
2031-
ret += iret;
2048+
ret = lf_rawtext(dst, port_hex, size, node);
20322049
} else {
20332050
ret = lf_int(dst, size, get_host_port((struct sockaddr_storage *)sockaddr),
20342051
node, LF_INT_LTOA);
2035-
if (ret == NULL)
2036-
return NULL;
20372052
}
20382053
return ret;
20392054
}

0 commit comments

Comments
 (0)