1 /* 2 * WPA Supplicant / UNIX domain socket -based control interface 3 * Copyright (c) 2004-2014, Jouni Malinen <j@w1.fi> 4 * 5 * This software may be distributed under the terms of the BSD license. 6 * See README for more details. 7 */ 8 9 #include "includes.h" 10 #include <sys/un.h> 11 #include <sys/stat.h> 12 #include <grp.h> 13 #include <stddef.h> 14 #include <unistd.h> 15 #include <fcntl.h> 16 #ifdef __linux__ 17 #include <sys/ioctl.h> 18 #include <linux/sockios.h> 19 #endif /* __linux__ */ 20 #ifdef ANDROID 21 #include <cutils/sockets.h> 22 #endif /* ANDROID */ 23 24 #include "utils/common.h" 25 #include "utils/eloop.h" 26 #include "utils/list.h" 27 #include "eapol_supp/eapol_supp_sm.h" 28 #include "config.h" 29 #include "wpa_supplicant_i.h" 30 #include "ctrl_iface.h" 31 32 /* Per-interface ctrl_iface */ 33 34 /** 35 * struct wpa_ctrl_dst - Internal data structure of control interface monitors 36 * 37 * This structure is used to store information about registered control 38 * interface monitors into struct wpa_supplicant. This data is private to 39 * ctrl_iface_unix.c and should not be touched directly from other files. 40 */ 41 struct wpa_ctrl_dst { 42 struct dl_list list; 43 struct sockaddr_un addr; 44 socklen_t addrlen; 45 int debug_level; 46 int errors; 47 }; 48 49 50 struct ctrl_iface_priv { 51 struct wpa_supplicant *wpa_s; 52 int sock; 53 struct dl_list ctrl_dst; 54 int android_control_socket; 55 }; 56 57 58 struct ctrl_iface_global_priv { 59 struct wpa_global *global; 60 int sock; 61 struct dl_list ctrl_dst; 62 int android_control_socket; 63 }; 64 65 66 static void wpa_supplicant_ctrl_iface_send(struct wpa_supplicant *wpa_s, 67 const char *ifname, int sock, 68 struct dl_list *ctrl_dst, 69 int level, const char *buf, 70 size_t len, 71 struct ctrl_iface_priv *priv, 72 struct ctrl_iface_global_priv *gp); 73 static int wpas_ctrl_iface_reinit(struct wpa_supplicant *wpa_s, 74 struct ctrl_iface_priv *priv); 75 static int wpas_ctrl_iface_global_reinit(struct wpa_global *global, 76 struct ctrl_iface_global_priv *priv); 77 78 79 static void wpas_ctrl_sock_debug(const char *title, int sock, const char *buf, 80 size_t len) 81 { 82 #ifdef __linux__ 83 socklen_t optlen; 84 int sndbuf, outq; 85 int level = MSG_MSGDUMP; 86 87 if (len >= 5 && os_strncmp(buf, "PONG\n", 5) == 0) 88 level = MSG_EXCESSIVE; 89 90 optlen = sizeof(sndbuf); 91 sndbuf = 0; 92 if (getsockopt(sock, SOL_SOCKET, SO_SNDBUF, &sndbuf, &optlen) < 0) 93 sndbuf = -1; 94 95 if (ioctl(sock, SIOCOUTQ, &outq) < 0) 96 outq = -1; 97 98 wpa_printf(level, 99 "CTRL-DEBUG: %s: sock=%d sndbuf=%d outq=%d send_len=%d", 100 title, sock, sndbuf, outq, (int) len); 101 #endif /* __linux__ */ 102 } 103 104 105 static int wpa_supplicant_ctrl_iface_attach(struct dl_list *ctrl_dst, 106 struct sockaddr_un *from, 107 socklen_t fromlen, int global) 108 { 109 struct wpa_ctrl_dst *dst; 110 char addr_txt[200]; 111 112 dst = os_zalloc(sizeof(*dst)); 113 if (dst == NULL) 114 return -1; 115 os_memcpy(&dst->addr, from, sizeof(struct sockaddr_un)); 116 dst->addrlen = fromlen; 117 dst->debug_level = MSG_INFO; 118 dl_list_add(ctrl_dst, &dst->list); 119 printf_encode(addr_txt, sizeof(addr_txt), 120 (u8 *) from->sun_path, 121 fromlen - offsetof(struct sockaddr_un, sun_path)); 122 wpa_printf(MSG_DEBUG, "CTRL_IFACE %smonitor attached %s", 123 global ? "global " : "", addr_txt); 124 return 0; 125 } 126 127 128 static int wpa_supplicant_ctrl_iface_detach(struct dl_list *ctrl_dst, 129 struct sockaddr_un *from, 130 socklen_t fromlen) 131 { 132 struct wpa_ctrl_dst *dst; 133 134 dl_list_for_each(dst, ctrl_dst, struct wpa_ctrl_dst, list) { 135 if (fromlen == dst->addrlen && 136 os_memcmp(from->sun_path, dst->addr.sun_path, 137 fromlen - offsetof(struct sockaddr_un, sun_path)) 138 == 0) { 139 char addr_txt[200]; 140 printf_encode(addr_txt, sizeof(addr_txt), 141 (u8 *) from->sun_path, 142 fromlen - 143 offsetof(struct sockaddr_un, sun_path)); 144 wpa_printf(MSG_DEBUG, "CTRL_IFACE monitor detached %s", 145 addr_txt); 146 dl_list_del(&dst->list); 147 os_free(dst); 148 return 0; 149 } 150 } 151 return -1; 152 } 153 154 155 static int wpa_supplicant_ctrl_iface_level(struct ctrl_iface_priv *priv, 156 struct sockaddr_un *from, 157 socklen_t fromlen, 158 char *level) 159 { 160 struct wpa_ctrl_dst *dst; 161 162 wpa_printf(MSG_DEBUG, "CTRL_IFACE LEVEL %s", level); 163 164 dl_list_for_each(dst, &priv->ctrl_dst, struct wpa_ctrl_dst, list) { 165 if (fromlen == dst->addrlen && 166 os_memcmp(from->sun_path, dst->addr.sun_path, 167 fromlen - offsetof(struct sockaddr_un, sun_path)) 168 == 0) { 169 char addr_txt[200]; 170 dst->debug_level = atoi(level); 171 printf_encode(addr_txt, sizeof(addr_txt), 172 (u8 *) from->sun_path, fromlen - 173 offsetof(struct sockaddr_un, sun_path)); 174 wpa_printf(MSG_DEBUG, "CTRL_IFACE changed monitor level to %d for %s", 175 dst->debug_level, addr_txt); 176 return 0; 177 } 178 } 179 180 return -1; 181 } 182 183 184 static void wpa_supplicant_ctrl_iface_receive(int sock, void *eloop_ctx, 185 void *sock_ctx) 186 { 187 struct wpa_supplicant *wpa_s = eloop_ctx; 188 struct ctrl_iface_priv *priv = sock_ctx; 189 char buf[4096]; 190 int res; 191 struct sockaddr_un from; 192 socklen_t fromlen = sizeof(from); 193 char *reply = NULL, *reply_buf = NULL; 194 size_t reply_len = 0; 195 int new_attached = 0; 196 197 res = recvfrom(sock, buf, sizeof(buf) - 1, 0, 198 (struct sockaddr *) &from, &fromlen); 199 if (res < 0) { 200 wpa_printf(MSG_ERROR, "recvfrom(ctrl_iface): %s", 201 strerror(errno)); 202 return; 203 } 204 buf[res] = '\0'; 205 206 if (os_strcmp(buf, "ATTACH") == 0) { 207 if (wpa_supplicant_ctrl_iface_attach(&priv->ctrl_dst, &from, 208 fromlen, 0)) 209 reply_len = 1; 210 else { 211 new_attached = 1; 212 reply_len = 2; 213 } 214 } else if (os_strcmp(buf, "DETACH") == 0) { 215 if (wpa_supplicant_ctrl_iface_detach(&priv->ctrl_dst, &from, 216 fromlen)) 217 reply_len = 1; 218 else 219 reply_len = 2; 220 } else if (os_strncmp(buf, "LEVEL ", 6) == 0) { 221 if (wpa_supplicant_ctrl_iface_level(priv, &from, fromlen, 222 buf + 6)) 223 reply_len = 1; 224 else 225 reply_len = 2; 226 } else { 227 reply_buf = wpa_supplicant_ctrl_iface_process(wpa_s, buf, 228 &reply_len); 229 reply = reply_buf; 230 231 /* 232 * There could be some password/key material in the command, so 233 * clear the buffer explicitly now that it is not needed 234 * anymore. 235 */ 236 os_memset(buf, 0, res); 237 } 238 239 if (!reply && reply_len == 1) { 240 reply = "FAIL\n"; 241 reply_len = 5; 242 } else if (!reply && reply_len == 2) { 243 reply = "OK\n"; 244 reply_len = 3; 245 } 246 247 if (reply) { 248 wpas_ctrl_sock_debug("ctrl_sock-sendto", sock, reply, 249 reply_len); 250 if (sendto(sock, reply, reply_len, 0, (struct sockaddr *) &from, 251 fromlen) < 0) { 252 int _errno = errno; 253 wpa_dbg(wpa_s, MSG_DEBUG, 254 "ctrl_iface sendto failed: %d - %s", 255 _errno, strerror(_errno)); 256 if (_errno == ENOBUFS || _errno == EAGAIN) { 257 /* 258 * The socket send buffer could be full. This 259 * may happen if client programs are not 260 * receiving their pending messages. Close and 261 * reopen the socket as a workaround to avoid 262 * getting stuck being unable to send any new 263 * responses. 264 */ 265 sock = wpas_ctrl_iface_reinit(wpa_s, priv); 266 if (sock < 0) { 267 wpa_dbg(wpa_s, MSG_DEBUG, "Failed to reinitialize ctrl_iface socket"); 268 } 269 } 270 if (new_attached) { 271 wpa_dbg(wpa_s, MSG_DEBUG, "Failed to send response to ATTACH - detaching"); 272 new_attached = 0; 273 wpa_supplicant_ctrl_iface_detach( 274 &priv->ctrl_dst, &from, fromlen); 275 } 276 } 277 } 278 os_free(reply_buf); 279 280 if (new_attached) 281 eapol_sm_notify_ctrl_attached(wpa_s->eapol); 282 } 283 284 285 static char * wpa_supplicant_ctrl_iface_path(struct wpa_supplicant *wpa_s) 286 { 287 char *buf; 288 size_t len; 289 char *pbuf, *dir = NULL; 290 int res; 291 292 if (wpa_s->conf->ctrl_interface == NULL) 293 return NULL; 294 295 pbuf = os_strdup(wpa_s->conf->ctrl_interface); 296 if (pbuf == NULL) 297 return NULL; 298 if (os_strncmp(pbuf, "DIR=", 4) == 0) { 299 char *gid_str; 300 dir = pbuf + 4; 301 gid_str = os_strstr(dir, " GROUP="); 302 if (gid_str) 303 *gid_str = '\0'; 304 } else 305 dir = pbuf; 306 307 len = os_strlen(dir) + os_strlen(wpa_s->ifname) + 2; 308 buf = os_malloc(len); 309 if (buf == NULL) { 310 os_free(pbuf); 311 return NULL; 312 } 313 314 res = os_snprintf(buf, len, "%s/%s", dir, wpa_s->ifname); 315 if (os_snprintf_error(len, res)) { 316 os_free(pbuf); 317 os_free(buf); 318 return NULL; 319 } 320 #ifdef __CYGWIN__ 321 { 322 /* Windows/WinPcap uses interface names that are not suitable 323 * as a file name - convert invalid chars to underscores */ 324 char *pos = buf; 325 while (*pos) { 326 if (*pos == '\\') 327 *pos = '_'; 328 pos++; 329 } 330 } 331 #endif /* __CYGWIN__ */ 332 os_free(pbuf); 333 return buf; 334 } 335 336 337 static void wpa_supplicant_ctrl_iface_msg_cb(void *ctx, int level, 338 enum wpa_msg_type type, 339 const char *txt, size_t len) 340 { 341 struct wpa_supplicant *wpa_s = ctx; 342 343 if (wpa_s == NULL) 344 return; 345 346 if (type != WPA_MSG_NO_GLOBAL && wpa_s->global->ctrl_iface) { 347 struct ctrl_iface_global_priv *priv = wpa_s->global->ctrl_iface; 348 if (!dl_list_empty(&priv->ctrl_dst)) { 349 wpa_supplicant_ctrl_iface_send( 350 wpa_s, 351 type != WPA_MSG_PER_INTERFACE ? 352 NULL : wpa_s->ifname, 353 priv->sock, &priv->ctrl_dst, level, txt, len, 354 NULL, priv); 355 } 356 } 357 358 if (type == WPA_MSG_ONLY_GLOBAL || wpa_s->ctrl_iface == NULL) 359 return; 360 wpa_supplicant_ctrl_iface_send(wpa_s, NULL, wpa_s->ctrl_iface->sock, 361 &wpa_s->ctrl_iface->ctrl_dst, 362 level, txt, len, wpa_s->ctrl_iface, 363 NULL); 364 } 365 366 367 static int wpas_ctrl_iface_open_sock(struct wpa_supplicant *wpa_s, 368 struct ctrl_iface_priv *priv) 369 { 370 struct sockaddr_un addr; 371 char *fname = NULL; 372 gid_t gid = 0; 373 int gid_set = 0; 374 char *buf, *dir = NULL, *gid_str = NULL; 375 struct group *grp; 376 char *endp; 377 int flags; 378 379 buf = os_strdup(wpa_s->conf->ctrl_interface); 380 if (buf == NULL) 381 goto fail; 382 #ifdef ANDROID 383 os_snprintf(addr.sun_path, sizeof(addr.sun_path), "wpa_%s", 384 wpa_s->conf->ctrl_interface); 385 priv->sock = android_get_control_socket(addr.sun_path); 386 if (priv->sock >= 0) { 387 priv->android_control_socket = 1; 388 goto havesock; 389 } 390 #endif /* ANDROID */ 391 if (os_strncmp(buf, "DIR=", 4) == 0) { 392 dir = buf + 4; 393 gid_str = os_strstr(dir, " GROUP="); 394 if (gid_str) { 395 *gid_str = '\0'; 396 gid_str += 7; 397 } 398 } else { 399 dir = buf; 400 gid_str = wpa_s->conf->ctrl_interface_group; 401 } 402 403 if (mkdir(dir, S_IRWXU | S_IRWXG) < 0) { 404 if (errno == EEXIST) { 405 wpa_printf(MSG_DEBUG, "Using existing control " 406 "interface directory."); 407 } else { 408 wpa_printf(MSG_ERROR, "mkdir[ctrl_interface=%s]: %s", 409 dir, strerror(errno)); 410 goto fail; 411 } 412 } 413 414 #ifdef ANDROID 415 /* 416 * wpa_supplicant is started from /init.*.rc on Android and that seems 417 * to be using umask 0077 which would leave the control interface 418 * directory without group access. This breaks things since Wi-Fi 419 * framework assumes that this directory can be accessed by other 420 * applications in the wifi group. Fix this by adding group access even 421 * if umask value would prevent this. 422 */ 423 if (chmod(dir, S_IRWXU | S_IRWXG) < 0) { 424 wpa_printf(MSG_ERROR, "CTRL: Could not chmod directory: %s", 425 strerror(errno)); 426 /* Try to continue anyway */ 427 } 428 #endif /* ANDROID */ 429 430 if (gid_str) { 431 grp = getgrnam(gid_str); 432 if (grp) { 433 gid = grp->gr_gid; 434 gid_set = 1; 435 wpa_printf(MSG_DEBUG, "ctrl_interface_group=%d" 436 " (from group name '%s')", 437 (int) gid, gid_str); 438 } else { 439 /* Group name not found - try to parse this as gid */ 440 gid = strtol(gid_str, &endp, 10); 441 if (*gid_str == '\0' || *endp != '\0') { 442 wpa_printf(MSG_ERROR, "CTRL: Invalid group " 443 "'%s'", gid_str); 444 goto fail; 445 } 446 gid_set = 1; 447 wpa_printf(MSG_DEBUG, "ctrl_interface_group=%d", 448 (int) gid); 449 } 450 } 451 452 if (gid_set && chown(dir, -1, gid) < 0) { 453 wpa_printf(MSG_ERROR, "chown[ctrl_interface=%s,gid=%d]: %s", 454 dir, (int) gid, strerror(errno)); 455 goto fail; 456 } 457 458 /* Make sure the group can enter and read the directory */ 459 if (gid_set && 460 chmod(dir, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP) < 0) { 461 wpa_printf(MSG_ERROR, "CTRL: chmod[ctrl_interface]: %s", 462 strerror(errno)); 463 goto fail; 464 } 465 466 if (os_strlen(dir) + 1 + os_strlen(wpa_s->ifname) >= 467 sizeof(addr.sun_path)) { 468 wpa_printf(MSG_ERROR, "ctrl_iface path limit exceeded"); 469 goto fail; 470 } 471 472 priv->sock = socket(PF_UNIX, SOCK_DGRAM, 0); 473 if (priv->sock < 0) { 474 wpa_printf(MSG_ERROR, "socket(PF_UNIX): %s", strerror(errno)); 475 goto fail; 476 } 477 478 os_memset(&addr, 0, sizeof(addr)); 479 #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) 480 addr.sun_len = sizeof(addr); 481 #endif /* __FreeBSD__ */ 482 addr.sun_family = AF_UNIX; 483 fname = wpa_supplicant_ctrl_iface_path(wpa_s); 484 if (fname == NULL) 485 goto fail; 486 os_strlcpy(addr.sun_path, fname, sizeof(addr.sun_path)); 487 if (bind(priv->sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) { 488 wpa_printf(MSG_DEBUG, "ctrl_iface bind(PF_UNIX) failed: %s", 489 strerror(errno)); 490 if (connect(priv->sock, (struct sockaddr *) &addr, 491 sizeof(addr)) < 0) { 492 wpa_printf(MSG_DEBUG, "ctrl_iface exists, but does not" 493 " allow connections - assuming it was left" 494 "over from forced program termination"); 495 if (unlink(fname) < 0) { 496 wpa_printf(MSG_ERROR, 497 "Could not unlink existing ctrl_iface socket '%s': %s", 498 fname, strerror(errno)); 499 goto fail; 500 } 501 if (bind(priv->sock, (struct sockaddr *) &addr, 502 sizeof(addr)) < 0) { 503 wpa_printf(MSG_ERROR, "supp-ctrl-iface-init: bind(PF_UNIX): %s", 504 strerror(errno)); 505 goto fail; 506 } 507 wpa_printf(MSG_DEBUG, "Successfully replaced leftover " 508 "ctrl_iface socket '%s'", fname); 509 } else { 510 wpa_printf(MSG_INFO, "ctrl_iface exists and seems to " 511 "be in use - cannot override it"); 512 wpa_printf(MSG_INFO, "Delete '%s' manually if it is " 513 "not used anymore", fname); 514 os_free(fname); 515 fname = NULL; 516 goto fail; 517 } 518 } 519 520 if (gid_set && chown(fname, -1, gid) < 0) { 521 wpa_printf(MSG_ERROR, "chown[ctrl_interface=%s,gid=%d]: %s", 522 fname, (int) gid, strerror(errno)); 523 goto fail; 524 } 525 526 if (chmod(fname, S_IRWXU | S_IRWXG) < 0) { 527 wpa_printf(MSG_ERROR, "chmod[ctrl_interface=%s]: %s", 528 fname, strerror(errno)); 529 goto fail; 530 } 531 os_free(fname); 532 533 #ifdef ANDROID 534 havesock: 535 #endif /* ANDROID */ 536 537 /* 538 * Make socket non-blocking so that we don't hang forever if 539 * target dies unexpectedly. 540 */ 541 flags = fcntl(priv->sock, F_GETFL); 542 if (flags >= 0) { 543 flags |= O_NONBLOCK; 544 if (fcntl(priv->sock, F_SETFL, flags) < 0) { 545 wpa_printf(MSG_INFO, "fcntl(ctrl, O_NONBLOCK): %s", 546 strerror(errno)); 547 /* Not fatal, continue on.*/ 548 } 549 } 550 551 eloop_register_read_sock(priv->sock, wpa_supplicant_ctrl_iface_receive, 552 wpa_s, priv); 553 wpa_msg_register_cb(wpa_supplicant_ctrl_iface_msg_cb); 554 555 os_free(buf); 556 return 0; 557 558 fail: 559 if (priv->sock >= 0) { 560 close(priv->sock); 561 priv->sock = -1; 562 } 563 if (fname) { 564 unlink(fname); 565 os_free(fname); 566 } 567 os_free(buf); 568 return -1; 569 } 570 571 572 struct ctrl_iface_priv * 573 wpa_supplicant_ctrl_iface_init(struct wpa_supplicant *wpa_s) 574 { 575 struct ctrl_iface_priv *priv; 576 577 priv = os_zalloc(sizeof(*priv)); 578 if (priv == NULL) 579 return NULL; 580 dl_list_init(&priv->ctrl_dst); 581 priv->wpa_s = wpa_s; 582 priv->sock = -1; 583 584 if (wpa_s->conf->ctrl_interface == NULL) 585 return priv; 586 587 #ifdef ANDROID 588 if (wpa_s->global->params.ctrl_interface) { 589 int same = 0; 590 591 if (wpa_s->global->params.ctrl_interface[0] == '/') { 592 if (os_strcmp(wpa_s->global->params.ctrl_interface, 593 wpa_s->conf->ctrl_interface) == 0) 594 same = 1; 595 } else if (os_strncmp(wpa_s->global->params.ctrl_interface, 596 "@android:", 9) == 0 || 597 os_strncmp(wpa_s->global->params.ctrl_interface, 598 "@abstract:", 10) == 0) { 599 char *pos; 600 601 /* 602 * Currently, Android uses @android:wpa_* as the naming 603 * convention for the global ctrl interface. This logic 604 * needs to be revisited if the above naming convention 605 * is modified. 606 */ 607 pos = os_strchr(wpa_s->global->params.ctrl_interface, 608 '_'); 609 if (pos && 610 os_strcmp(pos + 1, 611 wpa_s->conf->ctrl_interface) == 0) 612 same = 1; 613 } 614 615 if (same) { 616 /* 617 * The invalid configuration combination might be 618 * possible to hit in an Android OTA upgrade case, so 619 * instead of refusing to start the wpa_supplicant 620 * process, do not open the per-interface ctrl_iface 621 * and continue with the global control interface that 622 * was set from the command line since the Wi-Fi 623 * framework will use it for operations. 624 */ 625 wpa_printf(MSG_ERROR, 626 "global ctrl interface %s matches ctrl interface %s - do not open per-interface ctrl interface", 627 wpa_s->global->params.ctrl_interface, 628 wpa_s->conf->ctrl_interface); 629 return priv; 630 } 631 } 632 #endif /* ANDROID */ 633 634 if (wpas_ctrl_iface_open_sock(wpa_s, priv) < 0) { 635 os_free(priv); 636 return NULL; 637 } 638 639 return priv; 640 } 641 642 643 static int wpas_ctrl_iface_reinit(struct wpa_supplicant *wpa_s, 644 struct ctrl_iface_priv *priv) 645 { 646 int res; 647 648 if (priv->sock <= 0) 649 return -1; 650 651 /* 652 * On Android, the control socket being used may be the socket 653 * that is created when wpa_supplicant is started as a /init.*.rc 654 * service. Such a socket is maintained as a key-value pair in 655 * Android's environment. Closing this control socket would leave us 656 * in a bad state with an invalid socket descriptor. 657 */ 658 if (priv->android_control_socket) 659 return priv->sock; 660 661 eloop_unregister_read_sock(priv->sock); 662 close(priv->sock); 663 priv->sock = -1; 664 res = wpas_ctrl_iface_open_sock(wpa_s, priv); 665 if (res < 0) 666 return -1; 667 return priv->sock; 668 } 669 670 671 void wpa_supplicant_ctrl_iface_deinit(struct ctrl_iface_priv *priv) 672 { 673 struct wpa_ctrl_dst *dst, *prev; 674 675 if (priv->sock > -1) { 676 char *fname; 677 char *buf, *dir = NULL; 678 eloop_unregister_read_sock(priv->sock); 679 if (!dl_list_empty(&priv->ctrl_dst)) { 680 /* 681 * Wait before closing the control socket if 682 * there are any attached monitors in order to allow 683 * them to receive any pending messages. 684 */ 685 wpa_printf(MSG_DEBUG, "CTRL_IFACE wait for attached " 686 "monitors to receive messages"); 687 os_sleep(0, 100000); 688 } 689 close(priv->sock); 690 priv->sock = -1; 691 fname = wpa_supplicant_ctrl_iface_path(priv->wpa_s); 692 if (fname) { 693 unlink(fname); 694 os_free(fname); 695 } 696 697 if (priv->wpa_s->conf->ctrl_interface == NULL) 698 goto free_dst; 699 buf = os_strdup(priv->wpa_s->conf->ctrl_interface); 700 if (buf == NULL) 701 goto free_dst; 702 if (os_strncmp(buf, "DIR=", 4) == 0) { 703 char *gid_str; 704 dir = buf + 4; 705 gid_str = os_strstr(dir, " GROUP="); 706 if (gid_str) 707 *gid_str = '\0'; 708 } else 709 dir = buf; 710 711 if (rmdir(dir) < 0) { 712 if (errno == ENOTEMPTY) { 713 wpa_printf(MSG_DEBUG, "Control interface " 714 "directory not empty - leaving it " 715 "behind"); 716 } else { 717 wpa_printf(MSG_ERROR, 718 "rmdir[ctrl_interface=%s]: %s", 719 dir, strerror(errno)); 720 } 721 } 722 os_free(buf); 723 } 724 725 free_dst: 726 dl_list_for_each_safe(dst, prev, &priv->ctrl_dst, struct wpa_ctrl_dst, 727 list) 728 os_free(dst); 729 os_free(priv); 730 } 731 732 733 /** 734 * wpa_supplicant_ctrl_iface_send - Send a control interface packet to monitors 735 * @ifname: Interface name for global control socket or %NULL 736 * @sock: Local socket fd 737 * @ctrl_dst: List of attached listeners 738 * @level: Priority level of the message 739 * @buf: Message data 740 * @len: Message length 741 * 742 * Send a packet to all monitor programs attached to the control interface. 743 */ 744 static void wpa_supplicant_ctrl_iface_send(struct wpa_supplicant *wpa_s, 745 const char *ifname, int sock, 746 struct dl_list *ctrl_dst, 747 int level, const char *buf, 748 size_t len, 749 struct ctrl_iface_priv *priv, 750 struct ctrl_iface_global_priv *gp) 751 { 752 struct wpa_ctrl_dst *dst, *next; 753 char levelstr[10]; 754 int idx, res; 755 struct msghdr msg; 756 struct iovec io[5]; 757 758 if (sock < 0 || dl_list_empty(ctrl_dst)) 759 return; 760 761 res = os_snprintf(levelstr, sizeof(levelstr), "<%d>", level); 762 if (os_snprintf_error(sizeof(levelstr), res)) 763 return; 764 idx = 0; 765 if (ifname) { 766 io[idx].iov_base = "IFNAME="; 767 io[idx].iov_len = 7; 768 idx++; 769 io[idx].iov_base = (char *) ifname; 770 io[idx].iov_len = os_strlen(ifname); 771 idx++; 772 io[idx].iov_base = " "; 773 io[idx].iov_len = 1; 774 idx++; 775 } 776 io[idx].iov_base = levelstr; 777 io[idx].iov_len = os_strlen(levelstr); 778 idx++; 779 io[idx].iov_base = (char *) buf; 780 io[idx].iov_len = len; 781 idx++; 782 os_memset(&msg, 0, sizeof(msg)); 783 msg.msg_iov = io; 784 msg.msg_iovlen = idx; 785 786 dl_list_for_each_safe(dst, next, ctrl_dst, struct wpa_ctrl_dst, list) { 787 int _errno; 788 char addr_txt[200]; 789 790 if (level < dst->debug_level) 791 continue; 792 793 printf_encode(addr_txt, sizeof(addr_txt), 794 (u8 *) dst->addr.sun_path, dst->addrlen - 795 offsetof(struct sockaddr_un, sun_path)); 796 msg.msg_name = (void *) &dst->addr; 797 msg.msg_namelen = dst->addrlen; 798 wpas_ctrl_sock_debug("ctrl_sock-sendmsg", sock, buf, len); 799 if (sendmsg(sock, &msg, MSG_DONTWAIT) >= 0) { 800 wpa_printf(MSG_MSGDUMP, 801 "CTRL_IFACE monitor sent successfully to %s", 802 addr_txt); 803 dst->errors = 0; 804 continue; 805 } 806 807 _errno = errno; 808 wpa_printf(MSG_DEBUG, "CTRL_IFACE monitor[%s]: %d - %s", 809 addr_txt, errno, strerror(errno)); 810 dst->errors++; 811 812 if (dst->errors > 10 || _errno == ENOENT || _errno == EPERM) { 813 wpa_printf(MSG_INFO, "CTRL_IFACE: Detach monitor %s that cannot receive messages", 814 addr_txt); 815 wpa_supplicant_ctrl_iface_detach(ctrl_dst, &dst->addr, 816 dst->addrlen); 817 } 818 819 if (_errno == ENOBUFS || _errno == EAGAIN) { 820 /* 821 * The socket send buffer could be full. This may happen 822 * if client programs are not receiving their pending 823 * messages. Close and reopen the socket as a workaround 824 * to avoid getting stuck being unable to send any new 825 * responses. 826 */ 827 if (priv) 828 sock = wpas_ctrl_iface_reinit(wpa_s, priv); 829 else if (gp) 830 sock = wpas_ctrl_iface_global_reinit( 831 wpa_s->global, gp); 832 else 833 break; 834 if (sock < 0) { 835 wpa_dbg(wpa_s, MSG_DEBUG, 836 "Failed to reinitialize ctrl_iface socket"); 837 break; 838 } 839 } 840 } 841 } 842 843 844 void wpa_supplicant_ctrl_iface_wait(struct ctrl_iface_priv *priv) 845 { 846 char buf[256]; 847 int res; 848 struct sockaddr_un from; 849 socklen_t fromlen = sizeof(from); 850 851 for (;;) { 852 wpa_printf(MSG_DEBUG, "CTRL_IFACE - %s - wait for monitor to " 853 "attach", priv->wpa_s->ifname); 854 eloop_wait_for_read_sock(priv->sock); 855 856 res = recvfrom(priv->sock, buf, sizeof(buf) - 1, 0, 857 (struct sockaddr *) &from, &fromlen); 858 if (res < 0) { 859 wpa_printf(MSG_ERROR, "recvfrom(ctrl_iface): %s", 860 strerror(errno)); 861 continue; 862 } 863 buf[res] = '\0'; 864 865 if (os_strcmp(buf, "ATTACH") == 0) { 866 /* handle ATTACH signal of first monitor interface */ 867 if (!wpa_supplicant_ctrl_iface_attach(&priv->ctrl_dst, 868 &from, fromlen, 869 0)) { 870 if (sendto(priv->sock, "OK\n", 3, 0, 871 (struct sockaddr *) &from, fromlen) < 872 0) { 873 wpa_printf(MSG_DEBUG, "ctrl_iface sendto failed: %s", 874 strerror(errno)); 875 } 876 /* OK to continue */ 877 return; 878 } else { 879 if (sendto(priv->sock, "FAIL\n", 5, 0, 880 (struct sockaddr *) &from, fromlen) < 881 0) { 882 wpa_printf(MSG_DEBUG, "ctrl_iface sendto failed: %s", 883 strerror(errno)); 884 } 885 } 886 } else { 887 /* return FAIL for all other signals */ 888 if (sendto(priv->sock, "FAIL\n", 5, 0, 889 (struct sockaddr *) &from, fromlen) < 0) { 890 wpa_printf(MSG_DEBUG, 891 "ctrl_iface sendto failed: %s", 892 strerror(errno)); 893 } 894 } 895 } 896 } 897 898 899 /* Global ctrl_iface */ 900 901 static void wpa_supplicant_global_ctrl_iface_receive(int sock, void *eloop_ctx, 902 void *sock_ctx) 903 { 904 struct wpa_global *global = eloop_ctx; 905 struct ctrl_iface_global_priv *priv = sock_ctx; 906 char buf[4096]; 907 int res; 908 struct sockaddr_un from; 909 socklen_t fromlen = sizeof(from); 910 char *reply = NULL, *reply_buf = NULL; 911 size_t reply_len; 912 913 res = recvfrom(sock, buf, sizeof(buf) - 1, 0, 914 (struct sockaddr *) &from, &fromlen); 915 if (res < 0) { 916 wpa_printf(MSG_ERROR, "recvfrom(ctrl_iface): %s", 917 strerror(errno)); 918 return; 919 } 920 buf[res] = '\0'; 921 922 if (os_strcmp(buf, "ATTACH") == 0) { 923 if (wpa_supplicant_ctrl_iface_attach(&priv->ctrl_dst, &from, 924 fromlen, 1)) 925 reply_len = 1; 926 else 927 reply_len = 2; 928 } else if (os_strcmp(buf, "DETACH") == 0) { 929 if (wpa_supplicant_ctrl_iface_detach(&priv->ctrl_dst, &from, 930 fromlen)) 931 reply_len = 1; 932 else 933 reply_len = 2; 934 } else { 935 reply_buf = wpa_supplicant_global_ctrl_iface_process( 936 global, buf, &reply_len); 937 reply = reply_buf; 938 939 /* 940 * There could be some password/key material in the command, so 941 * clear the buffer explicitly now that it is not needed 942 * anymore. 943 */ 944 os_memset(buf, 0, res); 945 } 946 947 if (!reply && reply_len == 1) { 948 reply = "FAIL\n"; 949 reply_len = 5; 950 } else if (!reply && reply_len == 2) { 951 reply = "OK\n"; 952 reply_len = 3; 953 } 954 955 if (reply) { 956 wpas_ctrl_sock_debug("global_ctrl_sock-sendto", 957 sock, reply, reply_len); 958 if (sendto(sock, reply, reply_len, 0, (struct sockaddr *) &from, 959 fromlen) < 0) { 960 wpa_printf(MSG_DEBUG, "ctrl_iface sendto failed: %s", 961 strerror(errno)); 962 } 963 } 964 os_free(reply_buf); 965 } 966 967 968 static int wpas_global_ctrl_iface_open_sock(struct wpa_global *global, 969 struct ctrl_iface_global_priv *priv) 970 { 971 struct sockaddr_un addr; 972 const char *ctrl = global->params.ctrl_interface; 973 int flags; 974 975 wpa_printf(MSG_DEBUG, "Global control interface '%s'", ctrl); 976 977 #ifdef ANDROID 978 if (os_strncmp(ctrl, "@android:", 9) == 0) { 979 priv->sock = android_get_control_socket(ctrl + 9); 980 if (priv->sock < 0) { 981 wpa_printf(MSG_ERROR, "Failed to open Android control " 982 "socket '%s'", ctrl + 9); 983 goto fail; 984 } 985 wpa_printf(MSG_DEBUG, "Using Android control socket '%s'", 986 ctrl + 9); 987 priv->android_control_socket = 1; 988 goto havesock; 989 } 990 991 if (os_strncmp(ctrl, "@abstract:", 10) != 0) { 992 /* 993 * Backwards compatibility - try to open an Android control 994 * socket and if that fails, assume this was a UNIX domain 995 * socket instead. 996 */ 997 priv->sock = android_get_control_socket(ctrl); 998 if (priv->sock >= 0) { 999 wpa_printf(MSG_DEBUG, 1000 "Using Android control socket '%s'", 1001 ctrl); 1002 priv->android_control_socket = 1; 1003 goto havesock; 1004 } 1005 } 1006 #endif /* ANDROID */ 1007 1008 priv->sock = socket(PF_UNIX, SOCK_DGRAM, 0); 1009 if (priv->sock < 0) { 1010 wpa_printf(MSG_ERROR, "socket(PF_UNIX): %s", strerror(errno)); 1011 goto fail; 1012 } 1013 1014 os_memset(&addr, 0, sizeof(addr)); 1015 #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) 1016 addr.sun_len = sizeof(addr); 1017 #endif /* __FreeBSD__ */ 1018 addr.sun_family = AF_UNIX; 1019 1020 if (os_strncmp(ctrl, "@abstract:", 10) == 0) { 1021 addr.sun_path[0] = '\0'; 1022 os_strlcpy(addr.sun_path + 1, ctrl + 10, 1023 sizeof(addr.sun_path) - 1); 1024 if (bind(priv->sock, (struct sockaddr *) &addr, sizeof(addr)) < 1025 0) { 1026 wpa_printf(MSG_ERROR, "supp-global-ctrl-iface-init: " 1027 "bind(PF_UNIX;%s) failed: %s", 1028 ctrl, strerror(errno)); 1029 goto fail; 1030 } 1031 wpa_printf(MSG_DEBUG, "Using Abstract control socket '%s'", 1032 ctrl + 10); 1033 goto havesock; 1034 } 1035 1036 os_strlcpy(addr.sun_path, ctrl, sizeof(addr.sun_path)); 1037 if (bind(priv->sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) { 1038 wpa_printf(MSG_INFO, "supp-global-ctrl-iface-init(%s) (will try fixup): bind(PF_UNIX): %s", 1039 ctrl, strerror(errno)); 1040 if (connect(priv->sock, (struct sockaddr *) &addr, 1041 sizeof(addr)) < 0) { 1042 wpa_printf(MSG_DEBUG, "ctrl_iface exists, but does not" 1043 " allow connections - assuming it was left" 1044 "over from forced program termination"); 1045 if (unlink(ctrl) < 0) { 1046 wpa_printf(MSG_ERROR, 1047 "Could not unlink existing ctrl_iface socket '%s': %s", 1048 ctrl, strerror(errno)); 1049 goto fail; 1050 } 1051 if (bind(priv->sock, (struct sockaddr *) &addr, 1052 sizeof(addr)) < 0) { 1053 wpa_printf(MSG_ERROR, "supp-glb-iface-init: bind(PF_UNIX;%s): %s", 1054 ctrl, strerror(errno)); 1055 goto fail; 1056 } 1057 wpa_printf(MSG_DEBUG, "Successfully replaced leftover " 1058 "ctrl_iface socket '%s'", 1059 ctrl); 1060 } else { 1061 wpa_printf(MSG_INFO, "ctrl_iface exists and seems to " 1062 "be in use - cannot override it"); 1063 wpa_printf(MSG_INFO, "Delete '%s' manually if it is " 1064 "not used anymore", 1065 ctrl); 1066 goto fail; 1067 } 1068 } 1069 1070 wpa_printf(MSG_DEBUG, "Using UNIX control socket '%s'", ctrl); 1071 1072 if (global->params.ctrl_interface_group) { 1073 char *gid_str = global->params.ctrl_interface_group; 1074 gid_t gid = 0; 1075 struct group *grp; 1076 char *endp; 1077 1078 grp = getgrnam(gid_str); 1079 if (grp) { 1080 gid = grp->gr_gid; 1081 wpa_printf(MSG_DEBUG, "ctrl_interface_group=%d" 1082 " (from group name '%s')", 1083 (int) gid, gid_str); 1084 } else { 1085 /* Group name not found - try to parse this as gid */ 1086 gid = strtol(gid_str, &endp, 10); 1087 if (*gid_str == '\0' || *endp != '\0') { 1088 wpa_printf(MSG_ERROR, "CTRL: Invalid group " 1089 "'%s'", gid_str); 1090 goto fail; 1091 } 1092 wpa_printf(MSG_DEBUG, "ctrl_interface_group=%d", 1093 (int) gid); 1094 } 1095 if (chown(ctrl, -1, gid) < 0) { 1096 wpa_printf(MSG_ERROR, 1097 "chown[global_ctrl_interface=%s,gid=%d]: %s", 1098 ctrl, (int) gid, strerror(errno)); 1099 goto fail; 1100 } 1101 1102 if (chmod(ctrl, S_IRWXU | S_IRWXG) < 0) { 1103 wpa_printf(MSG_ERROR, 1104 "chmod[global_ctrl_interface=%s]: %s", 1105 ctrl, strerror(errno)); 1106 goto fail; 1107 } 1108 } else { 1109 if (chmod(ctrl, S_IRWXU) < 0) { 1110 wpa_printf(MSG_DEBUG, 1111 "chmod[global_ctrl_interface=%s](S_IRWXU): %s", 1112 ctrl, strerror(errno)); 1113 /* continue anyway since group change was not required 1114 */ 1115 } 1116 } 1117 1118 havesock: 1119 1120 /* 1121 * Make socket non-blocking so that we don't hang forever if 1122 * target dies unexpectedly. 1123 */ 1124 flags = fcntl(priv->sock, F_GETFL); 1125 if (flags >= 0) { 1126 flags |= O_NONBLOCK; 1127 if (fcntl(priv->sock, F_SETFL, flags) < 0) { 1128 wpa_printf(MSG_INFO, "fcntl(ctrl, O_NONBLOCK): %s", 1129 strerror(errno)); 1130 /* Not fatal, continue on.*/ 1131 } 1132 } 1133 1134 eloop_register_read_sock(priv->sock, 1135 wpa_supplicant_global_ctrl_iface_receive, 1136 global, priv); 1137 1138 return 0; 1139 1140 fail: 1141 if (priv->sock >= 0) { 1142 close(priv->sock); 1143 priv->sock = -1; 1144 } 1145 return -1; 1146 } 1147 1148 1149 struct ctrl_iface_global_priv * 1150 wpa_supplicant_global_ctrl_iface_init(struct wpa_global *global) 1151 { 1152 struct ctrl_iface_global_priv *priv; 1153 1154 priv = os_zalloc(sizeof(*priv)); 1155 if (priv == NULL) 1156 return NULL; 1157 dl_list_init(&priv->ctrl_dst); 1158 priv->global = global; 1159 priv->sock = -1; 1160 1161 if (global->params.ctrl_interface == NULL) 1162 return priv; 1163 1164 if (wpas_global_ctrl_iface_open_sock(global, priv) < 0) { 1165 os_free(priv); 1166 return NULL; 1167 } 1168 1169 wpa_msg_register_cb(wpa_supplicant_ctrl_iface_msg_cb); 1170 1171 return priv; 1172 } 1173 1174 1175 static int wpas_ctrl_iface_global_reinit(struct wpa_global *global, 1176 struct ctrl_iface_global_priv *priv) 1177 { 1178 int res; 1179 1180 if (priv->sock <= 0) 1181 return -1; 1182 1183 /* 1184 * On Android, the control socket being used may be the socket 1185 * that is created when wpa_supplicant is started as a /init.*.rc 1186 * service. Such a socket is maintained as a key-value pair in 1187 * Android's environment. Closing this control socket would leave us 1188 * in a bad state with an invalid socket descriptor. 1189 */ 1190 if (priv->android_control_socket) 1191 return priv->sock; 1192 1193 eloop_unregister_read_sock(priv->sock); 1194 close(priv->sock); 1195 priv->sock = -1; 1196 res = wpas_global_ctrl_iface_open_sock(global, priv); 1197 if (res < 0) 1198 return -1; 1199 return priv->sock; 1200 } 1201 1202 1203 void 1204 wpa_supplicant_global_ctrl_iface_deinit(struct ctrl_iface_global_priv *priv) 1205 { 1206 struct wpa_ctrl_dst *dst, *prev; 1207 1208 if (priv->sock >= 0) { 1209 eloop_unregister_read_sock(priv->sock); 1210 close(priv->sock); 1211 } 1212 if (priv->global->params.ctrl_interface) 1213 unlink(priv->global->params.ctrl_interface); 1214 dl_list_for_each_safe(dst, prev, &priv->ctrl_dst, struct wpa_ctrl_dst, 1215 list) 1216 os_free(dst); 1217 os_free(priv); 1218 } 1219