[PATCH] Handle EAGAIN in wpa_supplicant_ctrl_iface_send
Pontus Fuchs
pontus.fuchs
Fri Sep 20 00:53:52 PDT 2013
Commit 4fdc8def changed the ctrl interface socket to be non-blocking,
but didn't update wpa_supplicant_ctrl_iface_send to handle EAGAIN.
If a burst of events are sent, the socket queue can overflow and
sendmsg fails with EAGAIN. When this happens the monitor is silently
detached.
Signed-hostap: Pontus Fuchs <pontus.fuchs at gmail.com>
---
wpa_supplicant/ctrl_iface_unix.c | 15 +++++++++++----
1 file changed, 11 insertions(+), 4 deletions(-)
diff --git a/wpa_supplicant/ctrl_iface_unix.c b/wpa_supplicant/ctrl_iface_unix.c
index 49489d6..2c67b9c 100644
--- a/wpa_supplicant/ctrl_iface_unix.c
+++ b/wpa_supplicant/ctrl_iface_unix.c
@@ -623,14 +623,21 @@ static void wpa_supplicant_ctrl_iface_send(const char *ifname, int sock,
msg.msg_name = (void *) &dst->addr;
msg.msg_namelen = dst->addrlen;
if (sendmsg(sock, &msg, MSG_DONTWAIT) < 0) {
- int _errno = errno;
+ int _errno = errno, detach = 0;
wpa_printf(MSG_INFO, "CTRL_IFACE monitor[%d]: "
"%d - %s",
idx, errno, strerror(errno));
dst->errors++;
- if (dst->errors > 1000 ||
- (_errno != ENOBUFS && dst->errors > 10) ||
- _errno == ENOENT) {
+ if (dst->errors > 1000 || _errno == ENOENT)
+ detach = 1;
+ if (!(_errno == ENOBUFS || _errno == EAGAIN ||
+ _errno == EWOULDBLOCK) && dst->errors > 10)
+ detach = 1;
+ if (detach) {
+ wpa_printf(MSG_ERROR, "CTRL_IFACE "
+ "monitor[%d]: Too many "
+ "errors. Detaching. ",
+ idx);
wpa_supplicant_ctrl_iface_detach(
ctrl_dst, &dst->addr,
dst->addrlen);
--
1.8.1.2
More information about the Hostap
mailing list