Skip to content

Commit e48122f

Browse files
committed
fix(esp_wifi): fixed Stack corruption in WPS processing
1 parent 4d83458 commit e48122f

File tree

1 file changed

+24
-34
lines changed
  • components/wpa_supplicant/esp_supplicant/src

1 file changed

+24
-34
lines changed

components/wpa_supplicant/esp_supplicant/src/esp_wps.c

Lines changed: 24 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ static void wps_rxq_deinit(void)
119119
#ifdef USE_WPS_TASK
120120
void wps_task(void *pvParameters)
121121
{
122-
ETSEvent *e;
122+
ETSEvent e;
123123
wps_ioctl_param_t *param;
124124
bool del_task = false;
125125

@@ -129,32 +129,32 @@ void wps_task(void *pvParameters)
129129
for (;;) {
130130
if (TRUE == os_queue_recv(s_wps_queue, &e, OS_BLOCK)) {
131131

132-
if ((e->sig >= SIG_WPS_ENABLE) && (e->sig < SIG_WPS_NUM)) {
132+
if ((e.sig >= SIG_WPS_ENABLE) && (e.sig < SIG_WPS_NUM)) {
133133
DATA_MUTEX_TAKE();
134-
if (s_wps_sig_cnt[e->sig]) {
135-
s_wps_sig_cnt[e->sig]--;
134+
if (s_wps_sig_cnt[e.sig]) {
135+
s_wps_sig_cnt[e.sig]--;
136136
} else {
137-
wpa_printf(MSG_ERROR, "wpsT: invalid sig cnt, sig=%" PRId32 " cnt=%d", e->sig, s_wps_sig_cnt[e->sig]);
137+
wpa_printf(MSG_ERROR, "wpsT: invalid sig cnt, sig=%" PRId32 " cnt=%d", e.sig, s_wps_sig_cnt[e.sig]);
138138
}
139139
DATA_MUTEX_GIVE();
140140
}
141141

142-
wpa_printf(MSG_DEBUG, "wpsT: rx sig=%" PRId32 "", e->sig);
142+
wpa_printf(MSG_DEBUG, "wpsT: rx sig=%" PRId32 "", e.sig);
143143

144-
switch (e->sig) {
144+
switch (e.sig) {
145145
case SIG_WPS_ENABLE:
146146
case SIG_WPS_DISABLE:
147147
case SIG_WPS_START:
148-
param = (wps_ioctl_param_t *)e->par;
148+
param = (wps_ioctl_param_t *)e.par;
149149
if (!param) {
150-
wpa_printf(MSG_ERROR, "wpsT: invalid param sig=%" PRId32 "", e->sig);
150+
wpa_printf(MSG_ERROR, "wpsT: invalid param sig=%" PRId32 "", e.sig);
151151
os_semphr_give(s_wps_api_sem);
152152
break;
153153
}
154154

155-
if (e->sig == SIG_WPS_ENABLE) {
155+
if (e.sig == SIG_WPS_ENABLE) {
156156
param->ret = wifi_wps_enable_internal((esp_wps_config_t *)(param->arg));
157-
} else if (e->sig == SIG_WPS_DISABLE) {
157+
} else if (e.sig == SIG_WPS_DISABLE) {
158158
DATA_MUTEX_TAKE();
159159
param->ret = wifi_wps_disable_internal();
160160
del_task = true;
@@ -198,10 +198,9 @@ void wps_task(void *pvParameters)
198198
break;
199199

200200
default:
201-
wpa_printf(MSG_ERROR, "wpsT: invalid sig=%" PRId32 "", e->sig);
201+
wpa_printf(MSG_ERROR, "wpsT: invalid sig=%" PRId32 "", e.sig);
202202
break;
203203
}
204-
os_free(e);
205204

206205
if (del_task) {
207206
wpa_printf(MSG_DEBUG, "wpsT: delete task");
@@ -218,39 +217,30 @@ void wps_task(void *pvParameters)
218217
int wps_post(uint32_t sig, uint32_t par)
219218
{
220219
wpa_printf(MSG_DEBUG, "wps post: sig=%" PRId32 " cnt=%d", sig, s_wps_sig_cnt[sig]);
221-
222-
DATA_MUTEX_TAKE();
220+
ETSEvent evt;
223221

224222
if (!s_wps_task_hdl) {
225223
wpa_printf(MSG_DEBUG, "wps post: sig=%" PRId32 " failed as wps task has been deinited", sig);
226-
DATA_MUTEX_GIVE();
227224
return ESP_FAIL;
228225
}
226+
DATA_MUTEX_TAKE();
229227
if (s_wps_sig_cnt[sig]) {
230228
wpa_printf(MSG_DEBUG, "wps post: sig=%" PRId32 " processing", sig);
231229
DATA_MUTEX_GIVE();
232230
return ESP_OK;
233-
} else {
234-
ETSEvent *evt = (ETSEvent *)os_malloc(sizeof(ETSEvent));
231+
}
235232

236-
if (evt == NULL) {
237-
wpa_printf(MSG_ERROR, "WPS: E N M");
238-
DATA_MUTEX_GIVE();
239-
return ESP_FAIL;
240-
}
233+
s_wps_sig_cnt[sig]++;
234+
evt.sig = sig;
235+
evt.par = par;
236+
DATA_MUTEX_GIVE();
241237

242-
s_wps_sig_cnt[sig]++;
243-
evt->sig = sig;
244-
evt->par = par;
238+
if (os_queue_send(s_wps_queue, &evt, os_task_ms_to_tick(10)) != TRUE) {
239+
wpa_printf(MSG_ERROR, "WPS: Q S E");
240+
DATA_MUTEX_TAKE();
241+
s_wps_sig_cnt[sig]--;
245242
DATA_MUTEX_GIVE();
246-
247-
if (os_queue_send(s_wps_queue, &evt, os_task_ms_to_tick(10)) != TRUE) {
248-
wpa_printf(MSG_ERROR, "WPS: Q S E");
249-
DATA_MUTEX_TAKE();
250-
s_wps_sig_cnt[sig]--;
251-
DATA_MUTEX_GIVE();
252-
return ESP_FAIL;
253-
}
243+
return ESP_FAIL;
254244
}
255245
return ESP_OK;
256246
}

0 commit comments

Comments
 (0)