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
+++ 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))