MINOR: qpack: properly handle invalid dynamic table references
Return QPACK_DECOMPRESSION_FAILED error code when dealing with dynamic
table references. This is justified as for now haproxy does not
implement dynamic table support and advertizes a zero-sized table.
The H3 calling function will thus reuse this code in a CONNECTION_CLOSE
frame, in conformance with the QPACK RFC.
This proper error management allows to remove obsolete ABORT_NOW guards.
diff --git a/src/qpack-dec.c b/src/qpack-dec.c
index 8fa19b1..aa30121 100644
--- a/src/qpack-dec.c
+++ b/src/qpack-dec.c
@@ -220,12 +220,7 @@
if (efl_type == QPACK_LFL_WPBNM) {
/* Literal field line with post-base name reference
- *
- * TODO not implemented
- *
- * For the moment, this should never happen as
- * currently we do not support dynamic table insertion
- * and specify an empty table size.
+ * TODO adjust this when dynamic table support is implemented.
*/
#if 0
uint64_t index __maybe_unused, length;
@@ -260,16 +255,20 @@
raw += length;
len -= length;
#endif
- ABORT_NOW(); /* dynamic table not supported */
+
+ /* RFC9204 2.2.3 Invalid References
+ *
+ * If the decoder encounters a reference in a field line representation
+ * to a dynamic table entry that has already been evicted or that has an
+ * absolute index greater than or equal to the declared Required Insert
+ * Count (Section 4.5.1), it MUST treat this as a connection error of
+ * type QPACK_DECOMPRESSION_FAILED.
+ */
+ return -QPACK_DECOMPRESSION_FAILED;
}
else if (efl_type == QPACK_IFL_WPBI) {
/* Indexed field line with post-base index
- *
- * TODO not implemented
- *
- * For the moment, this should never happen as
- * currently we do not support dynamic table insertion
- * and specify an empty table size.
+ * TODO adjust this when dynamic table support is implemented.
*/
#if 0
uint64_t index __maybe_unused;
@@ -284,7 +283,16 @@
qpack_debug_printf(stderr, " index=%llu", (unsigned long long)index);
#endif
- ABORT_NOW(); /* dynamic table not supported */
+
+ /* RFC9204 2.2.3 Invalid References
+ *
+ * If the decoder encounters a reference in a field line representation
+ * to a dynamic table entry that has already been evicted or that has an
+ * absolute index greater than or equal to the declared Required Insert
+ * Count (Section 4.5.1), it MUST treat this as a connection error of
+ * type QPACK_DECOMPRESSION_FAILED.
+ */
+ return -QPACK_DECOMPRESSION_FAILED;
}
else if (efl_type & QPACK_IFL_BIT) {
/* Indexed field line */
@@ -305,13 +313,17 @@
value = qpack_sht[index].v;
}
else {
- /* TODO not implemented
+ /* RFC9204 2.2.3 Invalid References
*
- * For the moment, this should never happen as
- * currently we do not support dynamic table insertion
- * and specify an empty table size.
+ * If the decoder encounters a reference in a field line representation
+ * to a dynamic table entry that has already been evicted or that has an
+ * absolute index greater than or equal to the declared Required Insert
+ * Count (Section 4.5.1), it MUST treat this as a connection error of
+ * type QPACK_DECOMPRESSION_FAILED.
+ *
+ * TODO adjust this when dynamic table support is implemented.
*/
- ABORT_NOW();
+ return -QPACK_DECOMPRESSION_FAILED;
}
qpack_debug_printf(stderr, " t=%d index=%llu", !!static_tbl, (unsigned long long)index);
@@ -335,13 +347,17 @@
name = qpack_sht[index].n;
}
else {
- /* TODO not implemented
+ /* RFC9204 2.2.3 Invalid References
*
- * For the moment, this should never happen as
- * currently we do not support dynamic table insertion
- * and specify an empty table size.
+ * If the decoder encounters a reference in a field line representation
+ * to a dynamic table entry that has already been evicted or that has an
+ * absolute index greater than or equal to the declared Required Insert
+ * Count (Section 4.5.1), it MUST treat this as a connection error of
+ * type QPACK_DECOMPRESSION_FAILED.
+ *
+ * TODO adjust this when dynamic table support is implemented.
*/
- ABORT_NOW();
+ return -QPACK_DECOMPRESSION_FAILED;
}
qpack_debug_printf(stderr, " n=%d t=%d index=%llu", !!n, !!static_tbl, (unsigned long long)index);