Riot: معلقة في محلل cbor

تم إنشاؤها على ١٠ أكتوبر ٢٠١٧  ·  5تعليقات  ·  مصدر: RIOT-OS/RIOT

PyroPeter وأنا fuzzed محلل cbor مع أفل وجدت بعض الأخطاء أثناء القيام بذلك. انظر # 7707 و # 7706. بالإضافة إلى ذلك ، وجدنا عددًا غير قليل من المدخلات التي أدت إلى حدوث تعليق في كود تحليل cbor. يمكن العثور على كرة tar تحتوي على ملفات إدخال تؤدي إلى حدوث تعليق في محلل cbor هنا: http://user.informatik.uni-bremen.de/~tempel/riot-cbor-hangs.tar.xz

bug

التعليق الأكثر فائدة

راجع للشغل: قد يبدو هذا وكأنه قزم ، لكنني أقترح بصراحة أن تفكر في إزالة محلل cbor بالكامل: إنه لا ينفذ المعيار بشكل صحيح ، جودة الكود مروعة والأهم من ذلك أنها مليئة بالأخطاء ولا يبدو أنها تحتوي المشرف الذي يعمل بنشاط على هذا.

ال 5 كومينتر

راجع للشغل: قد يبدو هذا وكأنه قزم ، لكنني أقترح بصراحة أن تفكر في إزالة محلل cbor بالكامل: إنه لا ينفذ المعيار بشكل صحيح ، جودة الكود مروعة والأهم من ذلك أنها مليئة بالأخطاء ولا يبدو أنها تحتوي المشرف الذي يعمل بنشاط على هذا.

nmeum ، هل يمكنك توضيح المزيد حول مشكلات جودة الكود ومشكلات التوافق مع RFC؟

فيما يتعلق بالامتثال RFC: لا يقوم المحلل اللغوي بتحليل غالبية

فيما يلي تصحيح لإصلاح حالات التعليق (أو على الأقل بعضها) في محلل 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 للعثور على قيمة لمفتاح غير موجود.

لست متأكدًا مما إذا كان التصحيح هو الأمثل ولكن على الأقل لم يعد معلقًا بعد الآن ...

لقد جمعت كل المشكلات المتعلقة بـ cbor في # 7800. دعونا نناقش هناك كيفية المضي قدمًا في هذه الوحدة.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات