]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
- Fix config parser memory leaks.
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Mon, 10 Dec 2018 09:27:49 +0000 (09:27 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Mon, 10 Dec 2018 09:27:49 +0000 (09:27 +0000)
git-svn-id: file:///svn/unbound/trunk@5014 be551aaa-1e26-0410-a405-d3ace91eadb9

doc/Changelog
util/configparser.c
util/configparser.y

index ddd0a240992bdf4994153c2c20f2eb7a8b0d5509..9d7eb9d015a64ba02f5401b8027aea574c83ecf0 100644 (file)
@@ -1,3 +1,6 @@
+10 December 2018: Wouter
+       - Fix config parser memory leaks.
+
 6 December 2018: Wouter
        - Fix dns64 allocation in wrong region for returned internal queries.
 
index a350999f35ddf851b66c08ca8bd5f1ebd954699f..679fcf1c3b0283b2d53ba8684be2b68b989ce0e0 100644 (file)
@@ -1034,26 +1034,26 @@ static const yytype_uint16 yyrline[] =
     1120,  1130,  1143,  1154,  1162,  1175,  1184,  1193,  1202,  1212,
     1222,  1230,  1243,  1252,  1260,  1269,  1277,  1290,  1299,  1306,
     1316,  1326,  1336,  1346,  1356,  1366,  1376,  1386,  1393,  1400,
-    1407,  1416,  1425,  1434,  1443,  1450,  1460,  1478,  1485,  1503,
-    1516,  1529,  1538,  1547,  1556,  1565,  1575,  1585,  1596,  1605,
-    1614,  1623,  1632,  1645,  1658,  1667,  1674,  1683,  1692,  1701,
-    1710,  1718,  1731,  1739,  1768,  1775,  1790,  1800,  1810,  1817,
-    1824,  1831,  1840,  1848,  1862,  1881,  1900,  1912,  1924,  1936,
-    1947,  1966,  1976,  1985,  1993,  2001,  2014,  2027,  2040,  2053,
-    2062,  2071,  2077,  2086,  2095,  2105,  2115,  2128,  2141,  2152,
-    2165,  2176,  2189,  2199,  2206,  2213,  2222,  2231,  2241,  2251,
-    2261,  2268,  2275,  2284,  2293,  2303,  2313,  2320,  2327,  2334,
-    2342,  2352,  2362,  2372,  2382,  2412,  2422,  2430,  2439,  2454,
-    2463,  2468,  2469,  2470,  2470,  2470,  2471,  2471,  2471,  2472,
-    2472,  2474,  2484,  2493,  2500,  2507,  2514,  2521,  2528,  2535,
-    2540,  2541,  2542,  2542,  2543,  2543,  2544,  2544,  2545,  2546,
-    2547,  2548,  2549,  2550,  2552,  2560,  2567,  2575,  2583,  2590,
-    2597,  2606,  2615,  2624,  2633,  2642,  2651,  2656,  2657,  2658,
-    2660,  2666,  2676,  2683,  2692,  2700,  2706,  2707,  2709,  2709,
-    2709,  2710,  2710,  2711,  2712,  2713,  2714,  2715,  2717,  2727,
-    2737,  2744,  2753,  2760,  2769,  2777,  2790,  2798,  2811,  2816,
-    2817,  2818,  2818,  2819,  2819,  2819,  2821,  2835,  2850,  2862,
-    2877,  2890
+    1407,  1416,  1425,  1434,  1443,  1450,  1460,  1480,  1487,  1505,
+    1518,  1531,  1540,  1549,  1558,  1567,  1577,  1587,  1598,  1607,
+    1616,  1625,  1634,  1647,  1660,  1669,  1676,  1685,  1694,  1703,
+    1712,  1720,  1733,  1741,  1772,  1779,  1794,  1804,  1814,  1821,
+    1828,  1835,  1844,  1852,  1866,  1887,  1908,  1920,  1932,  1944,
+    1953,  1974,  1984,  1993,  2001,  2009,  2022,  2035,  2050,  2065,
+    2074,  2083,  2089,  2098,  2107,  2117,  2127,  2140,  2153,  2165,
+    2179,  2191,  2205,  2215,  2222,  2229,  2238,  2247,  2257,  2267,
+    2277,  2284,  2291,  2300,  2309,  2319,  2329,  2336,  2343,  2350,
+    2358,  2368,  2378,  2388,  2398,  2430,  2440,  2448,  2456,  2471,
+    2480,  2485,  2486,  2487,  2487,  2487,  2488,  2488,  2488,  2489,
+    2489,  2491,  2501,  2510,  2517,  2524,  2531,  2538,  2545,  2552,
+    2557,  2558,  2559,  2559,  2560,  2560,  2561,  2561,  2562,  2563,
+    2564,  2565,  2566,  2567,  2569,  2578,  2585,  2594,  2603,  2610,
+    2617,  2627,  2637,  2647,  2657,  2667,  2677,  2682,  2683,  2684,
+    2686,  2692,  2702,  2709,  2718,  2726,  2731,  2732,  2734,  2734,
+    2734,  2735,  2735,  2736,  2737,  2738,  2739,  2740,  2742,  2752,
+    2761,  2768,  2777,  2784,  2793,  2801,  2814,  2822,  2835,  2840,
+    2841,  2842,  2842,  2843,  2843,  2843,  2845,  2860,  2875,  2887,
+    2902,  2915
 };
 #endif
 
@@ -4108,26 +4108,28 @@ yyreduce:
                        yyerror("expected deny, refuse, deny_non_local, "
                                "refuse_non_local, allow, allow_setrd or "
                                "allow_snoop in access control action");
+                       free((yyvsp[-1].str));
+                       free((yyvsp[0].str));
                } else {
                        if(!cfg_str2list_insert(&cfg_parser->cfg->acls, (yyvsp[-1].str), (yyvsp[0].str)))
                                fatal_exit("out of memory adding acl");
                }
        }
-#line 4117 "util/configparser.c" /* yacc.c:1646  */
+#line 4119 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 357:
-#line 1479 "./util/configparser.y" /* yacc.c:1646  */
+#line 1481 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_module_conf:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->module_conf);
                cfg_parser->cfg->module_conf = (yyvsp[0].str);
        }
-#line 4127 "util/configparser.c" /* yacc.c:1646  */
+#line 4129 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 358:
-#line 1486 "./util/configparser.y" /* yacc.c:1646  */
+#line 1488 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_val_override_date:%s)\n", (yyvsp[0].str)));
                if(*(yyvsp[0].str) == '\0' || strcmp((yyvsp[0].str), "0") == 0) {
@@ -4144,11 +4146,11 @@ yyreduce:
                }
                free((yyvsp[0].str));
        }
-#line 4148 "util/configparser.c" /* yacc.c:1646  */
+#line 4150 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 359:
-#line 1504 "./util/configparser.y" /* yacc.c:1646  */
+#line 1506 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_val_sig_skew_min:%s)\n", (yyvsp[0].str)));
                if(*(yyvsp[0].str) == '\0' || strcmp((yyvsp[0].str), "0") == 0) {
@@ -4160,11 +4162,11 @@ yyreduce:
                }
                free((yyvsp[0].str));
        }
-#line 4164 "util/configparser.c" /* yacc.c:1646  */
+#line 4166 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 360:
-#line 1517 "./util/configparser.y" /* yacc.c:1646  */
+#line 1519 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_val_sig_skew_max:%s)\n", (yyvsp[0].str)));
                if(*(yyvsp[0].str) == '\0' || strcmp((yyvsp[0].str), "0") == 0) {
@@ -4176,11 +4178,11 @@ yyreduce:
                }
                free((yyvsp[0].str));
        }
-#line 4180 "util/configparser.c" /* yacc.c:1646  */
+#line 4182 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 361:
-#line 1530 "./util/configparser.y" /* yacc.c:1646  */
+#line 1532 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_cache_max_ttl:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4188,11 +4190,11 @@ yyreduce:
                else cfg_parser->cfg->max_ttl = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4192 "util/configparser.c" /* yacc.c:1646  */
+#line 4194 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 362:
-#line 1539 "./util/configparser.y" /* yacc.c:1646  */
+#line 1541 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_cache_max_negative_ttl:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4200,11 +4202,11 @@ yyreduce:
                else cfg_parser->cfg->max_negative_ttl = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4204 "util/configparser.c" /* yacc.c:1646  */
+#line 4206 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 363:
-#line 1548 "./util/configparser.y" /* yacc.c:1646  */
+#line 1550 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_cache_min_ttl:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4212,11 +4214,11 @@ yyreduce:
                else cfg_parser->cfg->min_ttl = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4216 "util/configparser.c" /* yacc.c:1646  */
+#line 4218 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 364:
-#line 1557 "./util/configparser.y" /* yacc.c:1646  */
+#line 1559 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_bogus_ttl:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4224,11 +4226,11 @@ yyreduce:
                else cfg_parser->cfg->bogus_ttl = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4228 "util/configparser.c" /* yacc.c:1646  */
+#line 4230 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 365:
-#line 1566 "./util/configparser.y" /* yacc.c:1646  */
+#line 1568 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_val_clean_additional:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4237,11 +4239,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4241 "util/configparser.c" /* yacc.c:1646  */
+#line 4243 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 366:
-#line 1576 "./util/configparser.y" /* yacc.c:1646  */
+#line 1578 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_val_permissive_mode:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4250,11 +4252,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4254 "util/configparser.c" /* yacc.c:1646  */
+#line 4256 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 367:
-#line 1586 "./util/configparser.y" /* yacc.c:1646  */
+#line 1588 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_aggressive_nsec:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4264,11 +4266,11 @@ yyreduce:
                                (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4268 "util/configparser.c" /* yacc.c:1646  */
+#line 4270 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 368:
-#line 1597 "./util/configparser.y" /* yacc.c:1646  */
+#line 1599 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_ignore_cd_flag:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4276,11 +4278,11 @@ yyreduce:
                else cfg_parser->cfg->ignore_cd = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4280 "util/configparser.c" /* yacc.c:1646  */
+#line 4282 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 369:
-#line 1606 "./util/configparser.y" /* yacc.c:1646  */
+#line 1608 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_serve_expired:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4288,11 +4290,11 @@ yyreduce:
                else cfg_parser->cfg->serve_expired = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4292 "util/configparser.c" /* yacc.c:1646  */
+#line 4294 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 370:
-#line 1615 "./util/configparser.y" /* yacc.c:1646  */
+#line 1617 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_serve_expired_ttl:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4300,11 +4302,11 @@ yyreduce:
                else cfg_parser->cfg->serve_expired_ttl = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4304 "util/configparser.c" /* yacc.c:1646  */
+#line 4306 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 371:
-#line 1624 "./util/configparser.y" /* yacc.c:1646  */
+#line 1626 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_serve_expired_ttl_reset:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4312,11 +4314,11 @@ yyreduce:
                else cfg_parser->cfg->serve_expired_ttl_reset = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4316 "util/configparser.c" /* yacc.c:1646  */
+#line 4318 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 372:
-#line 1633 "./util/configparser.y" /* yacc.c:1646  */
+#line 1635 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_fake_dsa:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4328,11 +4330,11 @@ yyreduce:
 #endif
                free((yyvsp[0].str));
        }
-#line 4332 "util/configparser.c" /* yacc.c:1646  */
+#line 4334 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 373:
-#line 1646 "./util/configparser.y" /* yacc.c:1646  */
+#line 1648 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_fake_sha1:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4344,11 +4346,11 @@ yyreduce:
 #endif
                free((yyvsp[0].str));
        }
-#line 4348 "util/configparser.c" /* yacc.c:1646  */
+#line 4350 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 374:
-#line 1659 "./util/configparser.y" /* yacc.c:1646  */
+#line 1661 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_val_log_level:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4356,21 +4358,21 @@ yyreduce:
                else cfg_parser->cfg->val_log_level = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4360 "util/configparser.c" /* yacc.c:1646  */
+#line 4362 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 375:
-#line 1668 "./util/configparser.y" /* yacc.c:1646  */
+#line 1670 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_val_nsec3_keysize_iterations:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->val_nsec3_key_iterations);
                cfg_parser->cfg->val_nsec3_key_iterations = (yyvsp[0].str);
        }
-#line 4370 "util/configparser.c" /* yacc.c:1646  */
+#line 4372 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 376:
-#line 1675 "./util/configparser.y" /* yacc.c:1646  */
+#line 1677 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_add_holddown:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4378,11 +4380,11 @@ yyreduce:
                else cfg_parser->cfg->add_holddown = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4382 "util/configparser.c" /* yacc.c:1646  */
+#line 4384 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 377:
-#line 1684 "./util/configparser.y" /* yacc.c:1646  */
+#line 1686 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_del_holddown:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4390,11 +4392,11 @@ yyreduce:
                else cfg_parser->cfg->del_holddown = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4394 "util/configparser.c" /* yacc.c:1646  */
+#line 4396 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 378:
-#line 1693 "./util/configparser.y" /* yacc.c:1646  */
+#line 1695 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_keep_missing:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4402,11 +4404,11 @@ yyreduce:
                else cfg_parser->cfg->keep_missing = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4406 "util/configparser.c" /* yacc.c:1646  */
+#line 4408 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 379:
-#line 1702 "./util/configparser.y" /* yacc.c:1646  */
+#line 1704 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_permit_small_holddown:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4415,22 +4417,22 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4419 "util/configparser.c" /* yacc.c:1646  */
+#line 4421 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 380:
-#line 1711 "./util/configparser.y" /* yacc.c:1646  */
+#line 1713 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_key_cache_size:%s)\n", (yyvsp[0].str)));
                if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->key_cache_size))
                        yyerror("memory size expected");
                free((yyvsp[0].str));
        }
-#line 4430 "util/configparser.c" /* yacc.c:1646  */
+#line 4432 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 381:
-#line 1719 "./util/configparser.y" /* yacc.c:1646  */
+#line 1721 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_key_cache_slabs:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0)
@@ -4442,22 +4444,22 @@ yyreduce:
                }
                free((yyvsp[0].str));
        }
-#line 4446 "util/configparser.c" /* yacc.c:1646  */
+#line 4448 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 382:
-#line 1732 "./util/configparser.y" /* yacc.c:1646  */
+#line 1734 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_neg_cache_size:%s)\n", (yyvsp[0].str)));
                if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->neg_cache_size))
                        yyerror("memory size expected");
                free((yyvsp[0].str));
        }
-#line 4457 "util/configparser.c" /* yacc.c:1646  */
+#line 4459 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 383:
-#line 1740 "./util/configparser.y" /* yacc.c:1646  */
+#line 1742 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_local_zone:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "static")!=0 && strcmp((yyvsp[0].str), "deny")!=0 &&
@@ -4468,13 +4470,15 @@ yyreduce:
                   && strcmp((yyvsp[0].str), "always_refuse")!=0
                   && strcmp((yyvsp[0].str), "always_nxdomain")!=0
                   && strcmp((yyvsp[0].str), "noview")!=0
-                  && strcmp((yyvsp[0].str), "inform")!=0 && strcmp((yyvsp[0].str), "inform_deny")!=0)
+                  && strcmp((yyvsp[0].str), "inform")!=0 && strcmp((yyvsp[0].str), "inform_deny")!=0) {
                        yyerror("local-zone type: expected static, deny, "
                                "refuse, redirect, transparent, "
                                "typetransparent, inform, inform_deny, "
                                "always_transparent, always_refuse, "
                                "always_nxdomain, noview or nodefault");
-               else if(strcmp((yyvsp[0].str), "nodefault")==0) {
+                       free((yyvsp[-1].str));
+                       free((yyvsp[0].str));
+               } else if(strcmp((yyvsp[0].str), "nodefault")==0) {
                        if(!cfg_strlist_insert(&cfg_parser->cfg->
                                local_zones_nodefault, (yyvsp[-1].str)))
                                fatal_exit("out of memory adding local-zone");
@@ -4485,21 +4489,21 @@ yyreduce:
                                fatal_exit("out of memory adding local-zone");
                }
        }
-#line 4489 "util/configparser.c" /* yacc.c:1646  */
+#line 4493 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 384:
-#line 1769 "./util/configparser.y" /* yacc.c:1646  */
+#line 1773 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_local_data:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->local_data, (yyvsp[0].str)))
                        fatal_exit("out of memory adding local-data");
        }
-#line 4499 "util/configparser.c" /* yacc.c:1646  */
+#line 4503 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 385:
-#line 1776 "./util/configparser.y" /* yacc.c:1646  */
+#line 1780 "./util/configparser.y" /* yacc.c:1646  */
     {
                char* ptr;
                OUTYY(("P(server_local_data_ptr:%s)\n", (yyvsp[0].str)));
@@ -4513,11 +4517,11 @@ yyreduce:
                        yyerror("local-data-ptr could not be reversed");
                }
        }
-#line 4517 "util/configparser.c" /* yacc.c:1646  */
+#line 4521 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 386:
-#line 1791 "./util/configparser.y" /* yacc.c:1646  */
+#line 1795 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_minimal_responses:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4526,11 +4530,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4530 "util/configparser.c" /* yacc.c:1646  */
+#line 4534 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 387:
-#line 1801 "./util/configparser.y" /* yacc.c:1646  */
+#line 1805 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_rrset_roundrobin:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4539,41 +4543,41 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4543 "util/configparser.c" /* yacc.c:1646  */
+#line 4547 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 388:
-#line 1811 "./util/configparser.y" /* yacc.c:1646  */
+#line 1815 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_unknown_server_time_limit:%s)\n", (yyvsp[0].str)));
                cfg_parser->cfg->unknown_server_time_limit = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4553 "util/configparser.c" /* yacc.c:1646  */
+#line 4557 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 389:
-#line 1818 "./util/configparser.y" /* yacc.c:1646  */
+#line 1822 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_max_udp_size:%s)\n", (yyvsp[0].str)));
                cfg_parser->cfg->max_udp_size = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4563 "util/configparser.c" /* yacc.c:1646  */
+#line 4567 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 390:
-#line 1825 "./util/configparser.y" /* yacc.c:1646  */
+#line 1829 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(dns64_prefix:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->dns64_prefix);
                cfg_parser->cfg->dns64_prefix = (yyvsp[0].str);
        }
-#line 4573 "util/configparser.c" /* yacc.c:1646  */
+#line 4577 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 391:
-#line 1832 "./util/configparser.y" /* yacc.c:1646  */
+#line 1836 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_dns64_synthall:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4581,22 +4585,22 @@ yyreduce:
                else cfg_parser->cfg->dns64_synthall = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4585 "util/configparser.c" /* yacc.c:1646  */
+#line 4589 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 392:
-#line 1841 "./util/configparser.y" /* yacc.c:1646  */
+#line 1845 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(dns64_ignore_aaaa:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->dns64_ignore_aaaa,
                        (yyvsp[0].str)))
                        fatal_exit("out of memory adding dns64-ignore-aaaa");
        }
-#line 4596 "util/configparser.c" /* yacc.c:1646  */
+#line 4600 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 393:
-#line 1849 "./util/configparser.y" /* yacc.c:1646  */
+#line 1853 "./util/configparser.y" /* yacc.c:1646  */
     {
                char* p, *s = (yyvsp[0].str);
                OUTYY(("P(server_define_tag:%s)\n", (yyvsp[0].str)));
@@ -4609,19 +4613,21 @@ yyreduce:
                }
                free((yyvsp[0].str));
        }
-#line 4613 "util/configparser.c" /* yacc.c:1646  */
+#line 4617 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 394:
-#line 1863 "./util/configparser.y" /* yacc.c:1646  */
+#line 1867 "./util/configparser.y" /* yacc.c:1646  */
     {
                size_t len = 0;
                uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, (yyvsp[0].str),
                        &len);
                free((yyvsp[0].str));
                OUTYY(("P(server_local_zone_tag:%s)\n", (yyvsp[-1].str)));
-               if(!bitlist)
+               if(!bitlist) {
                        yyerror("could not parse tags, (define-tag them first)");
+                       free((yyvsp[-1].str));
+               }
                if(bitlist) {
                        if(!cfg_strbytelist_insert(
                                &cfg_parser->cfg->local_zone_tags,
@@ -4631,19 +4637,21 @@ yyreduce:
                        }
                }
        }
-#line 4635 "util/configparser.c" /* yacc.c:1646  */
+#line 4641 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 395:
-#line 1882 "./util/configparser.y" /* yacc.c:1646  */
+#line 1888 "./util/configparser.y" /* yacc.c:1646  */
     {
                size_t len = 0;
                uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, (yyvsp[0].str),
                        &len);
                free((yyvsp[0].str));
                OUTYY(("P(server_access_control_tag:%s)\n", (yyvsp[-1].str)));
-               if(!bitlist)
+               if(!bitlist) {
                        yyerror("could not parse tags, (define-tag them first)");
+                       free((yyvsp[-1].str));
+               }
                if(bitlist) {
                        if(!cfg_strbytelist_insert(
                                &cfg_parser->cfg->acl_tags,
@@ -4653,11 +4661,11 @@ yyreduce:
                        }
                }
        }
-#line 4657 "util/configparser.c" /* yacc.c:1646  */
+#line 4665 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 396:
-#line 1901 "./util/configparser.y" /* yacc.c:1646  */
+#line 1909 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_access_control_tag_action:%s %s %s)\n", (yyvsp[-2].str), (yyvsp[-1].str), (yyvsp[0].str)));
                if(!cfg_str3list_insert(&cfg_parser->cfg->acl_tag_actions,
@@ -4668,11 +4676,11 @@ yyreduce:
                        free((yyvsp[0].str));
                }
        }
-#line 4672 "util/configparser.c" /* yacc.c:1646  */
+#line 4680 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 397:
-#line 1913 "./util/configparser.y" /* yacc.c:1646  */
+#line 1921 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_access_control_tag_data:%s %s %s)\n", (yyvsp[-2].str), (yyvsp[-1].str), (yyvsp[0].str)));
                if(!cfg_str3list_insert(&cfg_parser->cfg->acl_tag_datas,
@@ -4683,11 +4691,11 @@ yyreduce:
                        free((yyvsp[0].str));
                }
        }
-#line 4687 "util/configparser.c" /* yacc.c:1646  */
+#line 4695 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 398:
-#line 1925 "./util/configparser.y" /* yacc.c:1646  */
+#line 1933 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_local_zone_override:%s %s %s)\n", (yyvsp[-2].str), (yyvsp[-1].str), (yyvsp[0].str)));
                if(!cfg_str3list_insert(&cfg_parser->cfg->local_zone_overrides,
@@ -4698,33 +4706,33 @@ yyreduce:
                        free((yyvsp[0].str));
                }
        }
-#line 4702 "util/configparser.c" /* yacc.c:1646  */
+#line 4710 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 399:
-#line 1937 "./util/configparser.y" /* yacc.c:1646  */
+#line 1945 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_access_control_view:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
                if(!cfg_str2list_insert(&cfg_parser->cfg->acl_view,
                        (yyvsp[-1].str), (yyvsp[0].str))) {
                        yyerror("out of memory");
-                       free((yyvsp[-1].str));
-                       free((yyvsp[0].str));
                }
        }
-#line 4716 "util/configparser.c" /* yacc.c:1646  */
+#line 4722 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 400:
-#line 1948 "./util/configparser.y" /* yacc.c:1646  */
+#line 1954 "./util/configparser.y" /* yacc.c:1646  */
     {
                size_t len = 0;
                uint8_t* bitlist = config_parse_taglist(cfg_parser->cfg, (yyvsp[0].str),
                        &len);
                free((yyvsp[0].str));
                OUTYY(("P(response_ip_tag:%s)\n", (yyvsp[-1].str)));
-               if(!bitlist)
+               if(!bitlist) {
                        yyerror("could not parse tags, (define-tag them first)");
+                       free((yyvsp[-1].str));
+               }
                if(bitlist) {
                        if(!cfg_strbytelist_insert(
                                &cfg_parser->cfg->respip_tags,
@@ -4734,11 +4742,11 @@ yyreduce:
                        }
                }
        }
-#line 4738 "util/configparser.c" /* yacc.c:1646  */
+#line 4746 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 401:
-#line 1967 "./util/configparser.y" /* yacc.c:1646  */
+#line 1975 "./util/configparser.y" /* yacc.c:1646  */
     { 
                OUTYY(("P(server_ip_ratelimit:%s)\n", (yyvsp[0].str))); 
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4746,11 +4754,11 @@ yyreduce:
                else cfg_parser->cfg->ip_ratelimit = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4750 "util/configparser.c" /* yacc.c:1646  */
+#line 4758 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 402:
-#line 1977 "./util/configparser.y" /* yacc.c:1646  */
+#line 1985 "./util/configparser.y" /* yacc.c:1646  */
     { 
                OUTYY(("P(server_ratelimit:%s)\n", (yyvsp[0].str))); 
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4758,33 +4766,33 @@ yyreduce:
                else cfg_parser->cfg->ratelimit = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4762 "util/configparser.c" /* yacc.c:1646  */
+#line 4770 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 403:
-#line 1986 "./util/configparser.y" /* yacc.c:1646  */
+#line 1994 "./util/configparser.y" /* yacc.c:1646  */
     {
        OUTYY(("P(server_ip_ratelimit_size:%s)\n", (yyvsp[0].str)));
        if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->ip_ratelimit_size))
                yyerror("memory size expected");
        free((yyvsp[0].str));
   }
-#line 4773 "util/configparser.c" /* yacc.c:1646  */
+#line 4781 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 404:
-#line 1994 "./util/configparser.y" /* yacc.c:1646  */
+#line 2002 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_ratelimit_size:%s)\n", (yyvsp[0].str)));
                if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->ratelimit_size))
                        yyerror("memory size expected");
                free((yyvsp[0].str));
        }
-#line 4784 "util/configparser.c" /* yacc.c:1646  */
+#line 4792 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 405:
-#line 2002 "./util/configparser.y" /* yacc.c:1646  */
+#line 2010 "./util/configparser.y" /* yacc.c:1646  */
     {
        OUTYY(("P(server_ip_ratelimit_slabs:%s)\n", (yyvsp[0].str)));
        if(atoi((yyvsp[0].str)) == 0)
@@ -4796,11 +4804,11 @@ yyreduce:
        }
        free((yyvsp[0].str));
   }
-#line 4800 "util/configparser.c" /* yacc.c:1646  */
+#line 4808 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 406:
-#line 2015 "./util/configparser.y" /* yacc.c:1646  */
+#line 2023 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_ratelimit_slabs:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0)
@@ -4812,15 +4820,17 @@ yyreduce:
                }
                free((yyvsp[0].str));
        }
-#line 4816 "util/configparser.c" /* yacc.c:1646  */
+#line 4824 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 407:
-#line 2028 "./util/configparser.y" /* yacc.c:1646  */
+#line 2036 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_ratelimit_for_domain:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) {
                        yyerror("number expected");
+                       free((yyvsp[-1].str));
+                       free((yyvsp[0].str));
                } else {
                        if(!cfg_str2list_insert(&cfg_parser->cfg->
                                ratelimit_for_domain, (yyvsp[-1].str), (yyvsp[0].str)))
@@ -4828,15 +4838,17 @@ yyreduce:
                                        "ratelimit-for-domain");
                }
        }
-#line 4832 "util/configparser.c" /* yacc.c:1646  */
+#line 4842 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 408:
-#line 2041 "./util/configparser.y" /* yacc.c:1646  */
+#line 2051 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_ratelimit_below_domain:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0) {
                        yyerror("number expected");
+                       free((yyvsp[-1].str));
+                       free((yyvsp[0].str));
                } else {
                        if(!cfg_str2list_insert(&cfg_parser->cfg->
                                ratelimit_below_domain, (yyvsp[-1].str), (yyvsp[0].str)))
@@ -4844,11 +4856,11 @@ yyreduce:
                                        "ratelimit-below-domain");
                }
        }
-#line 4848 "util/configparser.c" /* yacc.c:1646  */
+#line 4860 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 409:
-#line 2054 "./util/configparser.y" /* yacc.c:1646  */
+#line 2066 "./util/configparser.y" /* yacc.c:1646  */
     { 
        OUTYY(("P(server_ip_ratelimit_factor:%s)\n", (yyvsp[0].str))); 
        if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4856,11 +4868,11 @@ yyreduce:
        else cfg_parser->cfg->ip_ratelimit_factor = atoi((yyvsp[0].str));
        free((yyvsp[0].str));
        }
-#line 4860 "util/configparser.c" /* yacc.c:1646  */
+#line 4872 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 410:
-#line 2063 "./util/configparser.y" /* yacc.c:1646  */
+#line 2075 "./util/configparser.y" /* yacc.c:1646  */
     { 
                OUTYY(("P(server_ratelimit_factor:%s)\n", (yyvsp[0].str))); 
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4868,20 +4880,20 @@ yyreduce:
                else cfg_parser->cfg->ratelimit_factor = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4872 "util/configparser.c" /* yacc.c:1646  */
+#line 4884 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 411:
-#line 2072 "./util/configparser.y" /* yacc.c:1646  */
+#line 2084 "./util/configparser.y" /* yacc.c:1646  */
     { 
                OUTYY(("P(low-rtt option is deprecated, use fast-server-num instead)\n"));
                free((yyvsp[0].str));
        }
-#line 4881 "util/configparser.c" /* yacc.c:1646  */
+#line 4893 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 412:
-#line 2078 "./util/configparser.y" /* yacc.c:1646  */
+#line 2090 "./util/configparser.y" /* yacc.c:1646  */
     { 
                OUTYY(("P(server_fast_server_num:%s)\n", (yyvsp[0].str))); 
                if(atoi((yyvsp[0].str)) <= 0)
@@ -4889,11 +4901,11 @@ yyreduce:
                else cfg_parser->cfg->fast_server_num = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4893 "util/configparser.c" /* yacc.c:1646  */
+#line 4905 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 413:
-#line 2087 "./util/configparser.y" /* yacc.c:1646  */
+#line 2099 "./util/configparser.y" /* yacc.c:1646  */
     { 
                OUTYY(("P(server_fast_server_permil:%s)\n", (yyvsp[0].str))); 
                if(atoi((yyvsp[0].str)) == 0 && strcmp((yyvsp[0].str), "0") != 0)
@@ -4901,11 +4913,11 @@ yyreduce:
                else cfg_parser->cfg->fast_server_permil = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 4905 "util/configparser.c" /* yacc.c:1646  */
+#line 4917 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 414:
-#line 2096 "./util/configparser.y" /* yacc.c:1646  */
+#line 2108 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_qname_minimisation:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4914,11 +4926,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4918 "util/configparser.c" /* yacc.c:1646  */
+#line 4930 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 415:
-#line 2106 "./util/configparser.y" /* yacc.c:1646  */
+#line 2118 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_qname_minimisation_strict:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -4927,43 +4939,43 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 4931 "util/configparser.c" /* yacc.c:1646  */
+#line 4943 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 416:
-#line 2116 "./util/configparser.y" /* yacc.c:1646  */
+#line 2128 "./util/configparser.y" /* yacc.c:1646  */
     {
        #ifdef USE_IPSECMOD
                OUTYY(("P(server_ipsecmod_enabled:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
                        yyerror("expected yes or no.");
                else cfg_parser->cfg->ipsecmod_enabled = (strcmp((yyvsp[0].str), "yes")==0);
-               free((yyvsp[0].str));
        #else
                OUTYY(("P(Compiled without IPsec module, ignoring)\n"));
        #endif
+               free((yyvsp[0].str));
        }
-#line 4947 "util/configparser.c" /* yacc.c:1646  */
+#line 4959 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 417:
-#line 2129 "./util/configparser.y" /* yacc.c:1646  */
+#line 2141 "./util/configparser.y" /* yacc.c:1646  */
     {
        #ifdef USE_IPSECMOD
                OUTYY(("P(server_ipsecmod_ignore_bogus:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
                        yyerror("expected yes or no.");
                else cfg_parser->cfg->ipsecmod_ignore_bogus = (strcmp((yyvsp[0].str), "yes")==0);
-               free((yyvsp[0].str));
        #else
                OUTYY(("P(Compiled without IPsec module, ignoring)\n"));
        #endif
+               free((yyvsp[0].str));
        }
-#line 4963 "util/configparser.c" /* yacc.c:1646  */
+#line 4975 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 418:
-#line 2142 "./util/configparser.y" /* yacc.c:1646  */
+#line 2154 "./util/configparser.y" /* yacc.c:1646  */
     {
        #ifdef USE_IPSECMOD
                OUTYY(("P(server_ipsecmod_hook:%s)\n", (yyvsp[0].str)));
@@ -4971,13 +4983,14 @@ yyreduce:
                cfg_parser->cfg->ipsecmod_hook = (yyvsp[0].str);
        #else
                OUTYY(("P(Compiled without IPsec module, ignoring)\n"));
+               free((yyvsp[0].str));
        #endif
        }
-#line 4977 "util/configparser.c" /* yacc.c:1646  */
+#line 4990 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 419:
-#line 2153 "./util/configparser.y" /* yacc.c:1646  */
+#line 2166 "./util/configparser.y" /* yacc.c:1646  */
     {
        #ifdef USE_IPSECMOD
                OUTYY(("P(server_ipsecmod_max_ttl:%s)\n", (yyvsp[0].str)));
@@ -4987,13 +5000,14 @@ yyreduce:
                free((yyvsp[0].str));
        #else
                OUTYY(("P(Compiled without IPsec module, ignoring)\n"));
+               free((yyvsp[0].str));
        #endif
        }
-#line 4993 "util/configparser.c" /* yacc.c:1646  */
+#line 5007 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 420:
-#line 2166 "./util/configparser.y" /* yacc.c:1646  */
+#line 2180 "./util/configparser.y" /* yacc.c:1646  */
     {
        #ifdef USE_IPSECMOD
                OUTYY(("P(server_ipsecmod_whitelist:%s)\n", (yyvsp[0].str)));
@@ -5001,13 +5015,14 @@ yyreduce:
                        yyerror("out of memory");
        #else
                OUTYY(("P(Compiled without IPsec module, ignoring)\n"));
+               free((yyvsp[0].str));
        #endif
        }
-#line 5007 "util/configparser.c" /* yacc.c:1646  */
+#line 5022 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 421:
-#line 2177 "./util/configparser.y" /* yacc.c:1646  */
+#line 2192 "./util/configparser.y" /* yacc.c:1646  */
     {
        #ifdef USE_IPSECMOD
                OUTYY(("P(server_ipsecmod_strict:%s)\n", (yyvsp[0].str)));
@@ -5017,13 +5032,14 @@ yyreduce:
                free((yyvsp[0].str));
        #else
                OUTYY(("P(Compiled without IPsec module, ignoring)\n"));
+               free((yyvsp[0].str));
        #endif
        }
-#line 5023 "util/configparser.c" /* yacc.c:1646  */
+#line 5039 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 422:
-#line 2190 "./util/configparser.y" /* yacc.c:1646  */
+#line 2206 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(name:%s)\n", (yyvsp[0].str)));
                if(cfg_parser->cfg->stubs->name)
@@ -5032,31 +5048,31 @@ yyreduce:
                free(cfg_parser->cfg->stubs->name);
                cfg_parser->cfg->stubs->name = (yyvsp[0].str);
        }
-#line 5036 "util/configparser.c" /* yacc.c:1646  */
+#line 5052 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 423:
-#line 2200 "./util/configparser.y" /* yacc.c:1646  */
+#line 2216 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(stub-host:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->hosts, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 5046 "util/configparser.c" /* yacc.c:1646  */
+#line 5062 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 424:
-#line 2207 "./util/configparser.y" /* yacc.c:1646  */
+#line 2223 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(stub-addr:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->stubs->addrs, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 5056 "util/configparser.c" /* yacc.c:1646  */
+#line 5072 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 425:
-#line 2214 "./util/configparser.y" /* yacc.c:1646  */
+#line 2230 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(stub-first:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5064,11 +5080,11 @@ yyreduce:
                else cfg_parser->cfg->stubs->isfirst=(strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5068 "util/configparser.c" /* yacc.c:1646  */
+#line 5084 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 426:
-#line 2223 "./util/configparser.y" /* yacc.c:1646  */
+#line 2239 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(stub-no-cache:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5076,11 +5092,11 @@ yyreduce:
                else cfg_parser->cfg->stubs->no_cache=(strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5080 "util/configparser.c" /* yacc.c:1646  */
+#line 5096 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 427:
-#line 2232 "./util/configparser.y" /* yacc.c:1646  */
+#line 2248 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(stub-ssl-upstream:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5089,11 +5105,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5093 "util/configparser.c" /* yacc.c:1646  */
+#line 5109 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 428:
-#line 2242 "./util/configparser.y" /* yacc.c:1646  */
+#line 2258 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(stub-prime:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5102,11 +5118,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5106 "util/configparser.c" /* yacc.c:1646  */
+#line 5122 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 429:
-#line 2252 "./util/configparser.y" /* yacc.c:1646  */
+#line 2268 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(name:%s)\n", (yyvsp[0].str)));
                if(cfg_parser->cfg->forwards->name)
@@ -5115,31 +5131,31 @@ yyreduce:
                free(cfg_parser->cfg->forwards->name);
                cfg_parser->cfg->forwards->name = (yyvsp[0].str);
        }
-#line 5119 "util/configparser.c" /* yacc.c:1646  */
+#line 5135 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 430:
-#line 2262 "./util/configparser.y" /* yacc.c:1646  */
+#line 2278 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(forward-host:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->hosts, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 5129 "util/configparser.c" /* yacc.c:1646  */
+#line 5145 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 431:
-#line 2269 "./util/configparser.y" /* yacc.c:1646  */
+#line 2285 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(forward-addr:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->forwards->addrs, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 5139 "util/configparser.c" /* yacc.c:1646  */
+#line 5155 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 432:
-#line 2276 "./util/configparser.y" /* yacc.c:1646  */
+#line 2292 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(forward-first:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5147,11 +5163,11 @@ yyreduce:
                else cfg_parser->cfg->forwards->isfirst=(strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5151 "util/configparser.c" /* yacc.c:1646  */
+#line 5167 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 433:
-#line 2285 "./util/configparser.y" /* yacc.c:1646  */
+#line 2301 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(forward-no-cache:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5159,11 +5175,11 @@ yyreduce:
                else cfg_parser->cfg->forwards->no_cache=(strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5163 "util/configparser.c" /* yacc.c:1646  */
+#line 5179 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 434:
-#line 2294 "./util/configparser.y" /* yacc.c:1646  */
+#line 2310 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(forward-ssl-upstream:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5172,11 +5188,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5176 "util/configparser.c" /* yacc.c:1646  */
+#line 5192 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 435:
-#line 2304 "./util/configparser.y" /* yacc.c:1646  */
+#line 2320 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(name:%s)\n", (yyvsp[0].str)));
                if(cfg_parser->cfg->auths->name)
@@ -5185,52 +5201,52 @@ yyreduce:
                free(cfg_parser->cfg->auths->name);
                cfg_parser->cfg->auths->name = (yyvsp[0].str);
        }
-#line 5189 "util/configparser.c" /* yacc.c:1646  */
+#line 5205 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 436:
-#line 2314 "./util/configparser.y" /* yacc.c:1646  */
+#line 2330 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(zonefile:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->auths->zonefile);
                cfg_parser->cfg->auths->zonefile = (yyvsp[0].str);
        }
-#line 5199 "util/configparser.c" /* yacc.c:1646  */
+#line 5215 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 437:
-#line 2321 "./util/configparser.y" /* yacc.c:1646  */
+#line 2337 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(master:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->auths->masters, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 5209 "util/configparser.c" /* yacc.c:1646  */
+#line 5225 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 438:
-#line 2328 "./util/configparser.y" /* yacc.c:1646  */
+#line 2344 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(url:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->auths->urls, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 5219 "util/configparser.c" /* yacc.c:1646  */
+#line 5235 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 439:
-#line 2335 "./util/configparser.y" /* yacc.c:1646  */
+#line 2351 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(allow-notify:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->auths->allow_notify,
                        (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 5230 "util/configparser.c" /* yacc.c:1646  */
+#line 5246 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 440:
-#line 2343 "./util/configparser.y" /* yacc.c:1646  */
+#line 2359 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(for-downstream:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5239,11 +5255,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5243 "util/configparser.c" /* yacc.c:1646  */
+#line 5259 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 441:
-#line 2353 "./util/configparser.y" /* yacc.c:1646  */
+#line 2369 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(for-upstream:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5252,11 +5268,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5256 "util/configparser.c" /* yacc.c:1646  */
+#line 5272 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 442:
-#line 2363 "./util/configparser.y" /* yacc.c:1646  */
+#line 2379 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(fallback-enabled:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5265,11 +5281,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5269 "util/configparser.c" /* yacc.c:1646  */
+#line 5285 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 443:
-#line 2373 "./util/configparser.y" /* yacc.c:1646  */
+#line 2389 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(name:%s)\n", (yyvsp[0].str)));
                if(cfg_parser->cfg->views->name)
@@ -5278,11 +5294,11 @@ yyreduce:
                free(cfg_parser->cfg->views->name);
                cfg_parser->cfg->views->name = (yyvsp[0].str);
        }
-#line 5282 "util/configparser.c" /* yacc.c:1646  */
+#line 5298 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 444:
-#line 2383 "./util/configparser.y" /* yacc.c:1646  */
+#line 2399 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(view_local_zone:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "static")!=0 && strcmp((yyvsp[0].str), "deny")!=0 &&
@@ -5293,13 +5309,15 @@ yyreduce:
                   && strcmp((yyvsp[0].str), "always_refuse")!=0
                   && strcmp((yyvsp[0].str), "always_nxdomain")!=0
                   && strcmp((yyvsp[0].str), "noview")!=0
-                  && strcmp((yyvsp[0].str), "inform")!=0 && strcmp((yyvsp[0].str), "inform_deny")!=0)
+                  && strcmp((yyvsp[0].str), "inform")!=0 && strcmp((yyvsp[0].str), "inform_deny")!=0) {
                        yyerror("local-zone type: expected static, deny, "
                                "refuse, redirect, transparent, "
                                "typetransparent, inform, inform_deny, "
                                "always_transparent, always_refuse, "
                                "always_nxdomain, noview or nodefault");
-               else if(strcmp((yyvsp[0].str), "nodefault")==0) {
+                       free((yyvsp[-1].str));
+                       free((yyvsp[0].str));
+               } else if(strcmp((yyvsp[0].str), "nodefault")==0) {
                        if(!cfg_strlist_insert(&cfg_parser->cfg->views->
                                local_zones_nodefault, (yyvsp[-1].str)))
                                fatal_exit("out of memory adding local-zone");
@@ -5311,11 +5329,11 @@ yyreduce:
                                fatal_exit("out of memory adding local-zone");
                }
        }
-#line 5315 "util/configparser.c" /* yacc.c:1646  */
+#line 5333 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 445:
-#line 2413 "./util/configparser.y" /* yacc.c:1646  */
+#line 2431 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(view_response_ip:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
                validate_respip_action((yyvsp[0].str));
@@ -5324,34 +5342,33 @@ yyreduce:
                        fatal_exit("out of memory adding per-view "
                                "response-ip action");
        }
-#line 5328 "util/configparser.c" /* yacc.c:1646  */
+#line 5346 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 446:
-#line 2423 "./util/configparser.y" /* yacc.c:1646  */
+#line 2441 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(view_response_ip_data:%s)\n", (yyvsp[-1].str)));
                if(!cfg_str2list_insert(
                        &cfg_parser->cfg->views->respip_data, (yyvsp[-1].str), (yyvsp[0].str)))
                        fatal_exit("out of memory adding response-ip-data");
        }
-#line 5339 "util/configparser.c" /* yacc.c:1646  */
+#line 5357 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 447:
-#line 2431 "./util/configparser.y" /* yacc.c:1646  */
+#line 2449 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(view_local_data:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->views->local_data, (yyvsp[0].str))) {
                        fatal_exit("out of memory adding local-data");
-                       free((yyvsp[0].str));
                }
        }
-#line 5351 "util/configparser.c" /* yacc.c:1646  */
+#line 5368 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 448:
-#line 2440 "./util/configparser.y" /* yacc.c:1646  */
+#line 2457 "./util/configparser.y" /* yacc.c:1646  */
     {
                char* ptr;
                OUTYY(("P(view_local_data_ptr:%s)\n", (yyvsp[0].str)));
@@ -5365,11 +5382,11 @@ yyreduce:
                        yyerror("local-data-ptr could not be reversed");
                }
        }
-#line 5369 "util/configparser.c" /* yacc.c:1646  */
+#line 5386 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 449:
-#line 2455 "./util/configparser.y" /* yacc.c:1646  */
+#line 2472 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(view-first:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5377,19 +5394,19 @@ yyreduce:
                else cfg_parser->cfg->views->isfirst=(strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5381 "util/configparser.c" /* yacc.c:1646  */
+#line 5398 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 450:
-#line 2464 "./util/configparser.y" /* yacc.c:1646  */
+#line 2481 "./util/configparser.y" /* yacc.c:1646  */
     { 
                OUTYY(("\nP(remote-control:)\n")); 
        }
-#line 5389 "util/configparser.c" /* yacc.c:1646  */
+#line 5406 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 461:
-#line 2475 "./util/configparser.y" /* yacc.c:1646  */
+#line 2492 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(control_enable:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5398,11 +5415,11 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5402 "util/configparser.c" /* yacc.c:1646  */
+#line 5419 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 462:
-#line 2485 "./util/configparser.y" /* yacc.c:1646  */
+#line 2502 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(control_port:%s)\n", (yyvsp[0].str)));
                if(atoi((yyvsp[0].str)) == 0)
@@ -5410,232 +5427,241 @@ yyreduce:
                else cfg_parser->cfg->control_port = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 5414 "util/configparser.c" /* yacc.c:1646  */
+#line 5431 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 463:
-#line 2494 "./util/configparser.y" /* yacc.c:1646  */
+#line 2511 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(control_interface:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_append(&cfg_parser->cfg->control_ifs, (yyvsp[0].str)))
                        yyerror("out of memory");
        }
-#line 5424 "util/configparser.c" /* yacc.c:1646  */
+#line 5441 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 464:
-#line 2501 "./util/configparser.y" /* yacc.c:1646  */
+#line 2518 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(control_use_cert:%s)\n", (yyvsp[0].str)));
                cfg_parser->cfg->control_use_cert = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5434 "util/configparser.c" /* yacc.c:1646  */
+#line 5451 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 465:
-#line 2508 "./util/configparser.y" /* yacc.c:1646  */
+#line 2525 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(rc_server_key_file:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->server_key_file);
                cfg_parser->cfg->server_key_file = (yyvsp[0].str);
        }
-#line 5444 "util/configparser.c" /* yacc.c:1646  */
+#line 5461 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 466:
-#line 2515 "./util/configparser.y" /* yacc.c:1646  */
+#line 2532 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(rc_server_cert_file:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->server_cert_file);
                cfg_parser->cfg->server_cert_file = (yyvsp[0].str);
        }
-#line 5454 "util/configparser.c" /* yacc.c:1646  */
+#line 5471 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 467:
-#line 2522 "./util/configparser.y" /* yacc.c:1646  */
+#line 2539 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(rc_control_key_file:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->control_key_file);
                cfg_parser->cfg->control_key_file = (yyvsp[0].str);
        }
-#line 5464 "util/configparser.c" /* yacc.c:1646  */
+#line 5481 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 468:
-#line 2529 "./util/configparser.y" /* yacc.c:1646  */
+#line 2546 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(rc_control_cert_file:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->control_cert_file);
                cfg_parser->cfg->control_cert_file = (yyvsp[0].str);
        }
-#line 5474 "util/configparser.c" /* yacc.c:1646  */
+#line 5491 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 469:
-#line 2536 "./util/configparser.y" /* yacc.c:1646  */
+#line 2553 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("\nP(dnstap:)\n"));
        }
-#line 5482 "util/configparser.c" /* yacc.c:1646  */
+#line 5499 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 484:
-#line 2553 "./util/configparser.y" /* yacc.c:1646  */
+#line 2570 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(dt_dnstap_enable:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
                        yyerror("expected yes or no.");
                else cfg_parser->cfg->dnstap = (strcmp((yyvsp[0].str), "yes")==0);
+               free((yyvsp[0].str));
        }
-#line 5493 "util/configparser.c" /* yacc.c:1646  */
+#line 5511 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 485:
-#line 2561 "./util/configparser.y" /* yacc.c:1646  */
+#line 2579 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(dt_dnstap_socket_path:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->dnstap_socket_path);
                cfg_parser->cfg->dnstap_socket_path = (yyvsp[0].str);
        }
-#line 5503 "util/configparser.c" /* yacc.c:1646  */
+#line 5521 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 486:
-#line 2568 "./util/configparser.y" /* yacc.c:1646  */
+#line 2586 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(dt_dnstap_send_identity:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
                        yyerror("expected yes or no.");
                else cfg_parser->cfg->dnstap_send_identity = (strcmp((yyvsp[0].str), "yes")==0);
+               free((yyvsp[0].str));
        }
-#line 5514 "util/configparser.c" /* yacc.c:1646  */
+#line 5533 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 487:
-#line 2576 "./util/configparser.y" /* yacc.c:1646  */
+#line 2595 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(dt_dnstap_send_version:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
                        yyerror("expected yes or no.");
                else cfg_parser->cfg->dnstap_send_version = (strcmp((yyvsp[0].str), "yes")==0);
+               free((yyvsp[0].str));
        }
-#line 5525 "util/configparser.c" /* yacc.c:1646  */
+#line 5545 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 488:
-#line 2584 "./util/configparser.y" /* yacc.c:1646  */
+#line 2604 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(dt_dnstap_identity:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->dnstap_identity);
                cfg_parser->cfg->dnstap_identity = (yyvsp[0].str);
        }
-#line 5535 "util/configparser.c" /* yacc.c:1646  */
+#line 5555 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 489:
-#line 2591 "./util/configparser.y" /* yacc.c:1646  */
+#line 2611 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(dt_dnstap_version:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->dnstap_version);
                cfg_parser->cfg->dnstap_version = (yyvsp[0].str);
        }
-#line 5545 "util/configparser.c" /* yacc.c:1646  */
+#line 5565 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 490:
-#line 2598 "./util/configparser.y" /* yacc.c:1646  */
+#line 2618 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(dt_dnstap_log_resolver_query_messages:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
                        yyerror("expected yes or no.");
                else cfg_parser->cfg->dnstap_log_resolver_query_messages =
                        (strcmp((yyvsp[0].str), "yes")==0);
+               free((yyvsp[0].str));
        }
-#line 5557 "util/configparser.c" /* yacc.c:1646  */
+#line 5578 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 491:
-#line 2607 "./util/configparser.y" /* yacc.c:1646  */
+#line 2628 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(dt_dnstap_log_resolver_response_messages:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
                        yyerror("expected yes or no.");
                else cfg_parser->cfg->dnstap_log_resolver_response_messages =
                        (strcmp((yyvsp[0].str), "yes")==0);
+               free((yyvsp[0].str));
        }
-#line 5569 "util/configparser.c" /* yacc.c:1646  */
+#line 5591 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 492:
-#line 2616 "./util/configparser.y" /* yacc.c:1646  */
+#line 2638 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(dt_dnstap_log_client_query_messages:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
                        yyerror("expected yes or no.");
                else cfg_parser->cfg->dnstap_log_client_query_messages =
                        (strcmp((yyvsp[0].str), "yes")==0);
+               free((yyvsp[0].str));
        }
-#line 5581 "util/configparser.c" /* yacc.c:1646  */
+#line 5604 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 493:
-#line 2625 "./util/configparser.y" /* yacc.c:1646  */
+#line 2648 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(dt_dnstap_log_client_response_messages:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
                        yyerror("expected yes or no.");
                else cfg_parser->cfg->dnstap_log_client_response_messages =
                        (strcmp((yyvsp[0].str), "yes")==0);
+               free((yyvsp[0].str));
        }
-#line 5593 "util/configparser.c" /* yacc.c:1646  */
+#line 5617 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 494:
-#line 2634 "./util/configparser.y" /* yacc.c:1646  */
+#line 2658 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(dt_dnstap_log_forwarder_query_messages:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
                        yyerror("expected yes or no.");
                else cfg_parser->cfg->dnstap_log_forwarder_query_messages =
                        (strcmp((yyvsp[0].str), "yes")==0);
+               free((yyvsp[0].str));
        }
-#line 5605 "util/configparser.c" /* yacc.c:1646  */
+#line 5630 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 495:
-#line 2643 "./util/configparser.y" /* yacc.c:1646  */
+#line 2668 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(dt_dnstap_log_forwarder_response_messages:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
                        yyerror("expected yes or no.");
                else cfg_parser->cfg->dnstap_log_forwarder_response_messages =
                        (strcmp((yyvsp[0].str), "yes")==0);
+               free((yyvsp[0].str));
        }
-#line 5617 "util/configparser.c" /* yacc.c:1646  */
+#line 5643 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 496:
-#line 2652 "./util/configparser.y" /* yacc.c:1646  */
+#line 2678 "./util/configparser.y" /* yacc.c:1646  */
     { 
                OUTYY(("\nP(python:)\n")); 
        }
-#line 5625 "util/configparser.c" /* yacc.c:1646  */
+#line 5651 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 500:
-#line 2661 "./util/configparser.y" /* yacc.c:1646  */
+#line 2687 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(python-script:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->python_script);
                cfg_parser->cfg->python_script = (yyvsp[0].str);
        }
-#line 5635 "util/configparser.c" /* yacc.c:1646  */
+#line 5661 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 501:
-#line 2667 "./util/configparser.y" /* yacc.c:1646  */
+#line 2693 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(disable_dnssec_lame_check:%s)\n", (yyvsp[0].str)));
                if (strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5644,21 +5670,21 @@ yyreduce:
                        (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5648 "util/configparser.c" /* yacc.c:1646  */
+#line 5674 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 502:
-#line 2677 "./util/configparser.y" /* yacc.c:1646  */
+#line 2703 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_log_identity:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->log_identity);
                cfg_parser->cfg->log_identity = (yyvsp[0].str);
        }
-#line 5658 "util/configparser.c" /* yacc.c:1646  */
+#line 5684 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 503:
-#line 2684 "./util/configparser.y" /* yacc.c:1646  */
+#line 2710 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_response_ip:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
                validate_respip_action((yyvsp[0].str));
@@ -5666,31 +5692,30 @@ yyreduce:
                        (yyvsp[-1].str), (yyvsp[0].str)))
                        fatal_exit("out of memory adding response-ip");
        }
-#line 5670 "util/configparser.c" /* yacc.c:1646  */
+#line 5696 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 504:
-#line 2693 "./util/configparser.y" /* yacc.c:1646  */
+#line 2719 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_response_ip_data:%s)\n", (yyvsp[-1].str)));
-                       if(!cfg_str2list_insert(&cfg_parser->cfg->respip_data,
-                               (yyvsp[-1].str), (yyvsp[0].str)))
-                               fatal_exit("out of memory adding response-ip-data");
+               if(!cfg_str2list_insert(&cfg_parser->cfg->respip_data,
+                       (yyvsp[-1].str), (yyvsp[0].str)))
+                       fatal_exit("out of memory adding response-ip-data");
        }
-#line 5681 "util/configparser.c" /* yacc.c:1646  */
+#line 5707 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 505:
-#line 2701 "./util/configparser.y" /* yacc.c:1646  */
+#line 2727 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("\nP(dnscrypt:)\n"));
-               OUTYY(("\nP(dnscrypt:)\n"));
        }
-#line 5690 "util/configparser.c" /* yacc.c:1646  */
+#line 5715 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 518:
-#line 2718 "./util/configparser.y" /* yacc.c:1646  */
+#line 2743 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(dnsc_dnscrypt_enable:%s)\n", (yyvsp[0].str)));
                if(strcmp((yyvsp[0].str), "yes") != 0 && strcmp((yyvsp[0].str), "no") != 0)
@@ -5698,34 +5723,33 @@ yyreduce:
                else cfg_parser->cfg->dnscrypt = (strcmp((yyvsp[0].str), "yes")==0);
                free((yyvsp[0].str));
        }
-#line 5702 "util/configparser.c" /* yacc.c:1646  */
+#line 5727 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 519:
-#line 2728 "./util/configparser.y" /* yacc.c:1646  */
+#line 2753 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(dnsc_dnscrypt_port:%s)\n", (yyvsp[0].str)));
-
                if(atoi((yyvsp[0].str)) == 0)
                        yyerror("port number expected");
                else cfg_parser->cfg->dnscrypt_port = atoi((yyvsp[0].str));
                free((yyvsp[0].str));
        }
-#line 5715 "util/configparser.c" /* yacc.c:1646  */
+#line 5739 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 520:
-#line 2738 "./util/configparser.y" /* yacc.c:1646  */
+#line 2762 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(dnsc_dnscrypt_provider:%s)\n", (yyvsp[0].str)));
                free(cfg_parser->cfg->dnscrypt_provider);
                cfg_parser->cfg->dnscrypt_provider = (yyvsp[0].str);
        }
-#line 5725 "util/configparser.c" /* yacc.c:1646  */
+#line 5749 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 521:
-#line 2745 "./util/configparser.y" /* yacc.c:1646  */
+#line 2769 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(dnsc_dnscrypt_provider_cert:%s)\n", (yyvsp[0].str)));
                if(cfg_strlist_find(cfg_parser->cfg->dnscrypt_provider_cert, (yyvsp[0].str)))
@@ -5733,21 +5757,21 @@ yyreduce:
                if(!cfg_strlist_insert(&cfg_parser->cfg->dnscrypt_provider_cert, (yyvsp[0].str)))
                        fatal_exit("out of memory adding dnscrypt-provider-cert");
        }
-#line 5737 "util/configparser.c" /* yacc.c:1646  */
+#line 5761 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 522:
-#line 2754 "./util/configparser.y" /* yacc.c:1646  */
+#line 2778 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(dnsc_dnscrypt_provider_cert_rotated:%s)\n", (yyvsp[0].str)));
                if(!cfg_strlist_insert(&cfg_parser->cfg->dnscrypt_provider_cert_rotated, (yyvsp[0].str)))
                        fatal_exit("out of memory adding dnscrypt-provider-cert-rotated");
        }
-#line 5747 "util/configparser.c" /* yacc.c:1646  */
+#line 5771 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 523:
-#line 2761 "./util/configparser.y" /* yacc.c:1646  */
+#line 2785 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(dnsc_dnscrypt_secret_key:%s)\n", (yyvsp[0].str)));
                if(cfg_strlist_find(cfg_parser->cfg->dnscrypt_secret_key, (yyvsp[0].str)))
@@ -5755,22 +5779,22 @@ yyreduce:
                if(!cfg_strlist_insert(&cfg_parser->cfg->dnscrypt_secret_key, (yyvsp[0].str)))
                        fatal_exit("out of memory adding dnscrypt-secret-key");
        }
-#line 5759 "util/configparser.c" /* yacc.c:1646  */
+#line 5783 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 524:
-#line 2770 "./util/configparser.y" /* yacc.c:1646  */
+#line 2794 "./util/configparser.y" /* yacc.c:1646  */
     {
        OUTYY(("P(dnscrypt_shared_secret_cache_size:%s)\n", (yyvsp[0].str)));
        if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->dnscrypt_shared_secret_cache_size))
                yyerror("memory size expected");
        free((yyvsp[0].str));
   }
-#line 5770 "util/configparser.c" /* yacc.c:1646  */
+#line 5794 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 525:
-#line 2778 "./util/configparser.y" /* yacc.c:1646  */
+#line 2802 "./util/configparser.y" /* yacc.c:1646  */
     {
        OUTYY(("P(dnscrypt_shared_secret_cache_slabs:%s)\n", (yyvsp[0].str)));
        if(atoi((yyvsp[0].str)) == 0)
@@ -5782,22 +5806,22 @@ yyreduce:
        }
        free((yyvsp[0].str));
   }
-#line 5786 "util/configparser.c" /* yacc.c:1646  */
+#line 5810 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 526:
-#line 2791 "./util/configparser.y" /* yacc.c:1646  */
+#line 2815 "./util/configparser.y" /* yacc.c:1646  */
     {
        OUTYY(("P(dnscrypt_nonce_cache_size:%s)\n", (yyvsp[0].str)));
        if(!cfg_parse_memsize((yyvsp[0].str), &cfg_parser->cfg->dnscrypt_nonce_cache_size))
                yyerror("memory size expected");
        free((yyvsp[0].str));
   }
-#line 5797 "util/configparser.c" /* yacc.c:1646  */
+#line 5821 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 527:
-#line 2799 "./util/configparser.y" /* yacc.c:1646  */
+#line 2823 "./util/configparser.y" /* yacc.c:1646  */
     {
        OUTYY(("P(dnscrypt_nonce_cache_slabs:%s)\n", (yyvsp[0].str)));
        if(atoi((yyvsp[0].str)) == 0)
@@ -5809,19 +5833,19 @@ yyreduce:
        }
        free((yyvsp[0].str));
   }
-#line 5813 "util/configparser.c" /* yacc.c:1646  */
+#line 5837 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 528:
-#line 2812 "./util/configparser.y" /* yacc.c:1646  */
+#line 2836 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("\nP(cachedb:)\n"));
        }
-#line 5821 "util/configparser.c" /* yacc.c:1646  */
+#line 5845 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 536:
-#line 2822 "./util/configparser.y" /* yacc.c:1646  */
+#line 2846 "./util/configparser.y" /* yacc.c:1646  */
     {
        #ifdef USE_CACHEDB
                OUTYY(("P(backend:%s)\n", (yyvsp[0].str)));
@@ -5832,13 +5856,14 @@ yyreduce:
                cfg_parser->cfg->cachedb_backend = (yyvsp[0].str);
        #else
                OUTYY(("P(Compiled without cachedb, ignoring)\n"));
+               free((yyvsp[0].str));
        #endif
        }
-#line 5838 "util/configparser.c" /* yacc.c:1646  */
+#line 5863 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 537:
-#line 2836 "./util/configparser.y" /* yacc.c:1646  */
+#line 2861 "./util/configparser.y" /* yacc.c:1646  */
     {
        #ifdef USE_CACHEDB
                OUTYY(("P(secret-seed:%s)\n", (yyvsp[0].str)));
@@ -5852,11 +5877,11 @@ yyreduce:
                free((yyvsp[0].str));
        #endif
        }
-#line 5856 "util/configparser.c" /* yacc.c:1646  */
+#line 5881 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 538:
-#line 2851 "./util/configparser.y" /* yacc.c:1646  */
+#line 2876 "./util/configparser.y" /* yacc.c:1646  */
     {
        #if defined(USE_CACHEDB) && defined(USE_REDIS)
                OUTYY(("P(redis_server_host:%s)\n", (yyvsp[0].str)));
@@ -5867,11 +5892,11 @@ yyreduce:
                free((yyvsp[0].str));
        #endif
        }
-#line 5871 "util/configparser.c" /* yacc.c:1646  */
+#line 5896 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 539:
-#line 2863 "./util/configparser.y" /* yacc.c:1646  */
+#line 2888 "./util/configparser.y" /* yacc.c:1646  */
     {
        #if defined(USE_CACHEDB) && defined(USE_REDIS)
                int port;
@@ -5885,11 +5910,11 @@ yyreduce:
        #endif
                free((yyvsp[0].str));
        }
-#line 5889 "util/configparser.c" /* yacc.c:1646  */
+#line 5914 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 540:
-#line 2878 "./util/configparser.y" /* yacc.c:1646  */
+#line 2903 "./util/configparser.y" /* yacc.c:1646  */
     {
        #if defined(USE_CACHEDB) && defined(USE_REDIS)
                OUTYY(("P(redis_timeout:%s)\n", (yyvsp[0].str)));
@@ -5901,11 +5926,11 @@ yyreduce:
        #endif
                free((yyvsp[0].str));
        }
-#line 5905 "util/configparser.c" /* yacc.c:1646  */
+#line 5930 "util/configparser.c" /* yacc.c:1646  */
     break;
 
   case 541:
-#line 2891 "./util/configparser.y" /* yacc.c:1646  */
+#line 2916 "./util/configparser.y" /* yacc.c:1646  */
     {
                OUTYY(("P(server_tcp_connection_limit:%s %s)\n", (yyvsp[-1].str), (yyvsp[0].str)));
                if (atoi((yyvsp[0].str)) < 0)
@@ -5915,11 +5940,11 @@ yyreduce:
                                fatal_exit("out of memory adding tcp connection limit");
                }
        }
-#line 5919 "util/configparser.c" /* yacc.c:1646  */
+#line 5944 "util/configparser.c" /* yacc.c:1646  */
     break;
 
 
-#line 5923 "util/configparser.c" /* yacc.c:1646  */
+#line 5948 "util/configparser.c" /* yacc.c:1646  */
       default: break;
     }
   /* User semantic actions sometimes alter yychar, and that requires
@@ -6147,7 +6172,7 @@ yyreturn:
 #endif
   return yyresult;
 }
-#line 2901 "./util/configparser.y" /* yacc.c:1906  */
+#line 2926 "./util/configparser.y" /* yacc.c:1906  */
 
 
 /* parse helper routines could be here */
index 9b1261a417ea8792d4c245972921dc832e2823cb..f01073d44af2dce2c241b15698334b71f209682d 100644 (file)
@@ -1469,6 +1469,8 @@ server_access_control: VAR_ACCESS_CONTROL STRING_ARG STRING_ARG
                        yyerror("expected deny, refuse, deny_non_local, "
                                "refuse_non_local, allow, allow_setrd or "
                                "allow_snoop in access control action");
+                       free($2);
+                       free($3);
                } else {
                        if(!cfg_str2list_insert(&cfg_parser->cfg->acls, $2, $3))
                                fatal_exit("out of memory adding acl");
@@ -1747,13 +1749,15 @@ server_local_zone: VAR_LOCAL_ZONE STRING_ARG STRING_ARG
                   && strcmp($3, "always_refuse")!=0
                   && strcmp($3, "always_nxdomain")!=0
                   && strcmp($3, "noview")!=0
-                  && strcmp($3, "inform")!=0 && strcmp($3, "inform_deny")!=0)
+                  && strcmp($3, "inform")!=0 && strcmp($3, "inform_deny")!=0) {
                        yyerror("local-zone type: expected static, deny, "
                                "refuse, redirect, transparent, "
                                "typetransparent, inform, inform_deny, "
                                "always_transparent, always_refuse, "
                                "always_nxdomain, noview or nodefault");
-               else if(strcmp($3, "nodefault")==0) {
+                       free($2);
+                       free($3);
+               } else if(strcmp($3, "nodefault")==0) {
                        if(!cfg_strlist_insert(&cfg_parser->cfg->
                                local_zones_nodefault, $2))
                                fatal_exit("out of memory adding local-zone");
@@ -1866,8 +1870,10 @@ server_local_zone_tag: VAR_LOCAL_ZONE_TAG STRING_ARG STRING_ARG
                        &len);
                free($3);
                OUTYY(("P(server_local_zone_tag:%s)\n", $2));
-               if(!bitlist)
+               if(!bitlist) {
                        yyerror("could not parse tags, (define-tag them first)");
+                       free($2);
+               }
                if(bitlist) {
                        if(!cfg_strbytelist_insert(
                                &cfg_parser->cfg->local_zone_tags,
@@ -1885,8 +1891,10 @@ server_access_control_tag: VAR_ACCESS_CONTROL_TAG STRING_ARG STRING_ARG
                        &len);
                free($3);
                OUTYY(("P(server_access_control_tag:%s)\n", $2));
-               if(!bitlist)
+               if(!bitlist) {
                        yyerror("could not parse tags, (define-tag them first)");
+                       free($2);
+               }
                if(bitlist) {
                        if(!cfg_strbytelist_insert(
                                &cfg_parser->cfg->acl_tags,
@@ -1939,8 +1947,6 @@ server_access_control_view: VAR_ACCESS_CONTROL_VIEW STRING_ARG STRING_ARG
                if(!cfg_str2list_insert(&cfg_parser->cfg->acl_view,
                        $2, $3)) {
                        yyerror("out of memory");
-                       free($2);
-                       free($3);
                }
        }
        ;
@@ -1951,8 +1957,10 @@ server_response_ip_tag: VAR_RESPONSE_IP_TAG STRING_ARG STRING_ARG
                        &len);
                free($3);
                OUTYY(("P(response_ip_tag:%s)\n", $2));
-               if(!bitlist)
+               if(!bitlist) {
                        yyerror("could not parse tags, (define-tag them first)");
+                       free($2);
+               }
                if(bitlist) {
                        if(!cfg_strbytelist_insert(
                                &cfg_parser->cfg->respip_tags,
@@ -2029,6 +2037,8 @@ server_ratelimit_for_domain: VAR_RATELIMIT_FOR_DOMAIN STRING_ARG STRING_ARG
                OUTYY(("P(server_ratelimit_for_domain:%s %s)\n", $2, $3));
                if(atoi($3) == 0 && strcmp($3, "0") != 0) {
                        yyerror("number expected");
+                       free($2);
+                       free($3);
                } else {
                        if(!cfg_str2list_insert(&cfg_parser->cfg->
                                ratelimit_for_domain, $2, $3))
@@ -2042,6 +2052,8 @@ server_ratelimit_below_domain: VAR_RATELIMIT_BELOW_DOMAIN STRING_ARG STRING_ARG
                OUTYY(("P(server_ratelimit_below_domain:%s %s)\n", $2, $3));
                if(atoi($3) == 0 && strcmp($3, "0") != 0) {
                        yyerror("number expected");
+                       free($2);
+                       free($3);
                } else {
                        if(!cfg_str2list_insert(&cfg_parser->cfg->
                                ratelimit_below_domain, $2, $3))
@@ -2119,10 +2131,10 @@ server_ipsecmod_enabled: VAR_IPSECMOD_ENABLED STRING_ARG
                if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
                        yyerror("expected yes or no.");
                else cfg_parser->cfg->ipsecmod_enabled = (strcmp($2, "yes")==0);
-               free($2);
        #else
                OUTYY(("P(Compiled without IPsec module, ignoring)\n"));
        #endif
+               free($2);
        }
        ;
 server_ipsecmod_ignore_bogus: VAR_IPSECMOD_IGNORE_BOGUS STRING_ARG
@@ -2132,10 +2144,10 @@ server_ipsecmod_ignore_bogus: VAR_IPSECMOD_IGNORE_BOGUS STRING_ARG
                if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
                        yyerror("expected yes or no.");
                else cfg_parser->cfg->ipsecmod_ignore_bogus = (strcmp($2, "yes")==0);
-               free($2);
        #else
                OUTYY(("P(Compiled without IPsec module, ignoring)\n"));
        #endif
+               free($2);
        }
        ;
 server_ipsecmod_hook: VAR_IPSECMOD_HOOK STRING_ARG
@@ -2146,6 +2158,7 @@ server_ipsecmod_hook: VAR_IPSECMOD_HOOK STRING_ARG
                cfg_parser->cfg->ipsecmod_hook = $2;
        #else
                OUTYY(("P(Compiled without IPsec module, ignoring)\n"));
+               free($2);
        #endif
        }
        ;
@@ -2159,6 +2172,7 @@ server_ipsecmod_max_ttl: VAR_IPSECMOD_MAX_TTL STRING_ARG
                free($2);
        #else
                OUTYY(("P(Compiled without IPsec module, ignoring)\n"));
+               free($2);
        #endif
        }
        ;
@@ -2170,6 +2184,7 @@ server_ipsecmod_whitelist: VAR_IPSECMOD_WHITELIST STRING_ARG
                        yyerror("out of memory");
        #else
                OUTYY(("P(Compiled without IPsec module, ignoring)\n"));
+               free($2);
        #endif
        }
        ;
@@ -2183,6 +2198,7 @@ server_ipsecmod_strict: VAR_IPSECMOD_STRICT STRING_ARG
                free($2);
        #else
                OUTYY(("P(Compiled without IPsec module, ignoring)\n"));
+               free($2);
        #endif
        }
        ;
@@ -2390,13 +2406,15 @@ view_local_zone: VAR_LOCAL_ZONE STRING_ARG STRING_ARG
                   && strcmp($3, "always_refuse")!=0
                   && strcmp($3, "always_nxdomain")!=0
                   && strcmp($3, "noview")!=0
-                  && strcmp($3, "inform")!=0 && strcmp($3, "inform_deny")!=0)
+                  && strcmp($3, "inform")!=0 && strcmp($3, "inform_deny")!=0) {
                        yyerror("local-zone type: expected static, deny, "
                                "refuse, redirect, transparent, "
                                "typetransparent, inform, inform_deny, "
                                "always_transparent, always_refuse, "
                                "always_nxdomain, noview or nodefault");
-               else if(strcmp($3, "nodefault")==0) {
+                       free($2);
+                       free($3);
+               } else if(strcmp($3, "nodefault")==0) {
                        if(!cfg_strlist_insert(&cfg_parser->cfg->views->
                                local_zones_nodefault, $2))
                                fatal_exit("out of memory adding local-zone");
@@ -2432,7 +2450,6 @@ view_local_data: VAR_LOCAL_DATA STRING_ARG
                OUTYY(("P(view_local_data:%s)\n", $2));
                if(!cfg_strlist_insert(&cfg_parser->cfg->views->local_data, $2)) {
                        fatal_exit("out of memory adding local-data");
-                       free($2);
                }
        }
        ;
@@ -2555,6 +2572,7 @@ dt_dnstap_enable: VAR_DNSTAP_ENABLE STRING_ARG
                if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
                        yyerror("expected yes or no.");
                else cfg_parser->cfg->dnstap = (strcmp($2, "yes")==0);
+               free($2);
        }
        ;
 dt_dnstap_socket_path: VAR_DNSTAP_SOCKET_PATH STRING_ARG
@@ -2570,6 +2588,7 @@ dt_dnstap_send_identity: VAR_DNSTAP_SEND_IDENTITY STRING_ARG
                if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
                        yyerror("expected yes or no.");
                else cfg_parser->cfg->dnstap_send_identity = (strcmp($2, "yes")==0);
+               free($2);
        }
        ;
 dt_dnstap_send_version: VAR_DNSTAP_SEND_VERSION STRING_ARG
@@ -2578,6 +2597,7 @@ dt_dnstap_send_version: VAR_DNSTAP_SEND_VERSION STRING_ARG
                if(strcmp($2, "yes") != 0 && strcmp($2, "no") != 0)
                        yyerror("expected yes or no.");
                else cfg_parser->cfg->dnstap_send_version = (strcmp($2, "yes")==0);
+               free($2);
        }
        ;
 dt_dnstap_identity: VAR_DNSTAP_IDENTITY STRING_ARG
@@ -2601,6 +2621,7 @@ dt_dnstap_log_resolver_query_messages: VAR_DNSTAP_LOG_RESOLVER_QUERY_MESSAGES ST
                        yyerror("expected yes or no.");
                else cfg_parser->cfg->dnstap_log_resolver_query_messages =
                        (strcmp($2, "yes")==0);
+               free($2);
        }
        ;
 dt_dnstap_log_resolver_response_messages: VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSAGES STRING_ARG
@@ -2610,6 +2631,7 @@ dt_dnstap_log_resolver_response_messages: VAR_DNSTAP_LOG_RESOLVER_RESPONSE_MESSA
                        yyerror("expected yes or no.");
                else cfg_parser->cfg->dnstap_log_resolver_response_messages =
                        (strcmp($2, "yes")==0);
+               free($2);
        }
        ;
 dt_dnstap_log_client_query_messages: VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES STRING_ARG
@@ -2619,6 +2641,7 @@ dt_dnstap_log_client_query_messages: VAR_DNSTAP_LOG_CLIENT_QUERY_MESSAGES STRING
                        yyerror("expected yes or no.");
                else cfg_parser->cfg->dnstap_log_client_query_messages =
                        (strcmp($2, "yes")==0);
+               free($2);
        }
        ;
 dt_dnstap_log_client_response_messages: VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES STRING_ARG
@@ -2628,6 +2651,7 @@ dt_dnstap_log_client_response_messages: VAR_DNSTAP_LOG_CLIENT_RESPONSE_MESSAGES
                        yyerror("expected yes or no.");
                else cfg_parser->cfg->dnstap_log_client_response_messages =
                        (strcmp($2, "yes")==0);
+               free($2);
        }
        ;
 dt_dnstap_log_forwarder_query_messages: VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES STRING_ARG
@@ -2637,6 +2661,7 @@ dt_dnstap_log_forwarder_query_messages: VAR_DNSTAP_LOG_FORWARDER_QUERY_MESSAGES
                        yyerror("expected yes or no.");
                else cfg_parser->cfg->dnstap_log_forwarder_query_messages =
                        (strcmp($2, "yes")==0);
+               free($2);
        }
        ;
 dt_dnstap_log_forwarder_response_messages: VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MESSAGES STRING_ARG
@@ -2646,6 +2671,7 @@ dt_dnstap_log_forwarder_response_messages: VAR_DNSTAP_LOG_FORWARDER_RESPONSE_MES
                        yyerror("expected yes or no.");
                else cfg_parser->cfg->dnstap_log_forwarder_response_messages =
                        (strcmp($2, "yes")==0);
+               free($2);
        }
        ;
 pythonstart: VAR_PYTHON
@@ -2692,15 +2718,14 @@ server_response_ip: VAR_RESPONSE_IP STRING_ARG STRING_ARG
 server_response_ip_data: VAR_RESPONSE_IP_DATA STRING_ARG STRING_ARG
        {
                OUTYY(("P(server_response_ip_data:%s)\n", $2));
-                       if(!cfg_str2list_insert(&cfg_parser->cfg->respip_data,
-                               $2, $3))
-                               fatal_exit("out of memory adding response-ip-data");
+               if(!cfg_str2list_insert(&cfg_parser->cfg->respip_data,
+                       $2, $3))
+                       fatal_exit("out of memory adding response-ip-data");
        }
        ;
 dnscstart: VAR_DNSCRYPT
        {
                OUTYY(("\nP(dnscrypt:)\n"));
-               OUTYY(("\nP(dnscrypt:)\n"));
        }
        ;
 contents_dnsc: contents_dnsc content_dnsc
@@ -2727,7 +2752,6 @@ dnsc_dnscrypt_enable: VAR_DNSCRYPT_ENABLE STRING_ARG
 dnsc_dnscrypt_port: VAR_DNSCRYPT_PORT STRING_ARG
        {
                OUTYY(("P(dnsc_dnscrypt_port:%s)\n", $2));
-
                if(atoi($2) == 0)
                        yyerror("port number expected");
                else cfg_parser->cfg->dnscrypt_port = atoi($2);
@@ -2829,6 +2853,7 @@ cachedb_backend_name: VAR_CACHEDB_BACKEND STRING_ARG
                cfg_parser->cfg->cachedb_backend = $2;
        #else
                OUTYY(("P(Compiled without cachedb, ignoring)\n"));
+               free($2);
        #endif
        }
        ;