Make is_ktx safer
Rather than assuming the data passed to ktx at least KTX_FILE_IDENTIFIER_SIZE, pass the length of the data to is_ktx and compare it. Splitting off from crrev.com/1862133002, which no longer depends on is_ktx. GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1882593002 Review URL: https://codereview.chromium.org/1882593002
This commit is contained in:
parent
37798fbd82
commit
b8e0960de4
@ -87,7 +87,7 @@ GrPixelConfig GrIsCompressedTextureDataSupported(GrContext* ctx, SkData* data,
|
||||
|
||||
*outStartOfDataToUpload = bytes + ETC_PKM_HEADER_SIZE;
|
||||
return kETC1_GrPixelConfig;
|
||||
} else if (SkKTXFile::is_ktx(bytes)) {
|
||||
} else if (SkKTXFile::is_ktx(bytes, data->size())) {
|
||||
SkKTXFile ktx(data);
|
||||
|
||||
// Is it actually an ETC1 texture?
|
||||
|
@ -56,7 +56,7 @@ bool SkKTXImageEncoder::onEncode(SkWStream* stream, const SkBitmap& bitmap, int)
|
||||
}
|
||||
|
||||
// Is it a KTX file??
|
||||
if (SkKTXFile::is_ktx(bytes)) {
|
||||
if (SkKTXFile::is_ktx(bytes, data->size())) {
|
||||
return stream->write(bytes, data->size());
|
||||
}
|
||||
|
||||
|
7
third_party/ktx/ktx.cpp
vendored
7
third_party/ktx/ktx.cpp
vendored
@ -336,8 +336,9 @@ bool SkKTXFile::readKTXFile(const uint8_t* data, size_t dataLen) {
|
||||
return bytesLeft == 0;
|
||||
}
|
||||
|
||||
bool SkKTXFile::is_ktx(const uint8_t *data) {
|
||||
return 0 == memcmp(KTX_FILE_IDENTIFIER, data, KTX_FILE_IDENTIFIER_SIZE);
|
||||
bool SkKTXFile::is_ktx(const uint8_t data[], size_t size) {
|
||||
return size >= KTX_FILE_IDENTIFIER_SIZE &&
|
||||
0 == memcmp(KTX_FILE_IDENTIFIER, data, KTX_FILE_IDENTIFIER_SIZE);
|
||||
}
|
||||
|
||||
bool SkKTXFile::is_ktx(SkStreamRewindable* stream) {
|
||||
@ -349,7 +350,7 @@ bool SkKTXFile::is_ktx(SkStreamRewindable* stream) {
|
||||
if (!largeEnough) {
|
||||
return false;
|
||||
}
|
||||
return is_ktx(buf);
|
||||
return is_ktx(buf, KTX_FILE_IDENTIFIER_SIZE);
|
||||
}
|
||||
|
||||
SkKTXFile::KeyValue SkKTXFile::CreateKeyValue(const char *cstrKey, const char *cstrValue) {
|
||||
|
6
third_party/ktx/ktx.h
vendored
6
third_party/ktx/ktx.h
vendored
@ -34,9 +34,7 @@ public:
|
||||
// The ownership of the data remains with the caller. This class is intended
|
||||
// to be used as a logical wrapper around the data in order to properly
|
||||
// access the pixels.
|
||||
SkKTXFile(SkData* data)
|
||||
: fData(data), fSwapBytes(false)
|
||||
{
|
||||
SkKTXFile(SkData* data) : fData(data), fSwapBytes(false) {
|
||||
data->ref();
|
||||
fValid = this->readKTXFile(fData->bytes(), fData->size());
|
||||
}
|
||||
@ -62,7 +60,7 @@ public:
|
||||
bool isRGBA8() const;
|
||||
bool isRGB8() const;
|
||||
|
||||
static bool is_ktx(const uint8_t *data);
|
||||
static bool is_ktx(const uint8_t data[], size_t size);
|
||||
static bool is_ktx(SkStreamRewindable* stream);
|
||||
|
||||
static bool WriteETC1ToKTX(SkWStream* stream, const uint8_t *etc1Data,
|
||||
|
Loading…
Reference in New Issue
Block a user