LEAmDNS: _parseResponse keeps every answer record of a packet on the heap, so one large answer can abort with out of memory
メンテナーはふだん 1 日以内に返信
まだ誰も着手していません。
評価
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 初心者へのやさしさ
- 52/100
- issue の種類
- バグ
- 明瞭さ
- おおむね明確
- 活発さ
- 活発
- 技術スタック
- arduino, cpp
- 領域
- embedded-iot
調査の方向性
Start in libraries/ESP8266mDNS/src/LEAmDNS_Control.cpp: trace _parseResponse through _readRRAnswer and _processAnswers, then compare with _parseQuery's record handling. The report proposes processing and freeing each response record before reading the next; done means response handling no longer retains all packet records at once while preserving probe and service query behavior. The reporter says they have a patched copy, but provides no test or captured packet.
索引モデルが issue の本文から書いたものです。
説明
What happens
An ESP8266 (core 3.1.2, a GeekMagic SmallTV-Ultra with about 6 KB of free heap while running) restarted after
11.4 hours with an out-of-memory abort inside LEAmDNS. Our crash record, decoded with addr2line:
operator new (288 bytes) failed
<- MDNSResponder::_readRRAnswer
<- MDNSResponder::_parseResponse
<- MDNSResponder::_parseMessage
<- MDNSResponder::_process
free heap 952 bytes, largest free block 248 bytes
The lowest values recorded before, during those hours, were about 4.4 KB free and a 1.5 KB largest block. So
about 3.5 KB went within a moment. The sketch only advertises (MDNS.begin, addService, addServiceTxt, and
MDNS.update() in loop()); it sends no queries.
Why, from reading the code (master, libraries/ESP8266mDNS/src/LEAmDNS_Control.cpp)
_parseResponsereads answers only while a service query waits or a probe runs (line 742-743). Probing runs
afterMDNS.beginand again after every interface status change (LEAmDNS.cpp, thestatusChangeCBthat
calls_restart()), for example a Wi-Fi reconnect.- In that state, every record of the incoming packet (
ANCount + NSCount + ARCount, taken from the packet
header) is read with_readRRAnswerinto its own heap object and kept in a list (lines 764-775). - The list goes to
_processAnswersas a whole (line 794) and is freed only after that (lines 804-810).
So the heap needed grows with the number of records in someone else's answer. A phone, TV or speaker that
answers with many records during the probe window can take several KB at once. new aborts on failure in this
core, so the library's own checks for a failed allocation never run, and the result is a restart.
What we did not measure: we have not captured the packet, and we don't know for sure that a reconnect came just
before. That part is our reading of the code.
_parseQuery handles known answers differently: it frees each record right after reading it (so one record at a
time), which is why we think the same can work for responses.
Possible fix
Handle each answer record in _parseResponse as soon as it is read, and free it before reading the next, so the
peak is one record instead of the whole packet. That means splitting _processAnswers so it can take one record
at a time. A simpler, partial alternative: skip (read past without allocating) records whose names cannot
concern this responder.
We are trying the first approach in a patched copy for our own firmware and can open a PR if this direction is
welcome.
- 主要言語
- C++
- スター
- 16.7k
- フォーク
- 13k
- 平均マージ
- 1日 2時間
- マージ済み PR(30日)
- 7
環境構築
このプロジェクトには開発コンテナ、Dockerfile、コントリビューションガイドがありません。まず README を読み、一般的な手順ははじめてのコントリビューションガイドを参照してください。
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
esp8266/Arduino のほかの issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
esp8266/Arduino#9342 · コメント 2 件 ·
メンテナーはふだん 1 日以内に返信
-
Typo in Scan Class Documentation対応中かも @MukundaKatta が 207 日前に担当しました。 オープン
難易度 1/5 1時間未満 初心者へのやさしさ 70/100
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 62/100
esp8266/Arduino#9203 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
難易度 3/5 1〜2日 初心者へのやさしさ 65/100
esp8266/Arduino#9324 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
難易度 4/5 3〜5日 初心者へのやさしさ 42/100
メンテナーはふだん 1 日以内に返信
esp8266/Arduino の issue をすべて見る
似ている issue
-
status:needs-triage
難易度 2/5 1〜3時間 初心者へのやさしさ 74/100
PX4/PX4-Autopilot#29698 ·
メンテナーはふだん 1 日以内に返信
-
go perft exits when EvalFile is unavailable対応中かも @Muawiya-contact が今日担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
official-stockfish/Stockfish#7292 · コメント 2 件 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 77/100
arvidn/libtorrent#9149 ·
メンテナーはふだん 1 日以内に返信
-
Upstream report: MSVC rejects a designated initializer in a dependent template argument (C2131)オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
rhalbersma/tabula#72 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
メンテナーはふだん 1 日以内に返信