aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWeilun Du <wdu@google.com>2023-03-07 20:39:24 -0500
committerWeilun Du <wdu@google.com>2023-03-08 16:42:38 -0500
commit518926a2cb79d95d5d725014933964eb6e38e9c2 (patch)
treedc892bc1bc10d44b468d2926920c98041e377004
parent1d202fd6bdfc0426ba296accec0f3dd5eeea6767 (diff)
downloadwpa_supplicant_8-518926a2cb79d95d5d725014933964eb6e38e9c2.tar.gz
[Hostapd] Driver interface: add checks when setting sockets
To avoid null pointer crashes when set_virtio_sock is used. BUG: 272063358 Change-Id: I5d3c30a3b1d71cc1838c12519d670307489a4ca5 Signed-off-by: Weilun Du <wdu@google.com>
-rw-r--r--src/drivers/driver_virtio_wifi.c29
-rw-r--r--src/drivers/driver_virtio_wifi.h4
2 files changed, 21 insertions, 12 deletions
diff --git a/src/drivers/driver_virtio_wifi.c b/src/drivers/driver_virtio_wifi.c
index 04f636f4..8dee37d2 100644
--- a/src/drivers/driver_virtio_wifi.c
+++ b/src/drivers/driver_virtio_wifi.c
@@ -135,13 +135,17 @@ static void handle_read(int sock, void *eloop_ctx, void *sock_ctx)
handle_frame(drv, buf, len);
}
-void set_virtio_sock(int sock)
+int set_virtio_sock(int sock)
{
- priv_drv->sock = sock;
- if (priv_drv->sock > 0 &&
- eloop_register_read_sock(priv_drv->sock, handle_read, priv_drv, NULL)) {
- wpa_printf(MSG_ERROR, "virtio_wifi: Could not register read socket for eapol");
+ if (priv_drv) {
+ priv_drv->sock = sock;
+ if (priv_drv->sock > 0 &&
+ !eloop_register_read_sock(priv_drv->sock, handle_read, priv_drv, NULL)) {
+ return 0;
+ }
+ wpa_printf(MSG_ERROR, "virtio_wifi: Could not register read socket for eloop");
}
+ return -1;
}
static void handle_ctrl_cmds(int sock, void *eloop_ctx, void *sock_ctx)
@@ -169,13 +173,18 @@ static void handle_ctrl_cmds(int sock, void *eloop_ctx, void *sock_ctx)
}
}
-void set_virtio_ctrl_sock(int sock)
+int set_virtio_ctrl_sock(int sock)
{
- priv_drv->ctrl_sock = sock;
- if (priv_drv->ctrl_sock > 0 &&
- eloop_register_read_sock(priv_drv->ctrl_sock, handle_ctrl_cmds, priv_drv, NULL)) {
- wpa_printf(MSG_ERROR, "virtio_wifi: Could not register control socket for eapol");
+ if (priv_drv) {
+ priv_drv->ctrl_sock = sock;
+ if (priv_drv->ctrl_sock > 0 &&
+ !eloop_register_read_sock(priv_drv->ctrl_sock, handle_ctrl_cmds,
+ priv_drv, NULL)) {
+ return 0;
+ }
+ wpa_printf(MSG_ERROR, "virtio_wifi: Could not register control socket for eloop.");
}
+ return -1;
}
struct virtio_wifi_key_data get_active_ptk() {
diff --git a/src/drivers/driver_virtio_wifi.h b/src/drivers/driver_virtio_wifi.h
index aeb9cced..22e2a303 100644
--- a/src/drivers/driver_virtio_wifi.h
+++ b/src/drivers/driver_virtio_wifi.h
@@ -6,8 +6,8 @@
#ifndef DRIVER_VIRTIO_WIFI_H
#define DRIVER_VIRTIO_WIFI_H
-extern void set_virtio_sock(int sock);
-extern void set_virtio_ctrl_sock(int sock);
+extern int set_virtio_sock(int sock);
+extern int set_virtio_ctrl_sock(int sock);
#define MAX_KEY_MATERIAL_LEN 32 /* max key length is 32 bytes */