You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository was archived by the owner on Jan 20, 2025. It is now read-only.
Repository navigation
This repository was archived by the owner on Jan 20, 2025. It is now read-only.
Use-after-free in AsyncWebServerRequest::_removeNotInterestingHeaders #951
Hi,
While running my code with Valgrind in an effort to troubleshoot memory-corruption issues I noticed there's a use-after-free error in this library's code.
However, if an item is deleted during iteration, the iterator still holds a reference to its memory, and it still uses it to retrieve the next pointer:
While this works in most cases and particularly on the ESP MCUs, on my testing setup I get a nice SIGSEGV.
A potential fix could be retrieving the next pointer ahead of time and storing it in the iterator. Then in operator++ replace it with the "next-next" pointer and return the stored next pointer. This should make deleting the current item safe.
(If you're wondering how the hell I'm running it with valgrind, I stubbed all the Arduino calls and patched ESPAsyncTCP to use the POSIX socket API, and I'm running my application as a regular Linux program)
Reacted by Francesco Capano, 5tan, Emil Muratov and Andy Shinn
Thanks. I found one before but I think it wasnt that one. I will try it. Iam experiencing random crashes on my esp and it seems it is because this linked list problem. I cant debug because its remote and I cant put serial to it
If you'd like to run your ESP application on a Linux computer, I wrote a bunch of stubs to do so: https://github.com/Depau/wi-se-sw/tree/main/fakeesp This is what allowed me to run this library with Valgrind/GDB and find the issues.
YMMV though, and I don't have time to provide any supports on them. Feel free to do whatever you want with the code, if you have any improvements lmk.
Thank you for the help. Your version of the library seems pretty stable. It runs almost 4 days straight now.
I got a crash like in 20 hours before. But i really get stable consistent file servings and client connection/disconnetions. I will look at your linux thingy too.
I really appreciate these and hope Me_no_Dev will see your fixes
[STALE_SET] This issue has been automatically marked as stale because it has not had recent activity. It will be closed in 14 days if no further activity occurs. Thank you for your contributions.
[STALE_SET] This issue has been automatically marked as stale because it has not had recent activity. It will be closed in 14 days if no further activity occurs. Thank you for your contributions.
[STALE_SET] This issue has been automatically marked as stale because it has not had recent activity. It will be closed in 14 days if no further activity occurs. Thank you for your contributions.
@me-no-dev Is it planned to integrate this fix ? (#952). We are currently trying to port our software (WLED) to the new MCU's, and this one seems to cause troubles on -C3 and (maybe) -S2.
Another problem we run into on -S3 and -S2 is described in #1210 - "[E][vfs_api.cpp:29] open(): myFile.txt does not start with /"
Would be great if these issues could be solved.
We use LittleFS from arduino-esp32 v2.0.4, which seems to behave little different from the original "Lorol LittleFS" that we used for arduino-esp32 v1.0.6.
I opened a PR against the wi-se-patches branch here depau#1 to align it with its upstream
it's not much but at least if you're using a recent version of esp-idf with platformio you can simply point it to the fixed and up-to-date version with
[STALE_SET] This issue has been automatically marked as stale because it has not had recent activity. It will be closed in 14 days if no further activity occurs. Thank you for your contributions.
voidAsyncWebServerRequest::_removeNotInterestingHeaders(){
if (_interestingHeaders.containsIgnoreCase("ANY")) return; // nothing to do
StringArray *a = &_interestingHeaders;
auto cmpr = LinkedList<AsyncWebHeader*>::Predicate{[&a](AsyncWebHeader* h) {
return !a->containsIgnoreCase(h->name().c_str());
}};
while (_headers.remove_first(cmpr)){}
}
or
voidAsyncWebServerRequest::_removeNotInterestingHeaders(){
if (_interestingHeaders.containsIgnoreCase("ANY")) return; // nothing to do
StringArray *a = &_interestingHeaders;
auto cmpr = LinkedList<AsyncWebHeader*>::Predicate{[&a](AsyncWebHeader* h) {
return !a->containsIgnoreCase(h->name().c_str());
}};
_headers.remove_all(cmpr);
}
and add metod to class LinkedList in StringArray.h
boolremove_all(Predicate predicate){
auto it = _root;
auto pit = _root;
bool flag = false;
while (it) {
if(predicate(it->value())){
auto d = it;
if (it == _root) {
_root = _root->next;
pit = _root;
it = _root;
} else {
pit->next = it->next;
it = pit->next;
}
if (_onRemove) {
_onRemove(d->value());
}
delete d;
flag = true;
} else {
pit = it;
it = it->next;
}
}
return flag;
}
Activity
depau commentedon May 25, 2021
zekageri commentedon May 26, 2021
Thanks. I found one before but I think it wasnt that one. I will try it. Iam experiencing random crashes on my esp and it seems it is because this linked list problem. I cant debug because its remote and I cant put serial to it
depau commentedon May 31, 2021
If you'd like to run your ESP application on a Linux computer, I wrote a bunch of stubs to do so: https://github.com/Depau/wi-se-sw/tree/main/fakeesp This is what allowed me to run this library with Valgrind/GDB and find the issues.
YMMV though, and I don't have time to provide any supports on them. Feel free to do whatever you want with the code, if you have any improvements lmk.
zekageri commentedon Jun 1, 2021
Thank you for the help. Your version of the library seems pretty stable. It runs almost 4 days straight now.
I got a crash like in 20 hours before. But i really get stable consistent file servings and client connection/disconnetions. I will look at your linux thingy too.
I really appreciate these and hope Me_no_Dev will see your fixes
stale commentedon Jul 31, 2021
[STALE_SET] This issue has been automatically marked as stale because it has not had recent activity. It will be closed in 14 days if no further activity occurs. Thank you for your contributions.
depau commentedon Aug 1, 2021
Unstale, still waiting for this to be reviewed
stale commentedon Aug 1, 2021
[STALE_CLR] This issue has been removed from the stale queue. Please ensure activity to keep it openin the future.
brandonros commentedon Aug 16, 2021
@depau can you please pull latest
me-no-devmaster into your ``wi-se-patches` branch and push? It does not build otherwise.stale commentedon Mar 30, 2022
[STALE_SET] This issue has been automatically marked as stale because it has not had recent activity. It will be closed in 14 days if no further activity occurs. Thank you for your contributions.
depau commentedon Apr 5, 2022
Unstale
stale commentedon Apr 5, 2022
[STALE_CLR] This issue has been removed from the stale queue. Please ensure activity to keep it openin the future.
1 remaining item
stale commentedon Jul 10, 2022
[STALE_SET] This issue has been automatically marked as stale because it has not had recent activity. It will be closed in 14 days if no further activity occurs. Thank you for your contributions.
softhack007 commentedon Sep 18, 2022
Is this bugfix already integrated?
stale commentedon Sep 18, 2022
[STALE_CLR] This issue has been removed from the stale queue. Please ensure activity to keep it openin the future.
depau commentedon Sep 18, 2022
No
softhack007 commentedon Sep 18, 2022
@me-no-dev Is it planned to integrate this fix ? (#952). We are currently trying to port our software (WLED) to the new MCU's, and this one seems to cause troubles on -C3 and (maybe) -S2.
Another problem we run into on -S3 and -S2 is described in #1210 - "[E][vfs_api.cpp:29] open(): myFile.txt does not start with /"
Would be great if these issues could be solved.
We use LittleFS from arduino-esp32 v2.0.4, which seems to behave little different from the original "Lorol LittleFS" that we used for arduino-esp32 v1.0.6.
jacopomaroli commentedon Mar 10, 2023
I opened a PR against the wi-se-patches branch here depau#1 to align it with its upstream
it's not much but at least if you're using a recent version of esp-idf with platformio you can simply point it to the fixed and up-to-date version with
stale commentedon May 21, 2023
[STALE_SET] This issue has been automatically marked as stale because it has not had recent activity. It will be closed in 14 days if no further activity occurs. Thank you for your contributions.
Fix _removeNotInterestingHeaders
Fix _removeNotInterestingHeaders
A40in commentedon Oct 17, 2024
replace in WebRequest.cpp
or
and add metod to class LinkedList in StringArray.h
stale commentedon Oct 17, 2024
[STALE_CLR] This issue has been removed from the stale queue. Please ensure activity to keep it openin the future.