Skip to content

Commit e07b181

Browse files
committed
okhttp: fix HPACK reader bug
1 parent 8fe313f commit e07b181

File tree

1 file changed

+15
-16
lines changed
  • okhttp/third_party/okhttp/java/io/grpc/okhttp/internal/framed

1 file changed

+15
-16
lines changed

okhttp/third_party/okhttp/java/io/grpc/okhttp/internal/framed/Hpack.java

+15-16
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,8 @@ static final class Reader {
126126
// Visible for testing.
127127
io.grpc.okhttp.internal.framed.Header[] dynamicTable = new io.grpc.okhttp.internal.framed.Header[8];
128128
// Array is populated back to front, so new entries always have lowest index.
129-
int nextHeaderIndex = dynamicTable.length - 1;
130-
int headerCount = 0;
129+
int nextDynamicTableIndex = dynamicTable.length - 1;
130+
int dynamicTableHeaderCount = 0;
131131
int dynamicTableByteCount = 0;
132132

133133
Reader(int headerTableSizeSetting, Source source) {
@@ -164,10 +164,9 @@ private void adjustDynamicTableByteCount() {
164164
}
165165

166166
private void clearDynamicTable() {
167-
headerList.clear();
168167
Arrays.fill(dynamicTable, null);
169-
nextHeaderIndex = dynamicTable.length - 1;
170-
headerCount = 0;
168+
nextDynamicTableIndex = dynamicTable.length - 1;
169+
dynamicTableHeaderCount = 0;
171170
dynamicTableByteCount = 0;
172171
}
173172

@@ -176,15 +175,15 @@ private int evictToRecoverBytes(int bytesToRecover) {
176175
int entriesToEvict = 0;
177176
if (bytesToRecover > 0) {
178177
// determine how many headers need to be evicted.
179-
for (int j = dynamicTable.length - 1; j >= nextHeaderIndex && bytesToRecover > 0; j--) {
178+
for (int j = dynamicTable.length - 1; j >= nextDynamicTableIndex && bytesToRecover > 0; j--) {
180179
bytesToRecover -= dynamicTable[j].hpackSize;
181180
dynamicTableByteCount -= dynamicTable[j].hpackSize;
182-
headerCount--;
181+
dynamicTableHeaderCount--;
183182
entriesToEvict++;
184183
}
185-
System.arraycopy(dynamicTable, nextHeaderIndex + 1, dynamicTable,
186-
nextHeaderIndex + 1 + entriesToEvict, headerCount);
187-
nextHeaderIndex += entriesToEvict;
184+
System.arraycopy(dynamicTable, nextDynamicTableIndex + 1, dynamicTable,
185+
nextDynamicTableIndex + 1 + entriesToEvict, dynamicTableHeaderCount);
186+
nextDynamicTableIndex += entriesToEvict;
188187
}
189188
return entriesToEvict;
190189
}
@@ -241,9 +240,9 @@ private void readIndexedHeader(int index) throws IOException {
241240
}
242241
}
243242

244-
// referencedHeaders is relative to nextHeaderIndex + 1.
243+
// referencedHeaders is relative to nextDynamicTableIndex + 1.
245244
private int dynamicTableIndex(int index) {
246-
return nextHeaderIndex + 1 + index;
245+
return nextDynamicTableIndex + 1 + index;
247246
}
248247

249248
private void readLiteralHeaderWithoutIndexingIndexedName(int index) throws IOException {
@@ -303,15 +302,15 @@ private void insertIntoDynamicTable(int index, io.grpc.okhttp.internal.framed.He
303302
int entriesEvicted = evictToRecoverBytes(bytesToRecover);
304303

305304
if (index == -1) { // Adding a value to the dynamic table.
306-
if (headerCount + 1 > dynamicTable.length) { // Need to grow the dynamic table.
305+
if (dynamicTableHeaderCount + 1 > dynamicTable.length) { // Need to grow the dynamic table.
307306
io.grpc.okhttp.internal.framed.Header[] doubled = new io.grpc.okhttp.internal.framed.Header[dynamicTable.length * 2];
308307
System.arraycopy(dynamicTable, 0, doubled, dynamicTable.length, dynamicTable.length);
309-
nextHeaderIndex = dynamicTable.length - 1;
308+
nextDynamicTableIndex = dynamicTable.length - 1;
310309
dynamicTable = doubled;
311310
}
312-
index = nextHeaderIndex--;
311+
index = nextDynamicTableIndex--;
313312
dynamicTable[index] = entry;
314-
headerCount++;
313+
dynamicTableHeaderCount++;
315314
} else { // Replace value at same position.
316315
index += dynamicTableIndex(index) + entriesEvicted;
317316
dynamicTable[index] = entry;

0 commit comments

Comments
 (0)