]> git.ipfire.org Git - thirdparty/ldns.git/commitdiff
Address the memory leaks in ldns-verify-zone
authorWillem Toorop <willem@nlnetlabs.nl>
Sat, 25 Jan 2025 21:15:04 +0000 (22:15 +0100)
committerWillem Toorop <willem@nlnetlabs.nl>
Sat, 25 Jan 2025 21:15:04 +0000 (22:15 +0100)
As reported by CI

dnssec_zone.c
error.c
examples/ldns-verify-zone.c
ldns/error.h

index 013517f4ac1a64bea6076b733856b63f48a0e1f2..773a0239a88e889464aff48d108acb9464a2c162 100644 (file)
@@ -71,8 +71,9 @@ ldns_dnssec_rrs_add_rr(ldns_dnssec_rrs *rrs, ldns_rr *rr)
                new_rrs->next = rrs->next;
                rrs->rr = rr;
                rrs->next = new_rrs;
-       }
-       /* Silently ignore equal rr's */
+       } else
+               return LDNS_STATUS_EQUAL_RR;
+
        return LDNS_STATUS_OK;
 }
 
@@ -732,25 +733,37 @@ ldns_dnssec_zone_new_frm_fp_l(ldns_dnssec_zone** z, FILE* fp, const ldns_rdf* or
                                 */
                                ldns_rr_set_ttl(cur_rr, ldns_rr_ttl(prev_rr));
 
-                       prev_rr = cur_rr;
 #endif
                        status = ldns_dnssec_zone_add_rr(newzone, cur_rr);
-                       if (status ==
-                               LDNS_STATUS_DNSSEC_NSEC3_ORIGINAL_NOT_FOUND) {
-
+                       switch(status) {
+                       case LDNS_STATUS_DNSSEC_NSEC3_ORIGINAL_NOT_FOUND:
                                if (rr_is_rrsig_covering(cur_rr,
                                                        LDNS_RR_TYPE_NSEC3)){
                                        ldns_rr_list_push_rr(todo_nsec3_rrsigs,
                                                        cur_rr);
                                } else {
                                        ldns_rr_list_push_rr(todo_nsec3s,
-                                                       cur_rr);
+                                                       cur_rr);
                                }
                                status = LDNS_STATUS_OK;
-
-                       } else if (status != LDNS_STATUS_OK)
+                               break;
+                       case LDNS_STATUS_EQUAL_RR:
+                               ldns_rr_free(cur_rr);
+#ifndef FASTER_DNSSEC_ZONE_NEW_FRM_FP
+                               cur_rr = prev_rr;
+#else
+                               cur_rr = NULL;
+#endif
+                               status = LDNS_STATUS_OK;
+                               break;
+                       case LDNS_STATUS_OK:
+                               break;
+                       default:
                                goto error;
-
+                       }
+#ifndef FASTER_DNSSEC_ZONE_NEW_FRM_FP
+                       prev_rr = cur_rr;
+#endif
                        break;
 
                case LDNS_STATUS_SYNTAX_TTL:    /* the ttl was set*/
diff --git a/error.c b/error.c
index 50cdc6300bddc5942644b4ef19a487c28eaeb81f..5723aea9b4c20b268da580c739f3ae78b68c6ae0 100644 (file)
--- a/error.c
+++ b/error.c
@@ -189,6 +189,8 @@ ldns_lookup_table ldns_error_str[] = {
        { LDNS_STATUS_EDE_OPTION_MALFORMED,
                "The extended error code option is malformed, expected "
                "at least 2 bytes of option data" },
+       { LDNS_STATUS_EQUAL_RR,
+               "An identical RR already existed in the zone" },
        { 0, NULL }
 };
 
index ac076cd1afe7b3d95f05985bd2a94ae85507e963..f4ad62fab2071162fb735e3bba15f969ed9cfc6d 100644 (file)
@@ -766,6 +766,7 @@ main(int argc, char **argv)
                         break;
                case 'h':
                        print_usage(stdout, progname);
+                       ldns_rr_list_deep_free(keys);
                        exit(EXIT_SUCCESS);
                        break;
                case 'e':
@@ -779,6 +780,7 @@ main(int argc, char **argv)
                                                "P[n]Y[n]M[n]DT[n]H[n]M[n]S\n"
                                                );
                                }
+                               ldns_rr_list_deep_free(keys);
                                 exit(EXIT_FAILURE);
                        }
                        if (c == 'e')
@@ -804,6 +806,7 @@ main(int argc, char **argv)
                                                "%s: %s\n",optarg,
                                                ldns_get_errorstr_by_id(s));
                                }
+                               ldns_rr_list_deep_free(keys);
                                 exit(EXIT_FAILURE);
                        }
                        if (ldns_rr_list_rr_count(keys) == nkeys) {
@@ -812,6 +815,7 @@ main(int argc, char **argv)
                                                "No keys found in file %s\n",
                                                optarg);
                                }
+                               ldns_rr_list_deep_free(keys);
                                exit(EXIT_FAILURE);
                        }
                        nkeys = ldns_rr_list_rr_count(keys);
@@ -824,6 +828,7 @@ main(int argc, char **argv)
                                                "percentage needs to fall "
                                                "between 0..100\n");
                                }
+                               ldns_rr_list_deep_free(keys);
                                 exit(EXIT_FAILURE);
                         }
                         srandom(time(NULL) ^ getpid());
@@ -850,6 +855,7 @@ main(int argc, char **argv)
                case 'v':
                        printf("verify-zone version %s (ldns version %s)\n",
                                        LDNS_VERSION, ldns_version());
+                       ldns_rr_list_deep_free(keys);
                        exit(EXIT_SUCCESS);
                        break;
                case 'V':
@@ -869,6 +875,7 @@ main(int argc, char **argv)
                                fprintf(myerr, "Unable to chase "
                                                "signature without keys.\n");
                        }
+                       ldns_rr_list_deep_free(keys);
                        exit(EXIT_FAILURE);
                }
        }
@@ -887,10 +894,12 @@ main(int argc, char **argv)
                                fprintf(myerr, "Unable to open %s: %s\n",
                                        filename, strerror(errno));
                        }
+                       ldns_rr_list_deep_free(keys);
                        exit(EXIT_FAILURE);
                }
        } else {
                print_usage(stderr, progname);
+               ldns_rr_list_deep_free(keys);
                exit(EXIT_FAILURE);
        }
 
@@ -901,6 +910,7 @@ main(int argc, char **argv)
                        fprintf(myerr, "%s at line %d\n",
                                ldns_get_errorstr_by_id(s), line_nr);
                }
+               ldns_rr_list_deep_free(keys);
                 exit(EXIT_FAILURE);
        }
        if (!dnssec_zone->soa) {
@@ -908,6 +918,7 @@ main(int argc, char **argv)
                        fprintf(myerr,
                                "; Error: no SOA in the zone\n");
                }
+               ldns_rr_list_deep_free(keys);
                exit(EXIT_FAILURE);
        }
 
@@ -961,6 +972,7 @@ main(int argc, char **argv)
 
        ldns_dnssec_zone_deep_free(dnssec_zone);
        fclose(fp);
+       ldns_rr_list_deep_free(keys);
        exit(result);
 }
 
index 011df284725acfd9774c7e3e20cf0b94322eaaf1..a76eb2ecab5d6fa8b3351e487aa354dfee62a380 100644 (file)
@@ -143,7 +143,8 @@ enum ldns_enum_status {
        LDNS_STATUS_SVCPARAM_KEY_MORE_THAN_ONCE,
        LDNS_STATUS_INVALID_SVCPARAM_VALUE,
        LDNS_STATUS_NOT_EDE,
-       LDNS_STATUS_EDE_OPTION_MALFORMED
+       LDNS_STATUS_EDE_OPTION_MALFORMED,
+       LDNS_STATUS_EQUAL_RR
 };
 typedef enum ldns_enum_status ldns_status;