diff --git a/src/hwlm/hwlm_build.cpp b/src/hwlm/hwlm_build.cpp index 0de120ba..f86a70d2 100644 --- a/src/hwlm/hwlm_build.cpp +++ b/src/hwlm/hwlm_build.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Intel Corporation + * Copyright (c) 2015-2016, Intel Corporation * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -526,8 +526,7 @@ aligned_unique_ptr hwlmBuild(const vector &lits, DEBUG_PRINTF("build noodle table\n"); engType = HWLM_ENGINE_NOOD; const hwlmLiteral &lit = lits.front(); - auto noodle = noodBuildTable((const u8 *)lit.s.c_str(), lit.s.length(), - lit.nocase, lit.id); + auto noodle = noodBuildTable(lit); if (noodle) { engSize = noodSize(noodle.get()); } diff --git a/src/hwlm/noodle_build.cpp b/src/hwlm/noodle_build.cpp index 9e087211..d2b4e3f2 100644 --- a/src/hwlm/noodle_build.cpp +++ b/src/hwlm/noodle_build.cpp @@ -26,28 +26,35 @@ * POSSIBILITY OF SUCH DAMAGE. */ -/** \file +/** + * \file * \brief Noodle literal matcher: build code. */ -#include // for memcpy #include "noodle_build.h" + +#include "hwlm_literal.h" #include "noodle_internal.h" -#include "ue2common.h" #include "util/alloc.h" #include "util/compare.h" #include "util/verify_types.h" +#include "ue2common.h" + +#include // for memcpy namespace ue2 { static -size_t findNoodFragOffset(const u8 *lit, size_t len, bool nocase) { +size_t findNoodFragOffset(const hwlmLiteral &lit) { + const auto &s = lit.s; + const size_t len = lit.s.length(); + size_t offset = 0; for (size_t i = 0; i + 1 < len; i++) { int diff = 0; - const char c = lit[i]; - const char d = lit[i + 1]; - if (nocase && ourisalpha(c)) { + const char c = s[i]; + const char d = s[i + 1]; + if (lit.nocase && ourisalpha(c)) { diff = (mytoupper(c) != mytoupper(d)); } else { diff = (c != d); @@ -60,21 +67,24 @@ size_t findNoodFragOffset(const u8 *lit, size_t len, bool nocase) { return offset; } -/** \brief Construct a Noodle matcher for the given literal. */ -aligned_unique_ptr noodBuildTable(const u8 *lit, size_t len, - bool nocase, u32 id) { - size_t noodle_len = sizeof(noodTable) + len; - aligned_unique_ptr n = - aligned_zmalloc_unique(noodle_len); +aligned_unique_ptr noodBuildTable(const hwlmLiteral &lit) { + if (!lit.msk.empty()) { + DEBUG_PRINTF("noodle can't handle supplementary masks\n"); + return nullptr; + } + + const auto &s = lit.s; + size_t noodle_len = sizeof(noodTable) + s.length(); + auto n = aligned_zmalloc_unique(noodle_len); assert(n); - size_t key_offset = findNoodFragOffset(lit, len, nocase); + size_t key_offset = findNoodFragOffset(lit); - n->id = id; - n->len = verify_u32(len); + n->id = lit.id; + n->len = verify_u32(s.length()); n->key_offset = verify_u32(key_offset); - n->nocase = nocase ? 1 : 0; - memcpy(n->str, lit, len); + n->nocase = lit.nocase ? 1 : 0; + memcpy(n->str, s.c_str(), s.length()); return n; } diff --git a/src/hwlm/noodle_build.h b/src/hwlm/noodle_build.h index 3e8f5cb5..1a41695f 100644 --- a/src/hwlm/noodle_build.h +++ b/src/hwlm/noodle_build.h @@ -40,9 +40,10 @@ struct noodTable; namespace ue2 { +struct hwlmLiteral; + /** \brief Construct a Noodle matcher for the given literal. */ -ue2::aligned_unique_ptr noodBuildTable(const u8 *lit, size_t len, - bool nocase, u32 id); +ue2::aligned_unique_ptr noodBuildTable(const hwlmLiteral &lit); size_t noodSize(const noodTable *n); diff --git a/unit/internal/noodle.cpp b/unit/internal/noodle.cpp index d1d9a1b4..5df66236 100644 --- a/unit/internal/noodle.cpp +++ b/unit/internal/noodle.cpp @@ -32,6 +32,7 @@ #include "hwlm/noodle_build.h" #include "hwlm/noodle_engine.h" #include "hwlm/hwlm.h" +#include "hwlm/hwlm_literal.h" #include "util/alloc.h" #include "util/ue2string.h" @@ -65,15 +66,11 @@ hwlmcb_rv_t hlmSimpleCallback(size_t from, size_t to, u32 id, void *context) { } static -void noodleMatch(const u8 *data, size_t data_len, const char *lit, +void noodleMatch(const u8 *data, size_t data_len, const char *lit_str, size_t lit_len, char nocase, HWLMCallback cb, void *ctxt) { - // Coerce to upper-case if nocase. - std::string s(lit, lit_len); - if (nocase) { - upperString(s); - } - - auto n = noodBuildTable((const u8 *)s.c_str(), s.length(), nocase, 0); + u32 id = 1000; + hwlmLiteral lit(std::string(lit_str, lit_len), nocase, id); + auto n = noodBuildTable(lit); ASSERT_TRUE(n != nullptr); hwlm_error_t rv;