]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Fix TSIG dump keyfile name buffer size issues
authorMukund Sivaraman <muks@isc.org>
Wed, 28 Mar 2018 16:41:22 +0000 (22:11 +0530)
committerOndřej Surý <ondrej@sury.org>
Wed, 11 Apr 2018 10:04:39 +0000 (12:04 +0200)
lib/dns/view.c

index b58dfdde737f9ddb2805ed83124b4345354bbf07..049d0fd59f28b36e85e60a3360864a2f79204292 100644 (file)
@@ -352,28 +352,28 @@ destroy(dns_view_t *view) {
 
        if (view->dynamickeys != NULL) {
                isc_result_t result;
-               char template[20];
-               char keyfile[20];
+               char template[PATH_MAX];
+               char keyfile[PATH_MAX];
                FILE *fp = NULL;
-               int n;
-
-               n = snprintf(keyfile, sizeof(keyfile), "%s.tsigkeys",
-                            view->name);
-               if (n > 0 && (size_t)n < sizeof(keyfile)) {
-                       result = isc_file_mktemplate(keyfile, template,
-                                                    sizeof(template));
-                       if (result == ISC_R_SUCCESS)
-                               (void)isc_file_openuniqueprivate(template, &fp);
+
+               result = isc_file_mktemplate(NULL, template, sizeof(template));
+               if (result == ISC_R_SUCCESS) {
+                       (void)isc_file_openuniqueprivate(template, &fp);
                }
-               if (fp == NULL)
+               if (fp == NULL) {
                        dns_tsigkeyring_detach(&view->dynamickeys);
-               else {
-                       result = dns_tsigkeyring_dumpanddetach(
-                                                       &view->dynamickeys, fp);
+               else {
+                       result = dns_tsigkeyring_dumpanddetach
+                               (&view->dynamickeys, fp);
                        if (result == ISC_R_SUCCESS) {
-                               if (fclose(fp) == 0)
-                                       result = isc_file_rename(template,
-                                                                keyfile);
+                               if (fclose(fp) == 0) {
+                                       result = isc_file_sanitize
+                                               (NULL, view->name, "tsigkeys",
+                                                keyfile, sizeof(keyfile));
+                                       if (result == ISC_R_SUCCESS)
+                                               result = isc_file_rename
+                                                       (template, keyfile);
+                               }
                                if (result != ISC_R_SUCCESS)
                                        (void)remove(template);
                        } else {
@@ -907,15 +907,15 @@ dns_view_getdynamickeyring(dns_view_t *view, dns_tsig_keyring_t **ringp) {
 void
 dns_view_restorekeyring(dns_view_t *view) {
        FILE *fp;
-       char keyfile[20];
-       int n;
+       char keyfile[PATH_MAX];
+       isc_result_t result;
 
        REQUIRE(DNS_VIEW_VALID(view));
 
        if (view->dynamickeys != NULL) {
-               n = snprintf(keyfile, sizeof(keyfile), "%s.tsigkeys",
-                            view->name);
-               if (n > 0 && (size_t)n < sizeof(keyfile)) {
+               result = isc_file_sanitize(NULL, view->name, "tsigkeys",
+                                          keyfile, sizeof(keyfile));
+               if (result == ISC_R_SUCCESS) {
                        fp = fopen(keyfile, "r");
                        if (fp != NULL) {
                                dns_keyring_restore(view->dynamickeys, fp);