src/config.c
changeset 11 a769385a59c6
parent 10 311ea5fa60dd
child 13 d3554afaa768
--- a/src/config.c
+++ b/src/config.c
@@ -13,7 +13,7 @@
 const
 char *CONFIG_OPTIONS[] = {
     "NICK", "PASSWORD", "SERVER", "PORT",
-    "CHANNEL", "TOPIC",
+    "CHANNEL", "TOPIC", NULL
 };
 
 int config (UC * uc, char *fname)
@@ -31,7 +31,7 @@
     while (CONFIG_OPTIONS[i] != NULL)
         i++;
 
-    line = calloc (i, sizeof (char *));
+    line = calloc ((size_t) (i + 1), sizeof (char *));
 
     /*
      * We can easily provide default values ...
@@ -39,22 +39,14 @@
     uc->nick = uc->pass = uc->server = uc->channel = uc->topic = NULL;
     uc->port = 6667;
 
-    *buffer = 0;
-    fgets (buffer, 512, f);
-
-    token = buffer;
+    while (!feof (f)) {
+        *buffer = '\0';
+        (void)fgets (buffer, 512, f);
+        token = buffer;
 
-    while (!feof (f)) {
-        /*
-         * eat trailing tabs
-         */
-        while (*token == '\t')
+        while (*token == '\t')  /* Eat trailing tabs */
             token++;
-
-        /*
-         * eat trailing whitespaces
-         */
-        while (*token == ' ')
+        while (*token == ' ')   /* Eat trailing whitespaces */
             token++;
 
         token = strtok (token, ":");
@@ -63,15 +55,13 @@
             value = strtok (NULL, "\n");
             i = 0;
             while (CONFIG_OPTIONS[i] != NULL) {
-                if (!strcmp (token, CONFIG_OPTIONS[i])) {
-                    line[i] = malloc (strlen (value) + 1);
-                    strncpy (line[i], value, strlen (value));
+                if (!strcmp (CONFIG_OPTIONS[i], token)) {
+                    if (value)
+                        line[i] = strdup (value);
                 }
                 i++;
             }
         }
-        *buffer = 0;
-        fgets (buffer, 512, f);
     }
 
     if (fclose (f) != 0)
@@ -82,27 +72,36 @@
         if (line[i] != NULL)
             switch (i) {
             case 0:            /* NICK */
-                uc->nick = line[i];
+                uc->nick = strdup (line[i]);
+                free (line[i]);
                 break;
             case 1:            /* PASSWORD */
-                uc->pass = line[i];
+                uc->pass = strdup (line[i]);
+                free (line[i]);
                 break;
             case 2:            /* SERVER */
-                uc->server = line[i];
+                uc->server = strdup (line[i]);
+                free (line[i]);
                 break;
             case 3:            /* PORT */
                 uc->port = atoi (line[i]);
+                free (line[i]);
                 break;
             case 4:            /* CHANNEL */
-                uc->channel = line[i];
+                uc->channel = strdup (line[i]);
+                free (line[i]);
                 break;
             case 5:            /* TOPIC */
-                uc->topic = line[i];
+                uc->topic = strdup (line[i]);
+                free (line[i]);
                 break;
             }
         i++;
     }
 
+    if (line != NULL)
+        free (line);
+
     if (!(uc->nick && uc->pass && uc->server && uc->channel))
         return -2;