![]() |
|
Message-Id: <53EF6890-9467-4886-8D98-C7050088AF0D@stasiak.at> Date: Fri, 14 Jun 2024 00:59:41 +0200 From: Jakub Stasiak <jakub@...siak.at> To: musl@...ts.openwall.com Subject: [PATCH] inet_ntop: Fix the IPv6 leading zero sequence compression Per RFC 5952[1]: 4.2.3. Choice in Placement of "::" (...) When the length of the consecutive 16-bit 0 fields are equal (i.e., 2001:db8:0:0:1:0:0:1), the first sequence of zero bits MUST be shortened. For example, 2001:db8::1:0:0:1 is correct representation. but the implementation put the leading sequence of zeros at a disadvantage. That's because for example when compressing 0:0:0:10:0:0:0:10 the strspn(buf+i, ":0") call returns 6 for the first sequence and 7 for the second one – the second sequence has the benefit of a leading colon. Because of that for this IPv6 input "\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x10" inet_ntop produced 0:0:0:10::10 instead of ::10:0:0:0:10 Changing the condition to require beating the leading sequence by not one but two characters resolves the issue. The new behavior is consistent with other implementations I tested (glibc, Apple libc). [1] https://www.rfc-editor.org/rfc/rfc5952#section-4.2.3 --- src/network/inet_ntop.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/network/inet_ntop.c b/src/network/inet_ntop.c index 4bfef2c557ab..37257cf9d787 100644 --- a/src/network/inet_ntop.c +++ b/src/network/inet_ntop.c @@ -34,7 +34,10 @@ const char *inet_ntop(int af, const void *restrict a0, char *restrict s, socklen for (i=best=0, max=2; buf[i]; i++) { if (i && buf[i] != ':') continue; j = strspn(buf+i, ":0"); - if (j>max) best=i, max=j; + // The leading sequence of zeros (best==0) is disadvantaged compared to + // sequences elsewhere as it doesn't have a leading colon. One extra + // character is required for another sequence to beat it fairly. + if (j>max+(best==0)) best=i, max=j; } if (max>3) { buf[best] = buf[best+1] = ':'; -- 2.45.1
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.