diff options
author | Ben Wagner <bungeman@google.com> | 2017-03-17 13:49:31 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-03-17 20:08:52 +0000 |
commit | eefa289a214ea3917e5e00554f231adb5ad6f712 (patch) | |
tree | db2e0da8a27d30931cbe5c7aaddb559c805b0a1e | |
parent | 7da8d646a2114b252e79a0c93a4aeb153d2e1390 (diff) |
sk_fgetsize to not use ftell.
The previous version of sk_fgetsize used ftell and fseek to compute
the size of a file. There are so many issues with this that it is called
out by securecoding.cert.org as FIO19-C as a thing not to do. We already
have correct code for computing the size of a file in the mmap code, so
use that instead.
Change-Id: I1d771124989d0ec1523f6d858814ee563263213a
Reviewed-on: https://skia-review.googlesource.com/9860
Reviewed-by: Leon Scroggins <scroggo@google.com>
Commit-Queue: Ben Wagner <bungeman@google.com>
-rw-r--r-- | src/ports/SkOSFile_posix.cpp | 19 | ||||
-rw-r--r-- | src/ports/SkOSFile_stdio.cpp | 18 | ||||
-rw-r--r-- | src/ports/SkOSFile_win.cpp | 21 |
3 files changed, 40 insertions, 18 deletions
diff --git a/src/ports/SkOSFile_posix.cpp b/src/ports/SkOSFile_posix.cpp index 48b5b95ad3..40028246ff 100644 --- a/src/ports/SkOSFile_posix.cpp +++ b/src/ports/SkOSFile_posix.cpp @@ -19,6 +19,25 @@ #include <sys/types.h> #include <unistd.h> +size_t sk_fgetsize(FILE* f) { + int fd = fileno(f); + if (fd < 0) { + return 0; + } + + struct stat status; + if (0 != fstat(fd, &status)) { + return 0; + } + if (!S_ISREG(status.st_mode)) { + return 0; + } + if (!SkTFitsIn<size_t>(status.st_size)) { + return 0; + } + return static_cast<size_t>(status.st_size); +} + bool sk_exists(const char *path, SkFILE_Flags flags) { int mode = F_OK; if (flags & kRead_SkFILE_Flag) { diff --git a/src/ports/SkOSFile_stdio.cpp b/src/ports/SkOSFile_stdio.cpp index 68c2d3d4d7..e79d87fc89 100644 --- a/src/ports/SkOSFile_stdio.cpp +++ b/src/ports/SkOSFile_stdio.cpp @@ -87,24 +87,6 @@ FILE* sk_fopen(const char path[], SkFILE_Flags flags) { return file; } -size_t sk_fgetsize(FILE* f) { - SkASSERT(f); - - long curr = ftell(f); // remember where we are - if (curr < 0) { - return 0; - } - - fseek(f, 0, SEEK_END); // go to the end - long size = ftell(f); // record the size - if (size < 0) { - size = 0; - } - - fseek(f, curr, SEEK_SET); // go back to our prev location - return size; -} - size_t sk_fwrite(const void* buffer, size_t byteCount, FILE* f) { SkASSERT(f); return fwrite(buffer, 1, byteCount, f); diff --git a/src/ports/SkOSFile_win.cpp b/src/ports/SkOSFile_win.cpp index ceafc7904f..9c5ada607d 100644 --- a/src/ports/SkOSFile_win.cpp +++ b/src/ports/SkOSFile_win.cpp @@ -16,6 +16,27 @@ #include <stdio.h> #include <sys/stat.h> +size_t sk_fgetsize(FILE* f) { + int fileno = sk_fileno(f); + if (fileno < 0) { + return 0; + } + + HANDLE file = (HANDLE)_get_osfhandle(fileno); + if (INVALID_HANDLE_VALUE == file) { + return 0; + } + + LARGE_INTEGER fileSize; + if (0 == GetFileSizeEx(file, &fileSize)) { + return 0; + } + if (!SkTFitsIn<size_t>(fileSize.QuadPart)) { + return 0; + } + return static_cast<size_t>(fileSize.QuadPart); +} + bool sk_exists(const char *path, SkFILE_Flags flags) { int mode = 0; // existence if (flags & kRead_SkFILE_Flag) { |