]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
lib/isccfg/parser.c: Fix invalid order of DbC checks that could cause dereference...
authorOndřej Surý <ondrej@sury.org>
Fri, 27 Sep 2019 10:07:32 +0000 (12:07 +0200)
committerOndřej Surý <ondrej@sury.org>
Thu, 3 Oct 2019 07:50:27 +0000 (09:50 +0200)
(cherry picked from commit f855f09a55bd7e3ba96ae42a64a81737c3c36ac6)

lib/isccfg/parser.c

index e3a4ddd9eb37695df0b88f66421effb14db6dd81..edc6f5bffe468a705b8f55f5f98a498e200172ec 100644 (file)
@@ -243,7 +243,7 @@ cfg_printx(const cfg_obj_t *obj, unsigned int flags,
 isc_result_t
 cfg_create_tuple(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
        isc_result_t result;
-       const cfg_tuplefielddef_t *fields = type->of;
+       const cfg_tuplefielddef_t *fields;
        const cfg_tuplefielddef_t *f;
        cfg_obj_t *obj = NULL;
        unsigned int nfields = 0;
@@ -253,6 +253,8 @@ cfg_create_tuple(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret) {
        REQUIRE(type != NULL);
        REQUIRE(ret != NULL && *ret == NULL);
 
+       fields = type->of;
+
        for (f = fields; f->name != NULL; f++)
                nfields++;
 
@@ -278,7 +280,7 @@ isc_result_t
 cfg_parse_tuple(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret)
 {
        isc_result_t result;
-       const cfg_tuplefielddef_t *fields = type->of;
+       const cfg_tuplefielddef_t *fields;
        const cfg_tuplefielddef_t *f;
        cfg_obj_t *obj = NULL;
        unsigned int i;
@@ -287,6 +289,8 @@ cfg_parse_tuple(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret)
        REQUIRE(type != NULL);
        REQUIRE(ret != NULL && *ret == NULL);
 
+       fields = type->of;
+
        CHECK(cfg_create_tuple(pctx, type, &obj));
        for (f = fields, i = 0; f->name != NULL; f++, i++)
                CHECK(cfg_parse_obj(pctx, f->type, &obj->value.tuple[i]));
@@ -1795,13 +1799,15 @@ cfg_parse_spacelist(cfg_parser_t *pctx, const cfg_type_t *listtype,
                    cfg_obj_t **ret)
 {
        cfg_obj_t *listobj = NULL;
-       const cfg_type_t *listof = listtype->of;
+       const cfg_type_t *listof;
        isc_result_t result;
 
        REQUIRE(pctx != NULL);
        REQUIRE(listtype != NULL);
        REQUIRE(ret != NULL && *ret == NULL);
 
+       listof = listtype->of;
+
        CHECK(cfg_create_list(pctx, listtype, &listobj));
 
        for (;;) {
@@ -1905,7 +1911,7 @@ cfg_listelt_value(const cfg_listelt_t *elt) {
 isc_result_t
 cfg_parse_mapbody(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret)
 {
-       const cfg_clausedef_t * const *clausesets = type->of;
+       const cfg_clausedef_t * const *clausesets;
        isc_result_t result;
        const cfg_clausedef_t * const *clauseset;
        const cfg_clausedef_t *clause;
@@ -1920,6 +1926,8 @@ cfg_parse_mapbody(cfg_parser_t *pctx, const cfg_type_t *type, cfg_obj_t **ret)
        REQUIRE(type != NULL);
        REQUIRE(ret != NULL && *ret == NULL);
 
+       clausesets = type->of;
+
        CHECK(create_map(pctx, type, &obj));
 
        obj->value.map.clausesets = clausesets;
@@ -3019,12 +3027,14 @@ cfg_print_sockaddr(cfg_printer_t *pctx, const cfg_obj_t *obj) {
 
 void
 cfg_doc_sockaddr(cfg_printer_t *pctx, const cfg_type_t *type) {
-       const unsigned int *flagp = type->of;
+       const unsigned int *flagp;
        int n = 0;
 
        REQUIRE(pctx != NULL);
        REQUIRE(type != NULL);
 
+       flagp = type->of;
+
        cfg_print_cstr(pctx, "( ");
        if ((*flagp & CFG_ADDR_V4OK) != 0) {
                cfg_print_cstr(pctx, "<ipv4_address>");