hostapd: Fix internal crypto build without TLS
[wpasupplicant] / wpa_supplicant / config.c
index 70b02c4..5f7f34f 100644 (file)
@@ -60,14 +60,19 @@ struct parse_data {
 static char * wpa_config_parse_string(const char *value, size_t *len)
 {
        if (*value == '"') {
-               char *pos;
+               const char *pos;
+               char *str;
                value++;
                pos = os_strrchr(value, '"');
                if (pos == NULL || pos[1] != '\0')
                        return NULL;
-               *pos = '\0';
-               *len = os_strlen(value);
-               return os_strdup(value);
+               *len = pos - value;
+               str = os_malloc(*len + 1);
+               if (str == NULL)
+                       return NULL;
+               os_memcpy(str, value, *len);
+               str[*len] = '\0';
+               return str;
        } else {
                u8 *str;
                size_t tlen, hlen = os_strlen(value);
@@ -515,6 +520,10 @@ static int wpa_config_parse_key_mgmt(const struct parse_data *data,
                else if (os_strcmp(start, "WPA-EAP-SHA256") == 0)
                        val |= WPA_KEY_MGMT_IEEE8021X_SHA256;
 #endif /* CONFIG_IEEE80211W */
+#ifdef CONFIG_WPS
+               else if (os_strcmp(start, "WPS") == 0)
+                       val |= WPA_KEY_MGMT_WPS;
+#endif /* CONFIG_WPS */
                else {
                        wpa_printf(MSG_ERROR, "Line %d: invalid key_mgmt '%s'",
                                   line, start);
@@ -621,6 +630,12 @@ static char * wpa_config_write_key_mgmt(const struct parse_data *data,
                                   pos == buf ? "" : " ");
 #endif /* CONFIG_IEEE80211W */
 
+#ifdef CONFIG_WPS
+       if (ssid->key_mgmt & WPA_KEY_MGMT_WPS)
+               pos += os_snprintf(pos, end - pos, "%sWPS",
+                                  pos == buf ? "" : " ");
+#endif /* CONFIG_WPS */
+
        return buf;
 }
 #endif /* NO_CONFIG_WRITE */
@@ -902,6 +917,87 @@ static char * wpa_config_write_auth_alg(const struct parse_data *data,
 #endif /* NO_CONFIG_WRITE */
 
 
+static int wpa_config_parse_scan_freq(const struct parse_data *data,
+                                     struct wpa_ssid *ssid, int line,
+                                     const char *value)
+{
+       int *freqs;
+       size_t used, len;
+       const char *pos;
+
+       used = 0;
+       len = 10;
+       freqs = os_zalloc((len + 1) * sizeof(int));
+       if (freqs == NULL)
+               return -1;
+
+       pos = value;
+       while (pos) {
+               while (*pos == ' ')
+                       pos++;
+               if (used == len) {
+                       int *n;
+                       size_t i;
+                       n = os_realloc(freqs, (len * 2 + 1) * sizeof(int));
+                       if (n == NULL) {
+                               os_free(freqs);
+                               return -1;
+                       }
+                       for (i = len; i <= len * 2; i++)
+                               n[i] = 0;
+                       freqs = n;
+                       len *= 2;
+               }
+
+               freqs[used] = atoi(pos);
+               if (freqs[used] == 0)
+                       break;
+               used++;
+               pos = os_strchr(pos + 1, ' ');
+       }
+
+       os_free(ssid->scan_freq);
+       ssid->scan_freq = freqs;
+
+       return 0;
+}
+
+
+#ifndef NO_CONFIG_WRITE
+static char * wpa_config_write_scan_freq(const struct parse_data *data,
+                                        struct wpa_ssid *ssid)
+{
+       char *buf, *pos, *end;
+       int i, ret;
+       size_t count;
+
+       if (ssid->scan_freq == NULL)
+               return NULL;
+
+       count = 0;
+       for (i = 0; ssid->scan_freq[i]; i++)
+               count++;
+
+       pos = buf = os_zalloc(10 * count + 1);
+       if (buf == NULL)
+               return NULL;
+       end = buf + 10 * count + 1;
+
+       for (i = 0; ssid->scan_freq[i]; i++) {
+               ret = os_snprintf(pos, end - pos, "%s%u",
+                                 i == 0 ? "" : " ", ssid->scan_freq[i]);
+               if (ret < 0 || ret >= end - pos) {
+                       end[-1] = '\0';
+                       return buf;
+               }
+               pos += ret;
+       }
+
+       return buf;
+}
+#endif /* NO_CONFIG_WRITE */
+
+
 #ifdef IEEE8021X_EAPOL
 static int wpa_config_parse_eap(const struct parse_data *data,
                                struct wpa_ssid *ssid, int line,
@@ -1034,8 +1130,8 @@ static int wpa_config_parse_password(const struct parse_data *data,
                                   "password.", line);
                        return -1;
                }
-               wpa_hexdump_ascii(MSG_MSGDUMP, data->name,
-                                 (u8 *) tmp, res_len);
+               wpa_hexdump_ascii_key(MSG_MSGDUMP, data->name,
+                                     (u8 *) tmp, res_len);
 
                os_free(ssid->eap.password);
                ssid->eap.password = (u8 *) tmp;
@@ -1302,11 +1398,12 @@ static const struct parse_data ssid_fields[] = {
        { FUNC(pairwise) },
        { FUNC(group) },
        { FUNC(auth_alg) },
+       { FUNC(scan_freq) },
 #ifdef IEEE8021X_EAPOL
        { FUNC(eap) },
        { STR_LENe(identity) },
        { STR_LENe(anonymous_identity) },
-       { FUNC(password) },
+       { FUNC_KEY(password) },
        { STRe(ca_cert) },
        { STRe(ca_path) },
        { STRe(client_cert) },
@@ -1331,10 +1428,13 @@ static const struct parse_data ssid_fields[] = {
        { STRe(key_id) },
        { STRe(cert_id) },
        { STRe(ca_cert_id) },
+       { STR_KEYe(pin2) },
+       { STRe(engine2_id) },
        { STRe(key2_id) },
        { STRe(cert2_id) },
        { STRe(ca_cert2_id) },
        { INTe(engine) },
+       { INTe(engine2) },
        { INT(eapol_flags) },
 #endif /* IEEE8021X_EAPOL */
        { FUNC_KEY(wep_key0) },
@@ -1348,7 +1448,7 @@ static const struct parse_data ssid_fields[] = {
        { STRe(pac_file) },
        { INTe(fragment_size) },
 #endif /* IEEE8021X_EAPOL */
-       { INT_RANGE(mode, 0, 1) },
+       { INT_RANGE(mode, 0, 2) },
        { INT_RANGE(proactive_key_caching, 0, 1) },
        { INT_RANGE(disabled, 0, 1) },
        { STR(id_str) },
@@ -1497,6 +1597,8 @@ static void eap_peer_config_free(struct eap_peer_config *eap)
        os_free(eap->key2_id);
        os_free(eap->cert2_id);
        os_free(eap->ca_cert2_id);
+       os_free(eap->pin2);
+       os_free(eap->engine2_id);
        os_free(eap->otp);
        os_free(eap->pending_req_otp);
        os_free(eap->pac_file);
@@ -1520,6 +1622,7 @@ void wpa_config_free_ssid(struct wpa_ssid *ssid)
        eap_peer_config_free(&ssid->eap);
 #endif /* IEEE8021X_EAPOL */
        os_free(ssid->id_str);
+       os_free(ssid->scan_freq);
        os_free(ssid);
 }
 
@@ -1562,6 +1665,12 @@ void wpa_config_free(struct wpa_config *config)
        os_free(config->pkcs11_module_path);
 #endif /* EAP_TLS_OPENSSL */
        os_free(config->driver_param);
+       os_free(config->device_name);
+       os_free(config->manufacturer);
+       os_free(config->model_name);
+       os_free(config->model_number);
+       os_free(config->serial_number);
+       os_free(config->device_type);
        os_free(config->pssid);
        os_free(config);
 }