Browse Source

driver_nl80211: Remove monitor interface if AP initialization fails

Jouni Malinen 16 years ago
parent
commit
9ee06a63e5
1 changed files with 9 additions and 5 deletions
  1. 9 5
      hostapd/driver_nl80211.c

+ 9 - 5
hostapd/driver_nl80211.c

@@ -1925,10 +1925,10 @@ static int i802_init_sockets(struct i802_driver_data *drv, const u8 *bssid)
 		return -1;
 
 	if (nl80211_set_master_mode(drv, drv->iface))
-		return -1;
+		goto fail1;
 
 	if (hostapd_set_iface_flags(drv, drv->iface, 1))
-		return -1;
+		goto fail1;
 
 	memset(&addr, 0, sizeof(addr));
 	addr.sll_family = AF_PACKET;
@@ -1939,7 +1939,7 @@ static int i802_init_sockets(struct i802_driver_data *drv, const u8 *bssid)
 	drv->eapol_sock = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_PAE));
 	if (drv->eapol_sock < 0) {
 		perror("socket(PF_PACKET, SOCK_DGRAM, ETH_P_PAE)");
-		return -1;
+		goto fail1;
 	}
 
 	if (eloop_register_read_sock(drv->eapol_sock, handle_eapol, drv, NULL))
@@ -1952,17 +1952,21 @@ static int i802_init_sockets(struct i802_driver_data *drv, const u8 *bssid)
 	os_strlcpy(ifr.ifr_name, drv->iface, sizeof(ifr.ifr_name));
 	if (ioctl(drv->ioctl_sock, SIOCGIFHWADDR, &ifr) != 0) {
 		perror("ioctl(SIOCGIFHWADDR)");
-		return -1;
+		goto fail1;
 	}
 
 	if (ifr.ifr_hwaddr.sa_family != ARPHRD_ETHER) {
 		printf("Invalid HW-addr family 0x%04x\n",
 		       ifr.ifr_hwaddr.sa_family);
-		return -1;
+		goto fail1;
 	}
 	memcpy(drv->hapd->own_addr, ifr.ifr_hwaddr.sa_data, ETH_ALEN);
 
 	return 0;
+
+fail1:
+	nl80211_remove_iface(drv, drv->monitor_ifidx);
+	return -1;
 }