]> git.ipfire.org Git - thirdparty/knot-dns.git/commitdiff
zscanner: improve compatibility for non-regular inputs
authorDaniel Salzman <daniel.salzman@nic.cz>
Fri, 6 Apr 2018 13:55:27 +0000 (15:55 +0200)
committerDaniel Salzman <daniel.salzman@nic.cz>
Fri, 6 Apr 2018 13:55:27 +0000 (15:55 +0200)
src/libzscanner/scanner.c.g2
src/libzscanner/scanner.c.t0
src/libzscanner/scanner.rl

index ea620ceb0a1f994ecaff26d54562dfc8550ff871..910efffc98dae9de9dbb5f3e27679ec1a2ca7c67 100644 (file)
@@ -290,13 +290,15 @@ int zs_set_input_file(
        char *start = NULL;
        size_t size = 0;
 
-       // Check for regular file input.
+       // Check the input.
        struct stat file_stat;
-       if (fstat(s->file.descriptor, &file_stat) == -1 ||
-           !S_ISREG(file_stat.st_mode) ||
-           (start = mmap(0, file_stat.st_size, PROT_READ, MAP_SHARED,
-                         s->file.descriptor, 0)) == MAP_FAILED) {
-
+       if (fstat(s->file.descriptor, &file_stat) == -1) {
+               ERR(ZS_FILE_INVALID);
+               input_deinit(s, false);
+               return -1;
+       } else if (S_ISCHR(file_stat.st_mode) ||
+                  S_ISBLK(file_stat.st_mode) ||
+                  S_ISFIFO(file_stat.st_mode)) {
                // Workaround if cannot mmap, read to memory.
                start = read_file_to_buf(s->file.descriptor, &size);
                if (start == NULL) {
@@ -304,7 +306,19 @@ int zs_set_input_file(
                        input_deinit(s, false);
                        return -1;
                }
-       } else if (file_stat.st_size > 0) { // Skip an empty file.
+       } else if (!S_ISREG(file_stat.st_mode)) { // Require regular file.
+               ERR(ZS_FILE_INVALID);
+               input_deinit(s, false);
+               return -1;
+       } else if (file_stat.st_size > 0) { // Mmap non-emtpy file.
+               start = mmap(0, file_stat.st_size, PROT_READ, MAP_SHARED,
+                            s->file.descriptor, 0);
+               if (start == MAP_FAILED) {
+                       ERR(ZS_FILE_INVALID);
+                       input_deinit(s, false);
+                       return -1;
+               }
+
                size = file_stat.st_size;
                s->input.mmaped = true;
 
index b9398180aaa7ac24225915ed3ad5da2f8a0329bf..ab7cb792f1c896b9ae1440d4ef4abd099a2fc309 100644 (file)
@@ -5653,13 +5653,15 @@ int zs_set_input_file(
        char *start = NULL;
        size_t size = 0;
 
-       // Check for regular file input.
+       // Check the input.
        struct stat file_stat;
-       if (fstat(s->file.descriptor, &file_stat) == -1 ||
-           !S_ISREG(file_stat.st_mode) ||
-           (start = mmap(0, file_stat.st_size, PROT_READ, MAP_SHARED,
-                         s->file.descriptor, 0)) == MAP_FAILED) {
-
+       if (fstat(s->file.descriptor, &file_stat) == -1) {
+               ERR(ZS_FILE_INVALID);
+               input_deinit(s, false);
+               return -1;
+       } else if (S_ISCHR(file_stat.st_mode) ||
+                  S_ISBLK(file_stat.st_mode) ||
+                  S_ISFIFO(file_stat.st_mode)) {
                // Workaround if cannot mmap, read to memory.
                start = read_file_to_buf(s->file.descriptor, &size);
                if (start == NULL) {
@@ -5667,7 +5669,19 @@ int zs_set_input_file(
                        input_deinit(s, false);
                        return -1;
                }
-       } else if (file_stat.st_size > 0) { // Skip an empty file.
+       } else if (!S_ISREG(file_stat.st_mode)) { // Require regular file.
+               ERR(ZS_FILE_INVALID);
+               input_deinit(s, false);
+               return -1;
+       } else if (file_stat.st_size > 0) { // Mmap non-emtpy file.
+               start = mmap(0, file_stat.st_size, PROT_READ, MAP_SHARED,
+                            s->file.descriptor, 0);
+               if (start == MAP_FAILED) {
+                       ERR(ZS_FILE_INVALID);
+                       input_deinit(s, false);
+                       return -1;
+               }
+
                size = file_stat.st_size;
                s->input.mmaped = true;
 
index 519d22fc11131553da555b8a3b50fc527c2b0d5b..3c6bc04f05810c27f7352ef2aa68fae077d720e4 100644 (file)
@@ -291,13 +291,15 @@ int zs_set_input_file(
        char *start = NULL;
        size_t size = 0;
 
-       // Check for regular file input.
+       // Check the input.
        struct stat file_stat;
-       if (fstat(s->file.descriptor, &file_stat) == -1 ||
-           !S_ISREG(file_stat.st_mode) ||
-           (start = mmap(0, file_stat.st_size, PROT_READ, MAP_SHARED,
-                         s->file.descriptor, 0)) == MAP_FAILED) {
-
+       if (fstat(s->file.descriptor, &file_stat) == -1) {
+               ERR(ZS_FILE_INVALID);
+               input_deinit(s, false);
+               return -1;
+       } else if (S_ISCHR(file_stat.st_mode) ||
+                  S_ISBLK(file_stat.st_mode) ||
+                  S_ISFIFO(file_stat.st_mode)) {
                // Workaround if cannot mmap, read to memory.
                start = read_file_to_buf(s->file.descriptor, &size);
                if (start == NULL) {
@@ -305,7 +307,19 @@ int zs_set_input_file(
                        input_deinit(s, false);
                        return -1;
                }
-       } else if (file_stat.st_size > 0) { // Skip an empty file.
+       } else if (!S_ISREG(file_stat.st_mode)) { // Require regular file.
+               ERR(ZS_FILE_INVALID);
+               input_deinit(s, false);
+               return -1;
+       } else if (file_stat.st_size > 0) { // Mmap non-emtpy file.
+               start = mmap(0, file_stat.st_size, PROT_READ, MAP_SHARED,
+                            s->file.descriptor, 0);
+               if (start == MAP_FAILED) {
+                       ERR(ZS_FILE_INVALID);
+                       input_deinit(s, false);
+                       return -1;
+               }
+
                size = file_stat.st_size;
                s->input.mmaped = true;