ところで:これは荒らしのように聞こえるかもしれませんが、正直に言って、このcborパーサーを完全に削除することを検討することをお勧めします:標準が適切に実装されておらず、コード品質がひどく、最も重要なことに、バグがたくさんあり、これに積極的に取り組んでいるメンテナ。
@nmeum 、コード品質の問題とRFCコンプライアンスの問題についてもう少し詳しく説明していただけますか?
RFC準拠について:パーサーは、 cborテストベクトルの大部分を適切に解析しません。 コードの品質について:コードをファジングして修正するだけで複数の問題が見つかりましたが、あまり洗練されていないようでした。
これは、cborパーサーのハング(または少なくともその一部)を修正するパッチです。
diff --git a/cbor-afl/cbor.c b/cbor-afl/cbor.c
index fa1aa27..c97457e 100644
--- a/cbor-afl/cbor.c
+++ b/cbor-afl/cbor.c
@@ -989,12 +989,17 @@ static size_t cbor_stream_decode_at(cbor_stream_t *stream, size_t offset, int in
while (is_indefinite ? !cbor_at_break(stream, offset) : i < map_length) {
size_t key_read_bytes, value_read_bytes;
+
offset += key_read_bytes = cbor_stream_decode_at(stream, offset, indent + 1); /* key */
- offset += value_read_bytes = cbor_stream_decode_at(stream, offset, indent + 2); /* value */
+ if (key_read_bytes == 0) {
+ DEBUG("Failed to read key at position %d\n", i);
+ return 0;
+ }
- if (key_read_bytes == 0 || value_read_bytes == 0) {
- DEBUG("Failed to read key-value pair at position %d\n", i);
- break;
+ offset += value_read_bytes = cbor_stream_decode_at(stream, offset, indent + 2); /* value */
+ if (value_read_bytes == 0) {
+ DEBUG("Failed to read value at position %d\n", i);
+ return 0;
}
read_bytes += key_read_bytes + value_read_bytes;
問題は、パーサーがマップ内のキー値を解析した後にエラーをチェックしなかったことであるようです。 したがって、キーが見つからなかった場合でも、存在しないキーの値を見つけるためにcbor_stream_decode_at
が呼び出されます。
パッチが最適かどうかはわかりませんが、少なくとももうハングしません…
#7800ですべてのcbor
関連の問題を収集しました。 そこで、そのモジュールを続行する方法について説明しましょう。
最も参考になるコメント
ところで:これは荒らしのように聞こえるかもしれませんが、正直に言って、このcborパーサーを完全に削除することを検討することをお勧めします:標準が適切に実装されておらず、コード品質がひどく、最も重要なことに、バグがたくさんあり、これに積極的に取り組んでいるメンテナ。