Riot: se bloque dans l'analyseur cbor

Créé le 10 oct. 2017  ·  5Commentaires  ·  Source: RIOT-OS/RIOT

@PyroPeter et moi avons brouillé l'analyseur cbor avec afl et avons trouvé quelques bogues en le faisant. Voir # 7707 et # 7706. De plus, nous avons trouvé un certain nombre d'entrées qui ont déclenché des blocages dans le code d'analyse cbor. Une archive contenant les fichiers d'entrée qui déclenchent se bloque dans l'analyseur cbor peut être trouvée ici: http://user.informatik.uni-bremen.de/~tempel/riot-cbor-hangs.tar.xz

bug

Commentaire le plus utile

BTW: Cela peut ressembler à un troll, mais je vous suggère honnêtement d'envisager de supprimer complètement cet analyseur cbor: il n'implémente pas correctement la norme, la qualité du code est horrible et, surtout, il est plein de bogues et ne semble pas avoir un responsable qui y travaille activement.

Tous les 5 commentaires

BTW: Cela peut ressembler à un troll, mais je vous suggère honnêtement d'envisager de supprimer complètement cet analyseur cbor: il n'implémente pas correctement la norme, la qualité du code est horrible et, surtout, il est plein de bogues et ne semble pas avoir un responsable qui y travaille activement.

@nmeum , pouvez-vous élaborer un peu plus sur les problèmes de qualité du code et les problèmes de conformité RFC?

Concernant la conformité RFC: L'analyseur syntaxique n'analyse pas correctement la majorité des

Voici un patch corrigeant les blocages (ou au moins certains d'entre eux) dans l'analyseur 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;

Le problème semble avoir été que l'analyseur n'a pas vérifié les erreurs après avoir analysé les valeurs de clé dans les cartes. Ainsi, même si une clé n'était pas trouvée, elle invoquait toujours cbor_stream_decode_at pour trouver une valeur pour une clé non existante.

Je ne sais pas si le patch est optimal mais au moins il ne se bloque plus…

J'ai collecté tous les problèmes liés à cbor dans # 7800. Voyons comment continuer avec ce module.

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

pietrotedeschi picture pietrotedeschi  ·  4Commentaires

jue89 picture jue89  ·  5Commentaires

jdavid picture jdavid  ·  5Commentaires

miri64 picture miri64  ·  5Commentaires

sinkarharshad picture sinkarharshad  ·  7Commentaires