# HG changeset patch # User Sergey Kandaurov # Date 1692189378 -14400 # Node ID 2df7d700518fa684491361c1acc331ac3b6c0a80 # Parent 55e0dee863e2f9f313e6005c50db91f950b4bb32 Tests: fixed parsing STREAM frames split on inner frame headers. diff --git a/lib/Test/Nginx/HTTP3.pm b/lib/Test/Nginx/HTTP3.pm --- a/lib/Test/Nginx/HTTP3.pm +++ b/lib/Test/Nginx/HTTP3.pm @@ -558,17 +558,28 @@ again: my $offset = 0; my ($len, $type); - if (!length($self->{frames_incomplete}[$stream]{buf})) { - ($len, $type) = parse_int(substr($buf, $offset)); - $offset += $len; - ($len, $length) = parse_int(substr($buf, $offset)); - $offset += $len; + ($len, $type) = parse_int(substr($buf, $offset)); + + if (!defined $len) { + $self->{frames_incomplete}[$stream]{buf} = $buf; + next; + } + + $offset += $len; + + ($len, $length) = parse_int(substr($buf, $offset)); - $self->{frames_incomplete}[$stream]{type} = $type; - $self->{frames_incomplete}[$stream]{length} = $length; - $self->{frames_incomplete}[$stream]{offset} = $offset; + if (!defined $len) { + $self->{frames_incomplete}[$stream]{buf} = $buf; + next; } + $offset += $len; + + $self->{frames_incomplete}[$stream]{type} = $type; + $self->{frames_incomplete}[$stream]{length} = $length; + $self->{frames_incomplete}[$stream]{offset} = $offset; + if (length($buf) < $self->{frames_incomplete}[$stream]{length} + $self->{frames_incomplete}[$stream]{offset}) { @@ -1987,8 +1998,12 @@ sub build_stream { sub parse_int { my ($buf) = @_; + return undef if length($buf) < 1; + my $val = unpack("C", substr($buf, 0, 1)); my $len = my $plen = 1 << ($val >> 6); + return undef if length($buf) < $len; + $val = $val & 0x3f; while (--$len) { $val = ($val << 8) + unpack("C", substr($buf, $plen - $len, 1))