Fix wpa_config_read() with existing config block
authorJouni Malinen <j@w1.fi>
Sat, 26 Apr 2014 08:39:48 +0000 (11:39 +0300)
committerJouni Malinen <j@w1.fi>
Mon, 28 Apr 2014 13:54:09 +0000 (16:54 +0300)
If two config files are merged together, the ssid and cred blocks may
not have been processed correctly since the tail pointers were not
updated to the last entry from the first configuration file.

Signed-off-by: Jouni Malinen <j@w1.fi>
wpa_supplicant/config_file.c

index 8d59f49..3842946 100644 (file)
@@ -352,8 +352,8 @@ struct wpa_config * wpa_config_read(const char *name, struct wpa_config *cfgp)
        FILE *f;
        char buf[512], *pos;
        int errors = 0, line = 0;
-       struct wpa_ssid *ssid, *tail = NULL, *head = NULL;
-       struct wpa_cred *cred, *cred_tail = NULL, *cred_head = NULL;
+       struct wpa_ssid *ssid, *tail, *head;
+       struct wpa_cred *cred, *cred_tail, *cred_head;
        struct wpa_config *config;
        int id = 0;
        int cred_id = 0;
@@ -369,8 +369,12 @@ struct wpa_config * wpa_config_read(const char *name, struct wpa_config *cfgp)
                           "structure");
                return NULL;
        }
-       head = config->ssid;
-       cred_head = config->cred;
+       tail = head = config->ssid;
+       while (tail && tail->next)
+               tail = tail->next;
+       cred_tail = cred_head = config->cred;
+       while (cred_tail && cred_tail->next)
+               cred_tail = cred_tail->next;
 
        wpa_printf(MSG_DEBUG, "Reading configuration file '%s'", name);
        f = fopen(name, "r");