Riot: hängt im cbor parser

Erstellt am 10. Okt. 2017  ·  5Kommentare  ·  Quelle: RIOT-OS/RIOT

@ PyroPeter und ich haben den Cbor-Parser mit afl durcheinander gebracht und dabei ein paar Fehler gefunden. Siehe Nr. 7707 und Nr. 7706. Zusätzlich haben wir einige Eingaben gefunden, die Hänge im cbor-Parsing-Code ausgelöst haben. Ein Tarball mit Eingabedateien, die Hänge im cbor-Parser auslösen, finden Sie hier: http://user.informatik.uni-bremen.de/~tempel/riot-cbor-hangs.tar.xz

bug

Hilfreichster Kommentar

Übrigens: Das klingt vielleicht wie ein Troll, aber ich würde ehrlich vorschlagen, dass Sie erwägen, diesen Cbor-Parser vollständig zu entfernen: Er implementiert den Standard nicht richtig, die Codequalität ist schrecklich und vor allem ist er voller Fehler und scheint keine zu haben ein Betreuer, der aktiv daran arbeitet.

Alle 5 Kommentare

Übrigens: Das klingt vielleicht wie ein Troll, aber ich würde ehrlich vorschlagen, dass Sie erwägen, diesen Cbor-Parser vollständig zu entfernen: Er implementiert den Standard nicht richtig, die Codequalität ist schrecklich und vor allem ist er voller Fehler und scheint keine zu haben ein Betreuer, der aktiv daran arbeitet.

@nmeum , können Sie die Probleme mit der Codequalität und die Probleme mit der RFC-Konformität etwas näher erläutern?

In Bezug auf die RFC-Konformität: Der Parser analysiert die meisten Cbor-Testvektoren nicht ordnungsgemäß. In Bezug auf die Codequalität: Wir haben mehrere Probleme festgestellt, indem wir den Code nur durcheinander gebracht und durchgesehen haben, um diese zu beheben. Es schien einfach nicht sehr poliert zu sein.

Hier ist ein Patch, der die Hänge (oder zumindest einige davon) im cbor-Parser behebt:

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;

Das Problem scheint gewesen zu sein, dass der Parser nach dem Parsen der Schlüsselwerte in Maps nicht nach Fehlern gesucht hat. Selbst wenn ein Schlüssel nicht gefunden wurde, wurde dennoch cbor_stream_decode_at aufgerufen, um einen Wert für einen nicht vorhandenen Schlüssel zu finden.

Ich bin mir nicht sicher, ob der Patch optimal ist, aber zumindest hängt er nicht mehr ...

Ich habe alle Probleme im Zusammenhang mit cbor in # 7800 gesammelt. Lassen Sie uns dort diskutieren, wie Sie mit diesem Modul fortfahren können.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen