summaryrefslogtreecommitdiffstatshomepage
path: root/esp8266
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2016-05-29 09:52:07 +0100
committerDamien George <damien.p.george@gmail.com>2016-05-29 09:52:07 +0100
commit84381fa0fc3b8e461042710c5e7c348367ec4772 (patch)
tree700fd892cc0c386d71b01df9d60d8faf3d38d254 /esp8266
parent55df14f1a4ae6c0f963f75aafc21689ba4dd824d (diff)
downloadmicropython-84381fa0fc3b8e461042710c5e7c348367ec4772.tar.gz
micropython-84381fa0fc3b8e461042710c5e7c348367ec4772.zip
esp8266/modnetwork: Protect scan() callback against memory errors.
scan() allocates memory so may cause an exception to be raised.
Diffstat (limited to 'esp8266')
-rw-r--r--esp8266/modnetwork.c29
1 files changed, 19 insertions, 10 deletions
diff --git a/esp8266/modnetwork.c b/esp8266/modnetwork.c
index d398e876d6..a0758a0d47 100644
--- a/esp8266/modnetwork.c
+++ b/esp8266/modnetwork.c
@@ -136,16 +136,25 @@ STATIC void esp_scan_cb(scaninfo *si, STATUS status) {
return;
}
if (si->pbss && status == 0) {
- struct bss_info *bs;
- STAILQ_FOREACH(bs, si->pbss, next) {
- mp_obj_tuple_t *t = mp_obj_new_tuple(6, NULL);
- t->items[0] = mp_obj_new_bytes(bs->ssid, strlen((char*)bs->ssid));
- t->items[1] = mp_obj_new_bytes(bs->bssid, sizeof(bs->bssid));
- t->items[2] = MP_OBJ_NEW_SMALL_INT(bs->channel);
- t->items[3] = MP_OBJ_NEW_SMALL_INT(bs->rssi);
- t->items[4] = MP_OBJ_NEW_SMALL_INT(bs->authmode);
- t->items[5] = MP_OBJ_NEW_SMALL_INT(bs->is_hidden);
- mp_obj_list_append(*esp_scan_list, MP_OBJ_FROM_PTR(t));
+ // we need to catch any memory errors
+ nlr_buf_t nlr;
+ if (nlr_push(&nlr) == 0) {
+ struct bss_info *bs;
+ STAILQ_FOREACH(bs, si->pbss, next) {
+ mp_obj_tuple_t *t = mp_obj_new_tuple(6, NULL);
+ t->items[0] = mp_obj_new_bytes(bs->ssid, strlen((char*)bs->ssid));
+ t->items[1] = mp_obj_new_bytes(bs->bssid, sizeof(bs->bssid));
+ t->items[2] = MP_OBJ_NEW_SMALL_INT(bs->channel);
+ t->items[3] = MP_OBJ_NEW_SMALL_INT(bs->rssi);
+ t->items[4] = MP_OBJ_NEW_SMALL_INT(bs->authmode);
+ t->items[5] = MP_OBJ_NEW_SMALL_INT(bs->is_hidden);
+ mp_obj_list_append(*esp_scan_list, MP_OBJ_FROM_PTR(t));
+ }
+ nlr_pop();
+ } else {
+ mp_obj_print_exception(&mp_plat_print, MP_OBJ_FROM_PTR(nlr.ret_val));
+ // indicate error
+ *esp_scan_list = MP_OBJ_NULL;
}
} else {
// indicate error