Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Corrected stack start and end in stack_thunk_dump_stack(). #7085

Merged
merged 1 commit into from
Feb 16, 2020

Conversation

mhightower83
Copy link
Contributor

No description provided.

@earlephilhower
Copy link
Collaborator

Can you please explain the logic here, @mhightower83 ? I believe the current code dumps the proper stuff.

My test case:

I've applied something to make the BSSL CertStore crash:

earle@server:~/Arduino/hardware/esp8266com/esp8266/libraries/ESP8266WiFi/src$ git diff
diff --git a/libraries/ESP8266WiFi/src/CertStoreBearSSL.cpp b/libraries/ESP8266WiFi/src/CertStoreBearSSL.cpp
index 905efde2..e7d6312b 100644
--- a/libraries/ESP8266WiFi/src/CertStoreBearSSL.cpp
+++ b/libraries/ESP8266WiFi/src/CertStoreBearSSL.cpp
@@ -212,7 +212,7 @@ const br_x509_trust_anchor *CertStore::findHashedTA(void *ctx, void *hashed_dn,
       br_x509_trust_anchor *ta = (br_x509_trust_anchor*)cs->_x509->getTrustAnchors();
       memcpy(ta->dn.data, ci.sha256, sizeof(ci.sha256));
       ta->dn.len = sizeof(ci.sha256);
-
+ta=(br_x509_trust_anchor*)1;
       return ta;
     }
   }

and run the BSSL_CertStore example. It crashes, as expected, giving a dump:


Connecting to NOBABIES
.
WiFi connected
IP address: 
192.168.1.154
Waiting for NTP time sync: .
Current time: Sun Feb 16 02:09:24 2020
Number of CA certs read: 149
Attempting to fetch https://github.com/...
Trying: github.com:443...
Exception (9):
epc1=0x4022e0a4 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000001 depc=0x00000000

>>>stack>>>

ctx: bearssl
sp: 3fff1738 end: 3fff1c58 offset: 0190
3fff18c8:  3fff6e54 3fff6d84 00000000 4022e096  
3fff18d8:  8477bde1 32ce0337 819ac8b5 4e924a1a  
3fff18e8:  859a463b f9a283fe cca38c9e 3db35e0d  
3fff18f8:  8f7804cf deadbeef 00000d00 00000000  
3fff1908:  51cd85fd 59771cc0 c06ad9ab 4396cd84  
3fff1918:  4025e3b7 522daf2c f6f3c118 5123a06c  
3fff1928:  3fff6d9c 000000ba 000006a3 3fff6db0  
3fff1938:  a78cb215 2e5f44dd 3bcd3d87 5b36d405  
....
3fff1c28:  00003a98 00000000 3fff1c64 40226d21  
3fff1c38:  000000db deadbeef deadbeef deadbeef  
3fff1c48:  deadbeef 00000000 3ffeff5c 40204394  

ctx: cont
sp: 3ffffe50 end: 3fffffc0 offset: 0000
3ffffe50:  00003a98 00000000 00000008 40203dba  
3ffffe60:  0000000d 00000005 5845ffaa 00000000  
...
3fffffa0:  3fffdad0 00000000 3ffee780 402061e0  
3fffffb0:  feefeffe feefeffe 3ffe84f0 40100c2d  
<<<stack<<<

Which, with git head, seems to decode just fine:


Exception 9: LoadStoreAlignmentCause: Load or store to an unaligned address
PC: 0x4022e0a4: br_x509_minimal_run at src/x509/x509_minimal.c line 1254
EXCVADDR: 0x00000001

Decoding stack results
0x4022e096: br_x509_minimal_run at src/x509/x509_minimal.c line 1252
0x4022e8b6: xm_append at src/x509/x509_minimal.c line 285
0x40228850: br_ssl_hs_client_run at src/ssl/ssl_hs_client.c line 1871
0x4022683c: jump_handshake at src/ssl/ssl_engine.c line 1081
0x40226d21: br_ssl_engine_recvrec_ack at src/ssl/ssl_engine.c line 1206
0x40203dba: BearSSL::WiFiClientSecure::_run_until(unsigned int, bool) at /home/earle/Arduino/hardware/esp8266com/esp8266/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp line 540
0x40226e46: br_ssl_engine_hs_reset at src/ssl/ssl_engine.c line 1305
0x40203ff8: BearSSL::WiFiClientSecure::_wait_for_handshake() at /home/earle/Arduino/hardware/esp8266com/esp8266/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp line 564
0x402041db: BearSSL::WiFiClientSecure::_connectSSL(char const*) at /home/earle/Arduino/hardware/esp8266com/esp8266/tools/xtensa-lx106-elf/xtensa-lx106-elf/include/c++/4.8.2/bits/shared_ptr.h line 291
0x402060d3: __esp_yield() at /home/earle/Arduino/hardware/esp8266com/esp8266/cores/esp8266/core_esp8266_main.cpp line 107
0x40206686: __delay(unsigned long) at /home/earle/Arduino/hardware/esp8266com/esp8266/cores/esp8266/core_esp8266_wiring.cpp line 54
0x40202dc8: WiFiClient::connect(IPAddress, unsigned short) at /home/earle/Arduino/hardware/esp8266com/esp8266/libraries/ESP8266WiFi/src/include/ClientContext.h line 133
0x402042f9: BearSSL::WiFiClientSecure::connect(char const*, unsigned short) at /home/earle/Arduino/hardware/esp8266com/esp8266/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp line 232
0x40201145: fetchURL(BearSSL::WiFiClientSecure*, char const*, unsigned short, char const*) at /tmp/arduino_modified_sketch_713573/BearSSL_CertStore.ino line 80
0x40203b30: BearSSL::WiFiClientSecure::_clearAuthenticationSettings() at /home/earle/Arduino/hardware/esp8266com/esp8266/libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp line 104
0x40201356: setup() at /tmp/arduino_modified_sketch_713573/BearSSL_CertStore.ino line 153
0x402061e0: loop_wrapper() at /home/earle/Arduino/hardware/esp8266com/esp8266/cores/esp8266/core_esp8266_main.cpp line 177

@mhightower83
Copy link
Contributor Author

Sorry to create confusion.

stack_thunk_ptr = (uint32_t *)malloc(_stackSize * sizeof(uint32_t));
stack_thunk_top = stack_thunk_ptr + _stackSize - 1;

What I was looking at, was that stack_thunk_top is larger stack_thunk_ptr.
Which means pos starting at a value greater than stack_thunk_ptr in the while loops below.
So they are skipped and never run.

void stack_thunk_dump_stack()
{
uint32_t *pos = stack_thunk_top;
while (pos < stack_thunk_ptr) {
if ((pos[0] != _stackPaint) || (pos[1] != _stackPaint) || (pos[2] != _stackPaint) || (pos[3] != _stackPaint))
break;
pos += 4;
}
ets_printf(">>>stack>>>\n");
while (pos < stack_thunk_ptr) {
ets_printf("%08x: %08x %08x %08x %08x\n", (int32_t)pos, pos[0], pos[1], pos[2], pos[3]);
pos += 4;
}

BearSSL stack printing is handled locally in postmortem. The function stack_thunk_dump_stack() is not called.

if (sp_dump > stack_thunk_get_stack_bot() && sp_dump <= stack_thunk_get_stack_top()) {
// BearSSL we dump the BSSL second stack and then reset SP back to the main cont stack
ets_printf_P(PSTR("\nctx: bearssl\nsp: %08x end: %08x offset: %04x\n"), sp_dump, stack_thunk_get_stack_top(), offset);
print_stack(sp_dump + offset, stack_thunk_get_stack_top());
offset = 0; // No offset needed anymore, the exception info was stored in the bssl stack
sp_dump = stack_thunk_get_cont_sp();
}

@earlephilhower
Copy link
Collaborator

I suppose there is some use for the (uncalled-in-the-core) function, so thanks for the explanation and the fix!

@earlephilhower earlephilhower merged commit 321d256 into esp8266:master Feb 16, 2020
@mhightower83 mhightower83 deleted the pr-bear-stack-dump branch January 13, 2021 18:08
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants