http2: accept zero-length block fragments in HEADERS frames

Fix a fencepost error which rejects HEADERS frames with neither
payload nor padding, but accepts ones with padding and no payload.

Fixes golang/go#47851.

Change-Id: Ic6ed65571366e86980a5ec69e7f9e6ab958f3b07
Reviewed-on: https://go-review.googlesource.com/c/net/+/344029
Trust: Damien Neil <dneil@google.com>
Run-TryBot: Damien Neil <dneil@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
diff --git a/http2/frame.go b/http2/frame.go
index 514c126..b95d6f2 100644
--- a/http2/frame.go
+++ b/http2/frame.go
@@ -1018,7 +1018,7 @@
 			return nil, err
 		}
 	}
-	if len(p)-int(padLength) <= 0 {
+	if len(p)-int(padLength) < 0 {
 		return nil, streamError(fh.StreamID, ErrCodeProtocol)
 	}
 	hf.headerFragBuf = p[:len(p)-int(padLength)]
diff --git a/http2/frame_test.go b/http2/frame_test.go
index cc0c737..48bf969 100644
--- a/http2/frame_test.go
+++ b/http2/frame_test.go
@@ -312,6 +312,23 @@
 				headerFragBuf: []byte("abc"),
 			},
 		},
+		{
+			"zero length",
+			HeadersFrameParam{
+				StreamID: 42,
+				Priority: PriorityParam{},
+			},
+			"\x00\x00\x00\x01\x00\x00\x00\x00*",
+			&HeadersFrame{
+				FrameHeader: FrameHeader{
+					valid:    true,
+					StreamID: 42,
+					Type:     FrameHeaders,
+					Length:   0,
+				},
+				Priority: PriorityParam{},
+			},
+		},
 	}
 	for _, tt := range tests {
 		fr, buf := testFramer()