]> git.ipfire.org Git - thirdparty/vectorscan.git/commitdiff
hscollider: fix input length for UTF8 check
authorWang, Xiang W <xiang.w.wang@intel.com>
Wed, 18 Apr 2018 03:26:04 +0000 (23:26 -0400)
committerChang, Harry <harry.chang@intel.com>
Wed, 27 Jun 2018 06:04:53 +0000 (14:04 +0800)
src/compiler/compiler.cpp
src/parser/utf8_validate.cpp
src/parser/utf8_validate.h
tools/hscollider/main.cpp
unit/internal/utf8_validate.cpp

index 7affb08d3d1ab8d9c08fa59a572dbc0430a3a788..c71ee4b9cb6ba28d7c2f15dc2d26b8ebf0cbd6f5 100644 (file)
@@ -118,7 +118,8 @@ ParsedExpression::ParsedExpression(unsigned index_in, const char *expression,
 
     expr.utf8 = mode.utf8; /* utf8 may be set by parse() */
 
-    if (expr.utf8 && !isValidUtf8(expression)) {
+    const size_t len = strlen(expression);
+    if (expr.utf8 && !isValidUtf8(expression, len)) {
         throw ParseError("Expression is not valid UTF-8.");
     }
 
index cedaf94452e07c8f56a420895664a49af1479ee7..50aa06d8e7832cdcb5a7da47f17fd76889dc81e4 100644 (file)
@@ -60,12 +60,11 @@ bool isAllowedCodepoint(u32 val) {
     return true;
 }
 
-bool isValidUtf8(const char *expression) {
+bool isValidUtf8(const char *expression, const size_t len) {
     if (!expression) {
         return true;
     }
 
-    const size_t len = strlen(expression);
     const u8 *s = (const u8 *)expression;
     u32 val;
 
index 26a2f22e8e041384cf76a1242111c1f41f8eeb57..6389a0859f8a3c04d3be26a9d59e7ad5a8736c89 100644 (file)
 #ifndef PARSER_UTF8_VALIDATE_H
 #define PARSER_UTF8_VALIDATE_H
 
+#include <cstddef> // size_t
+
 namespace ue2 {
 
 /** \brief Validate that the given expression is well-formed UTF-8.  */
-bool isValidUtf8(const char *expression);
+bool isValidUtf8(const char *expression, const size_t len);
 
 } // namespace ue2
 
index e1e543cc1e70009016c6a9ec0542415899b67fff..9877b6aebcfcc5a04b2dcaf180649c94ed49f7d3 100644 (file)
@@ -1060,7 +1060,7 @@ void addCorporaToQueue(ostream &out, BoundedQueue<TestUnit> &testq, unsigned id,
     // is undefined.
     if (utf8) {
         auto is_invalid_utf8 = [](const Corpus &corpus) {
-            return !isValidUtf8(corpus.data.c_str());
+            return !isValidUtf8(corpus.data.c_str(), corpus.data.size());
         };
         c.erase(remove_if(begin(c), end(c), is_invalid_utf8), end(c));
     }
index f570e6b0230529a68321e5c02f654922b7f8ae41..0335794203355c362893602d733a178e2e651e8e 100644 (file)
@@ -118,5 +118,5 @@ INSTANTIATE_TEST_CASE_P(ValidUtf8, ValidUtf8Test, ValuesIn(valid_utf8_tests));
 TEST_P(ValidUtf8Test, check) {
     const auto &info = GetParam();
     SCOPED_TRACE(testing::Message() << "String is: " << printable(info.str));
-    ASSERT_EQ(info.is_valid, isValidUtf8(info.str.c_str()));
+    ASSERT_EQ(info.is_valid, isValidUtf8(info.str.c_str(), info.str.size()));
 }