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
diff --git a/src/gpu/SkGr.cpp b/src/gpu/SkGr.cpp
index 7169091..84023ec 100644
--- a/src/gpu/SkGr.cpp
+++ b/src/gpu/SkGr.cpp
@@ -87,7 +87,7 @@
 
         *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?
diff --git a/src/images/SkKTXImageEncoder.cpp b/src/images/SkKTXImageEncoder.cpp
index 5dc347a..4b318a2 100644
--- a/src/images/SkKTXImageEncoder.cpp
+++ b/src/images/SkKTXImageEncoder.cpp
@@ -56,7 +56,7 @@
         }
 
         // Is it a KTX file??
-        if (SkKTXFile::is_ktx(bytes)) {
+        if (SkKTXFile::is_ktx(bytes, data->size())) {
             return stream->write(bytes, data->size());
         }
 
diff --git a/third_party/ktx/ktx.cpp b/third_party/ktx/ktx.cpp
index 32985eb..08282db 100644
--- a/third_party/ktx/ktx.cpp
+++ b/third_party/ktx/ktx.cpp
@@ -336,8 +336,9 @@
     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 @@
     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) {
diff --git a/third_party/ktx/ktx.h b/third_party/ktx/ktx.h
index 889d5aa..6ff8a8b 100644
--- a/third_party/ktx/ktx.h
+++ b/third_party/ktx/ktx.h
@@ -34,9 +34,7 @@
     // 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 @@
     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,