void radius_server_deinit(struct radius_server_data *data) { if (data == NULL) return; if (data->auth_sock >= 0) { eloop_unregister_read_sock(data->auth_sock); close(data->auth_sock); } radius_server_free_clients(data, data->clients); VM_FREE(data); }
void radius_server_deinit(struct radius_server_data *data) { if (data == NULL) return; if (data->auth_sock >= 0) { eloop_unregister_read_sock(data->auth_sock); close(data->auth_sock); } radius_server_free_clients(data, data->clients); os_free(data->pac_opaque_encr_key); os_free(data->eap_fast_a_id); os_free(data->eap_fast_a_id_info); os_free(data->eap_req_id_text); os_free(data); }
/** * radius_server_deinit - Deinitialize RADIUS server * @data: RADIUS server context from radius_server_init() */ void radius_server_deinit(struct radius_server_data *data) { if (data == NULL) return; if (data->auth_sock >= 0) { eloop_unregister_read_sock(data->auth_sock); close(data->auth_sock); } radius_server_free_clients(data, data->clients); os_free(data->pac_opaque_encr_key); os_free(data->eap_fast_a_id); os_free(data->eap_fast_a_id_info); os_free(data->eap_req_id_text); #ifdef CONFIG_RADIUS_TEST os_free(data->dump_msk_file); #endif /* CONFIG_RADIUS_TEST */ os_free(data); }
static struct radius_client * radius_server_read_clients(const char *client_file, int ipv6) { FILE *f; const int buf_size = 1024; char *buf, *pos; struct radius_client *clients, *tail, *entry; int line = 0, mask, failed = 0, i; struct in_addr addr; #ifdef CONFIG_IPV6 struct in6_addr addr6; #endif /* CONFIG_IPV6 */ unsigned int val; f = fopen(client_file, "r"); if (f == NULL) { RADIUS_ERROR("Could not open client file '%s'", client_file); return NULL; } buf = os_malloc(buf_size); if (buf == NULL) { fclose(f); return NULL; } clients = tail = NULL; while (fgets(buf, buf_size, f)) { /* Configuration file format: * 192.168.1.0/24 secret * 192.168.1.2 secret * fe80::211:22ff:fe33:4455/64 secretipv6 */ line++; buf[buf_size - 1] = '\0'; pos = buf; while (*pos != '\0' && *pos != '\n') pos++; if (*pos == '\n') *pos = '\0'; if (*buf == '\0' || *buf == '#') continue; pos = buf; while ((*pos >= '0' && *pos <= '9') || *pos == '.' || (*pos >= 'a' && *pos <= 'f') || *pos == ':' || (*pos >= 'A' && *pos <= 'F')) { pos++; } if (*pos == '\0') { failed = 1; break; } if (*pos == '/') { char *end; *pos++ = '\0'; mask = strtol(pos, &end, 10); if ((pos == end) || (mask < 0 || mask > (ipv6 ? 128 : 32))) { failed = 1; break; } pos = end; } else { mask = ipv6 ? 128 : 32; *pos++ = '\0'; } if (!ipv6 && inet_aton(buf, &addr) == 0) { failed = 1; break; } #ifdef CONFIG_IPV6 if (ipv6 && inet_pton(AF_INET6, buf, &addr6) <= 0) { if (inet_pton(AF_INET, buf, &addr) <= 0) { failed = 1; break; } /* Convert IPv4 address to IPv6 */ if (mask <= 32) mask += (128 - 32); os_memset(addr6.s6_addr, 0, 10); addr6.s6_addr[10] = 0xff; addr6.s6_addr[11] = 0xff; os_memcpy(addr6.s6_addr + 12, (char *) &addr.s_addr, 4); } #endif /* CONFIG_IPV6 */ while (*pos == ' ' || *pos == '\t') { pos++; } if (*pos == '\0') { failed = 1; break; } entry = os_zalloc(sizeof(*entry)); if (entry == NULL) { failed = 1; break; } entry->shared_secret = os_strdup(pos); if (entry->shared_secret == NULL) { failed = 1; os_free(entry); break; } entry->shared_secret_len = os_strlen(entry->shared_secret); entry->addr.s_addr = addr.s_addr; if (!ipv6) { val = 0; for (i = 0; i < mask; i++) val |= 1 << (31 - i); entry->mask.s_addr = htonl(val); } #ifdef CONFIG_IPV6 if (ipv6) { int offset = mask / 8; os_memcpy(entry->addr6.s6_addr, addr6.s6_addr, 16); os_memset(entry->mask6.s6_addr, 0xff, offset); val = 0; for (i = 0; i < (mask % 8); i++) val |= 1 << (7 - i); if (offset < 16) entry->mask6.s6_addr[offset] = val; } #endif /* CONFIG_IPV6 */ if (tail == NULL) { clients = tail = entry; } else { tail->next = entry; tail = entry; } } if (failed) { RADIUS_ERROR("Invalid line %d in '%s'", line, client_file); radius_server_free_clients(NULL, clients); clients = NULL; } os_free(buf); fclose(f); return clients; }
static struct radius_client * radius_server_read_clients(const char *client_file) { FILE *f; const int buf_size = 1024; char *buf, *pos; struct radius_client *clients, *tail, *entry; int line = 0, mask, failed = 0, i; struct in_addr addr; unsigned int val; f = fopen(client_file, "r"); if (f == NULL) { RADIUS_ERROR("Could not open client file '%s'", client_file); return NULL; } buf = malloc(buf_size); if (buf == NULL) { fclose(f); return NULL; } clients = tail = NULL; while (fgets(buf, buf_size, f)) { /* Configuration file format: * 192.168.1.0/24 secret * 192.168.1.2 secret */ line++; buf[buf_size - 1] = '\0'; pos = buf; while (*pos != '\0' && *pos != '\n') pos++; if (*pos == '\n') *pos = '\0'; if (*buf == '\0' || *buf == '#') continue; pos = buf; while ((*pos >= '0' && *pos <= '9') || *pos == '.') { pos++; } if (*pos == '\0') { failed = 1; break; } if (*pos == '/') { char *end; *pos++ = '\0'; mask = strtol(pos, &end, 10); if ((pos == end) || (mask < 0 || mask > 32)) { failed = 1; break; } pos = end; } else { mask = 32; *pos++ = '\0'; } if (inet_aton(buf, &addr) == 0) { failed = 1; break; } while (*pos == ' ' || *pos == '\t') { pos++; } if (*pos == '\0') { failed = 1; break; } entry = malloc(sizeof(*entry)); if (entry == NULL) { failed = 1; break; } memset(entry, 0, sizeof(*entry)); entry->shared_secret = strdup(pos); if (entry->shared_secret == NULL) { failed = 1; free(entry); break; } entry->shared_secret_len = strlen(entry->shared_secret); entry->addr.s_addr = addr.s_addr; val = 0; for (i = 0; i < mask; i++) val |= 1 << (31 - i); entry->mask.s_addr = htonl(val); if (tail == NULL) { clients = tail = entry; } else { tail->next = entry; tail = entry; } } if (failed) { RADIUS_ERROR("Invalid line %d in '%s'", line, client_file); radius_server_free_clients(NULL, clients); clients = NULL; } free(buf); fclose(f); return clients; }