From: Daniel Salzman Date: Fri, 6 Apr 2018 13:55:27 +0000 (+0200) Subject: zscanner: improve compatibility for non-regular inputs X-Git-Tag: v2.7.0~106 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ea9895e9cd4e3530cc6babe88058db7ba0d85cf1;p=thirdparty%2Fknot-dns.git zscanner: improve compatibility for non-regular inputs --- diff --git a/src/libzscanner/scanner.c.g2 b/src/libzscanner/scanner.c.g2 index ea620ceb0a..910efffc98 100644 --- a/src/libzscanner/scanner.c.g2 +++ b/src/libzscanner/scanner.c.g2 @@ -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; diff --git a/src/libzscanner/scanner.c.t0 b/src/libzscanner/scanner.c.t0 index b9398180aa..ab7cb792f1 100644 --- a/src/libzscanner/scanner.c.t0 +++ b/src/libzscanner/scanner.c.t0 @@ -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; diff --git a/src/libzscanner/scanner.rl b/src/libzscanner/scanner.rl index 519d22fc11..3c6bc04f05 100644 --- a/src/libzscanner/scanner.rl +++ b/src/libzscanner/scanner.rl @@ -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;