LEAmDNS: _parseResponse keeps every answer record of a packet on the heap, so one large answer can abort with out of memory
Les mainteneurs répondent en général sous 1 jour
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Accessibilité débutants
- 52/100
- Type d'issue
- Bug
- Clarté
- Plutôt claire
- Activité
- Active
- Stack technique
- arduino, cpp
- Domaine
- embedded-iot
Piste de recherche
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.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
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.
- Langage dominant
- C++
- Étoiles
- 16.7k
- Forks
- 13k
- Merge moyen
- 1 j 2 h
- PR mergées (30 j)
- 7
Préparer son environnement
Ce projet ne fournit ni conteneur de développement, ni Dockerfile, ni guide de contribution : l'installation est à votre charge. Commencez par son README, et consultez notre guide de la première contribution pour les étapes générales.
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de esp8266/Arduino
-
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
esp8266/Arduino#9342 · 2 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
Typo in Scan Class DocumentationPeut-être pris @MukundaKatta l’a pris il y a 207 jours. Ouverte
Difficulté 1/5 Moins d'une heure Accessibilité débutants 70/100
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 62/100
esp8266/Arduino#9203 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 3/5 1-2 jours Accessibilité débutants 65/100
esp8266/Arduino#9324 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 4/5 3-5 jours Accessibilité débutants 42/100
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de esp8266/Arduino
Issues similaires
-
status:needs-triage
Difficulté 2/5 1-3 heures Accessibilité débutants 74/100
PX4/PX4-Autopilot#29698 ·
Les mainteneurs répondent en général sous 1 jour
-
go perft exits when EvalFile is unavailablePeut-être pris @Muawiya-contact l’a pris aujourd’hui. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
official-stockfish/Stockfish#7292 · 2 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 77/100
arvidn/libtorrent#9149 ·
Les mainteneurs répondent en général sous 1 jour
-
Upstream report: MSVC rejects a designated initializer in a dependent template argument (C2131)Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
rhalbersma/tabula#72 ·
-
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
Les mainteneurs répondent en général sous 1 jour