AK: Fix IPv6 serialization on multiple '0' parts ending in a '0' part

This could happen if a sequence of '0' parts was followed by a longer
sequence of '0' parts at the end of the host. The first sequence was
being used for the compress, and not the second.

For example, [1:1:0:0:1:0:0:0] was being serialized as: [1:1::1:0:0:0]
instead of [1:1:0:0:1::].

Fix this by checking at the end of the loop if we are in the middle of a
sequence of '0' parts that is longer than the current longest.
This commit is contained in:
Shannon Booth 2023-08-06 19:40:09 +12:00 committed by Andreas Kling
parent 7f99f3bf29
commit faf9d08371
Notes: sideshowbarker 2024-07-17 23:00:03 +09:00
3 changed files with 15 additions and 0 deletions

View File

@ -250,6 +250,11 @@ static void serialize_ipv6_address(URL::IPv6Address const& address, StringBuilde
}
}
if (current_sequence_length > longest_sequence_length) {
longest_sequence_length = current_sequence_length;
compress = current_sequence_start;
}
// 3. If there is no sequence of addresss IPv6 pieces that are 0 that is longer than 1, then set compress to null.
if (longest_sequence_length <= 1)
compress = {};

View File

@ -25,3 +25,12 @@ hostname => '[1:0:1:0:1:0:1:0]'
port => ''
pathname => '/'
search => ''
http://[1:1:0:0:1:0:0:0]/
protocol => 'http:'
username => ''
password => ''
host => '[1:1:0:0:1::]'
hostname => '[1:1:0:0:1::]'
port => ''
pathname => '/'
search => ''

View File

@ -18,6 +18,7 @@
'ftp://serenityos.org:21',
'http://[0:1:0:1:0:1:0:1]',
'http://[1:0:1:0:1:0:1:0]',
'http://[1:1:0:0:1:0:0:0]/',
]) {
printURL(url);
}