aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeelansh Mittal <neelansh@qti.qualcomm.com>2014-11-25 15:41:28 +0530
committerGerrit - the friendly Code Review server <code-review@localhost>2014-11-27 09:03:30 -0800
commitf3d1d404e7a85a394e8dddffc507f68615aa7d62 (patch)
treebd6dc7d618886322ce75e35d17169fa35da69034
parentbfd368ccb011e62cccf32d433e7d6713c425f5fe (diff)
downloadandroid_external_wpa_supplicant_8-f3d1d404e7a85a394e8dddffc507f68615aa7d62.tar.gz
android_external_wpa_supplicant_8-f3d1d404e7a85a394e8dddffc507f68615aa7d62.tar.bz2
android_external_wpa_supplicant_8-f3d1d404e7a85a394e8dddffc507f68615aa7d62.zip
Do not re-open Android control sockets
On Android, the control socket being used may be the socket that is created when wpa_supplicant is started as a /init.*.rc service. Such a socket is maintained as a key-value pair in Android's environment. Closing this control socket would leave wpa_supplicant in a bad state. When wpa_supplicant re-opens the ctrl_iface socket, it will query the Android's environment, and will be returned with the same socket descriptor that has already been closed. CRs-fixed: 755459 Git-commit: 3a7414b6a65403ca1b857aa8950a384adaec5f13 Git-repo : git://w1.fi/srv/git/hostap.git Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com> Change-Id: Ide6901d7fe7ed9fa0f62920365b5e1acf3208da9
-rw-r--r--wpa_supplicant/ctrl_iface_unix.c28
1 files changed, 27 insertions, 1 deletions
diff --git a/wpa_supplicant/ctrl_iface_unix.c b/wpa_supplicant/ctrl_iface_unix.c
index 40082e24..99f3e538 100644
--- a/wpa_supplicant/ctrl_iface_unix.c
+++ b/wpa_supplicant/ctrl_iface_unix.c
@@ -47,6 +47,7 @@ struct ctrl_iface_priv {
struct wpa_supplicant *wpa_s;
int sock;
struct dl_list ctrl_dst;
+ int android_control_socket;
};
@@ -54,6 +55,7 @@ struct ctrl_iface_global_priv {
struct wpa_global *global;
int sock;
struct dl_list ctrl_dst;
+ int android_control_socket;
};
@@ -340,8 +342,10 @@ static int wpas_ctrl_iface_open_sock(struct wpa_supplicant *wpa_s,
os_snprintf(addr.sun_path, sizeof(addr.sun_path), "wpa_%s",
wpa_s->conf->ctrl_interface);
priv->sock = android_get_control_socket(addr.sun_path);
- if (priv->sock >= 0)
+ if (priv->sock >= 0) {
+ priv->android_control_socket = 1;
goto havesock;
+ }
#endif /* ANDROID */
if (os_strncmp(buf, "DIR=", 4) == 0) {
dir = buf + 4;
@@ -556,6 +560,16 @@ static int wpas_ctrl_iface_reinit(struct wpa_supplicant *wpa_s,
if (priv->sock <= 0)
return -1;
+ /*
+ * On Android, the control socket being used may be the socket
+ * that is created when wpa_supplicant is started as a /init.*.rc
+ * service. Such a socket is maintained as a key-value pair in
+ * Android's environment. Closing this control socket would leave us
+ * in a bad state with an invalid socket descriptor.
+ */
+ if (priv->android_control_socket)
+ return priv->sock;
+
eloop_unregister_read_sock(priv->sock);
close(priv->sock);
priv->sock = -1;
@@ -870,6 +884,7 @@ static int wpas_global_ctrl_iface_open_sock(struct wpa_global *global,
}
wpa_printf(MSG_DEBUG, "Using Android control socket '%s'",
ctrl + 9);
+ priv->android_control_socket = 1;
goto havesock;
}
@@ -884,6 +899,7 @@ static int wpas_global_ctrl_iface_open_sock(struct wpa_global *global,
wpa_printf(MSG_DEBUG,
"Using Android control socket '%s'",
ctrl);
+ priv->android_control_socket = 1;
goto havesock;
}
}
@@ -1064,6 +1080,16 @@ static int wpas_ctrl_iface_global_reinit(struct wpa_global *global,
if (priv->sock <= 0)
return -1;
+ /*
+ * On Android, the control socket being used may be the socket
+ * that is created when wpa_supplicant is started as a /init.*.rc
+ * service. Such a socket is maintained as a key-value pair in
+ * Android's environment. Closing this control socket would leave us
+ * in a bad state with an invalid socket descriptor.
+ */
+ if (priv->android_control_socket)
+ return priv->sock;
+
eloop_unregister_read_sock(priv->sock);
close(priv->sock);
priv->sock = -1;