Skip to content

Commit 8a9dc13

Browse files
ccli8dkalowsk
authored andcommitted
drivers: wifi: esp_at: fix rx_sock not ref-counted
This fixes rx_sock is not reference-counted, or crash error on reference to released socket. Signed-off-by: Chun-Chieh Li <[email protected]>
1 parent db59acb commit 8a9dc13

File tree

1 file changed

+17
-5
lines changed

1 file changed

+17
-5
lines changed

drivers/wifi/esp_at/esp_offload.c

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -547,10 +547,16 @@ MODEM_CMD_DIRECT_DEFINE(on_cmd_ciprecvdata)
547547
{
548548
struct esp_data *dev = CONTAINER_OF(data, struct esp_data,
549549
cmd_handler_data);
550-
struct esp_socket *sock = dev->rx_sock;
550+
struct esp_socket *sock;
551551
int data_offset, data_len;
552552
int err;
553553

554+
sock = esp_socket_ref(dev->rx_sock);
555+
if (!sock) {
556+
LOG_ERR("No rx_sock socket");
557+
return -ENOTCONN;
558+
}
559+
554560
#if defined(CONFIG_WIFI_ESP_AT_CIPDINFO_USE)
555561
char raw_remote_ip[INET_ADDRSTRLEN + 3] = {0};
556562
int port = 0;
@@ -563,10 +569,10 @@ MODEM_CMD_DIRECT_DEFINE(on_cmd_ciprecvdata)
563569
#endif
564570
if (err) {
565571
if (err == -EAGAIN) {
566-
return -EAGAIN;
572+
goto socket_unref;
567573
}
568574

569-
return err;
575+
goto socket_unref;
570576
}
571577

572578
#if defined(CONFIG_WIFI_ESP_AT_CIPDINFO_USE)
@@ -591,12 +597,18 @@ MODEM_CMD_DIRECT_DEFINE(on_cmd_ciprecvdata)
591597
if (net_addr_pton(AF_INET, remote_ip_addr, &recv_addr->sin_addr) < 0) {
592598
LOG_ERR("Invalid src addr %s", remote_ip_addr);
593599
err = -EIO;
594-
return err;
600+
goto socket_unref;
595601
}
596602
#endif
597603
esp_socket_rx(sock, data->rx_buf, data_offset, data_len);
598604

599-
return data_offset + data_len;
605+
err = data_offset + data_len;
606+
goto socket_unref;
607+
608+
socket_unref:
609+
esp_socket_unref(sock);
610+
611+
return err;
600612
}
601613

602614
void esp_recvdata_work(struct k_work *work)

0 commit comments

Comments
 (0)