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>
This commit is contained in:
parent
7da8d646a2
commit
eefa289a21
@ -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) {
|
||||
|
@ -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);
|
||||
|
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user