Mercurial > hg > nginx-tests
changeset 1928:2df7d700518f
Tests: fixed parsing STREAM frames split on inner frame headers.
author | Sergey Kandaurov <pluknet@nginx.com> |
---|---|
date | Wed, 16 Aug 2023 16:36:18 +0400 |
parents | 55e0dee863e2 |
children | 3408c20d2f24 |
files | lib/Test/Nginx/HTTP3.pm |
diffstat | 1 files changed, 23 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/lib/Test/Nginx/HTTP3.pm Wed Aug 16 16:32:12 2023 +0400 +++ b/lib/Test/Nginx/HTTP3.pm Wed Aug 16 16:36:18 2023 +0400 @@ -558,17 +558,28 @@ 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 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))