diff --git a/configure.ac b/configure.ac index a135e01..f565b87 100644 --- a/configure.ac +++ b/configure.ac @@ -290,54 +290,28 @@ AC_SUBST([catch_LIBS]) # AC_ARG_WITH([bundled-pegtl], AS_HELP_STRING([--with-bundled-pegtl], [Build using the bundled PEGTL library]), [with_bundled_pegtl=$withval], [with_bundled_pegtl=no]) if test "x$with_bundled_pegtl" = xyes; then - pegtl_CFLAGS="-I\$(top_srcdir)/src/ThirdParty/PEGTL" - pegtl_AC_CFLAGS="-I$srcdir/src/ThirdParty/PEGTL" + pegtl_CFLAGS="-I\$(top_srcdir)/src/ThirdParty/PEGTL/include" + pegtl_AC_CFLAGS="-I$srcdir/src/ThirdParty/PEGTL/include" pegtl_LIBS="" AC_MSG_NOTICE([Using bundled PEGTL library]) pegtl_summary="bundled; $pegtl_CFLAGS $pegtl_LIBS" else - SAVE_CPPFLAGS=$CPPFLAGS - CPPFLAGS="-std=c++11 $CPPFLAGS" - AC_LANG_PUSH([C++]) - AC_CHECK_HEADER([pegtl.hh], [], [AC_MSG_FAILURE(pegtl.hh not found or not usable. Re-run with --with-bundled-pegtl to use the bundled library.)]) - AC_LANG_POP pegtl_CFLAGS="" pegtl_AC_CFLAGS="" pegtl_LIBS="" - CPPFLAGS=$SAVE_CPPFLAGS pegtl_summary="system-wide; $pegtl_CFLAGS $pegtl_LIBS" fi AC_SUBST([pegtl_CFLAGS]) AC_SUBST([pegtl_AC_CFLAGS]) AC_SUBST([pegtl_LIBS]) -# -# Check whether the available PEGTL library is compatible -# with version 1.3.1 or older. -# SAVE_CPPFLAGS=$CPPFLAGS -CPPFLAGS="-std=c++11 $pegtl_AC_CFLAGS" +CPPFLAGS="-std=c++11 $CPPFLAGS $pegtl_AC_CFLAGS" AC_LANG_PUSH([C++]) -AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ -#include -#include -int main(void) -{ - struct grammar - : pegtl::one<'g'> {}; - try { - pegtl::parse_string(std::string(), std::string()); - } catch(const pegtl::parse_error& ex) { - auto b = ex.positions[0].byte_in_line; - } - return 0; -} -]])], -[have_pegtl_lte_131=no], [have_pegtl_lte_131=yes]) +AC_CHECK_HEADER([tao/pegtl.hpp], + [AC_DEFINE([HAVE_TAO_PEGTL_HPP], [1], [PEGTL header file with .hpp extension is present])], + [AC_MSG_FAILURE(PEGTL header file not found or not usable. Re-run with --with-bundled-pegtl to use the bundled library.)]) AC_LANG_POP -if test "x$have_pegtl_lte_131" = xyes; then - AC_DEFINE([HAVE_PEGTL_LTE_1_3_1], [1], [PEGTL version less than or equal to 1.3.1]) -fi CPPFLAGS=$SAVE_CPPFLAGS # diff --git a/src/Library/RuleParser/Actions.hpp b/src/Library/RuleParser/Actions.hpp index 3e185f4..2b21bd2 100644 --- a/src/Library/RuleParser/Actions.hpp +++ b/src/Library/RuleParser/Actions.hpp @@ -24,7 +24,7 @@ #include "Utility.hpp" #include "Common/Utility.hpp" -#include +#include namespace usbguard { @@ -47,7 +47,7 @@ namespace usbguard struct str_if; template - struct rule_parser_actions : pegtl::nothing {}; + struct rule_parser_actions : tao::pegtl::nothing {}; template<> struct rule_parser_actions { @@ -58,7 +58,7 @@ namespace usbguard rule.setTarget(Rule::targetFromString(in.string())); } catch (const std::exception& ex) { - throw pegtl::parse_error(ex.what(), in); + throw tao::pegtl::parse_error(ex.what(), in); } } }; @@ -75,7 +75,7 @@ namespace usbguard rule.setDeviceID(device_id); } catch (const std::exception& ex) { - throw pegtl::parse_error(ex.what(), in); + throw tao::pegtl::parse_error(ex.what(), in); } } }; @@ -87,7 +87,7 @@ namespace usbguard } template - struct name_actions : pegtl::nothing {}; + struct name_actions : tao::pegtl::nothing {}; template<> struct name_actions { @@ -95,7 +95,7 @@ namespace usbguard static void apply(const Input& in, Rule& rule) { if (!rule.attributeName().empty()) { - throw pegtl::parse_error("name attribute already defined", in); + throw tao::pegtl::parse_error("name attribute already defined", in); } } }; @@ -109,7 +109,7 @@ namespace usbguard rule.attributeName().append(stringValueFromRule(in.string())); } catch (const std::exception& ex) { - throw pegtl::parse_error(ex.what(), in); + throw tao::pegtl::parse_error(ex.what(), in); } } }; @@ -123,13 +123,13 @@ namespace usbguard rule.attributeName().setSetOperator(Rule::setOperatorFromString(in.string())); } catch (const std::exception& ex) { - throw pegtl::parse_error(ex.what(), in); + throw tao::pegtl::parse_error(ex.what(), in); } } }; template - struct id_actions : pegtl::nothing {}; + struct id_actions : tao::pegtl::nothing {}; template<> struct id_actions { @@ -137,7 +137,7 @@ namespace usbguard static void apply(const Input& in, Rule& rule) { if (!rule.attributeDeviceID().empty()) { - throw pegtl::parse_error("id attribute already defined", in); + throw tao::pegtl::parse_error("id attribute already defined", in); } } }; @@ -154,7 +154,7 @@ namespace usbguard rule.attributeDeviceID().append(device_id); } catch (const std::exception& ex) { - throw pegtl::parse_error(ex.what(), in); + throw tao::pegtl::parse_error(ex.what(), in); } } }; @@ -168,13 +168,13 @@ namespace usbguard rule.attributeDeviceID().setSetOperator(Rule::setOperatorFromString(in.string())); } catch (const std::exception& ex) { - throw pegtl::parse_error(ex.what(), in); + throw tao::pegtl::parse_error(ex.what(), in); } } }; template - struct hash_actions : pegtl::nothing {}; + struct hash_actions : tao::pegtl::nothing {}; template<> struct hash_actions { @@ -182,7 +182,7 @@ namespace usbguard static void apply(const Input& in, Rule& rule) { if (!rule.attributeHash().empty()) { - throw pegtl::parse_error("hash attribute already defined", in); + throw tao::pegtl::parse_error("hash attribute already defined", in); } } }; @@ -196,7 +196,7 @@ namespace usbguard rule.attributeHash().append(stringValueFromRule(in.string())); } catch (const std::exception& ex) { - throw pegtl::parse_error(ex.what(), in); + throw tao::pegtl::parse_error(ex.what(), in); } } }; @@ -210,13 +210,13 @@ namespace usbguard rule.attributeHash().setSetOperator(Rule::setOperatorFromString(in.string())); } catch (const std::exception& ex) { - throw pegtl::parse_error(ex.what(), in); + throw tao::pegtl::parse_error(ex.what(), in); } } }; template - struct parent_hash_actions : pegtl::nothing {}; + struct parent_hash_actions : tao::pegtl::nothing {}; template<> struct parent_hash_actions { @@ -224,7 +224,7 @@ namespace usbguard static void apply(const Input& in, Rule& rule) { if (!rule.attributeParentHash().empty()) { - throw pegtl::parse_error("parent-hash attribute already defined", in); + throw tao::pegtl::parse_error("parent-hash attribute already defined", in); } } }; @@ -238,7 +238,7 @@ namespace usbguard rule.attributeParentHash().append(stringValueFromRule(in.string())); } catch (const std::exception& ex) { - throw pegtl::parse_error(ex.what(), in); + throw tao::pegtl::parse_error(ex.what(), in); } } }; @@ -252,13 +252,13 @@ namespace usbguard rule.attributeParentHash().setSetOperator(Rule::setOperatorFromString(in.string())); } catch (const std::exception& ex) { - throw pegtl::parse_error(ex.what(), in); + throw tao::pegtl::parse_error(ex.what(), in); } } }; template - struct serial_actions : pegtl::nothing {}; + struct serial_actions : tao::pegtl::nothing {}; template<> struct serial_actions { @@ -266,7 +266,7 @@ namespace usbguard static void apply(const Input& in, Rule& rule) { if (!rule.attributeSerial().empty()) { - throw pegtl::parse_error("serial attribute already defined", in); + throw tao::pegtl::parse_error("serial attribute already defined", in); } } }; @@ -280,7 +280,7 @@ namespace usbguard rule.attributeSerial().append(stringValueFromRule(in.string())); } catch (const std::exception& ex) { - throw pegtl::parse_error(ex.what(), in); + throw tao::pegtl::parse_error(ex.what(), in); } } }; @@ -294,13 +294,13 @@ namespace usbguard rule.attributeSerial().setSetOperator(Rule::setOperatorFromString(in.string())); } catch (const std::exception& ex) { - throw pegtl::parse_error(ex.what(), in); + throw tao::pegtl::parse_error(ex.what(), in); } } }; template - struct via_port_actions : pegtl::nothing {}; + struct via_port_actions : tao::pegtl::nothing {}; template<> struct via_port_actions { @@ -308,7 +308,7 @@ namespace usbguard static void apply(const Input& in, Rule& rule) { if (!rule.attributeViaPort().empty()) { - throw pegtl::parse_error("via-port attribute already defined", in); + throw tao::pegtl::parse_error("via-port attribute already defined", in); } } }; @@ -322,7 +322,7 @@ namespace usbguard rule.attributeViaPort().append(stringValueFromRule(in.string())); } catch (const std::exception& ex) { - throw pegtl::parse_error(ex.what(), in); + throw tao::pegtl::parse_error(ex.what(), in); } } }; @@ -336,13 +336,13 @@ namespace usbguard rule.attributeViaPort().setSetOperator(Rule::setOperatorFromString(in.string())); } catch (const std::exception& ex) { - throw pegtl::parse_error(ex.what(), in); + throw tao::pegtl::parse_error(ex.what(), in); } } }; template - struct with_interface_actions : pegtl::nothing {}; + struct with_interface_actions : tao::pegtl::nothing {}; template<> struct with_interface_actions { @@ -350,7 +350,7 @@ namespace usbguard static void apply(const Input& in, Rule& rule) { if (!rule.attributeWithInterface().empty()) { - throw pegtl::parse_error("with-interface attribute already defined", in); + throw tao::pegtl::parse_error("with-interface attribute already defined", in); } } }; @@ -365,7 +365,7 @@ namespace usbguard rule.attributeWithInterface().append(interface_type); } catch (const std::exception& ex) { - throw pegtl::parse_error(ex.what(), in); + throw tao::pegtl::parse_error(ex.what(), in); } } }; @@ -379,13 +379,13 @@ namespace usbguard rule.attributeWithInterface().setSetOperator(Rule::setOperatorFromString(in.string())); } catch (const std::exception& ex) { - throw pegtl::parse_error(ex.what(), in); + throw tao::pegtl::parse_error(ex.what(), in); } } }; template - struct condition_actions : pegtl::nothing {}; + struct condition_actions : tao::pegtl::nothing {}; template<> struct condition_actions { @@ -393,7 +393,7 @@ namespace usbguard static void apply(const Input& in, Rule& rule) { if (!rule.attributeConditions().empty()) { - throw pegtl::parse_error("conditions already defined", in); + throw tao::pegtl::parse_error("conditions already defined", in); } } }; @@ -407,7 +407,7 @@ namespace usbguard rule.attributeConditions().append(RuleCondition(in.string())); } catch (const std::exception& ex) { - throw pegtl::parse_error(ex.what(), in); + throw tao::pegtl::parse_error(ex.what(), in); } } }; @@ -421,7 +421,7 @@ namespace usbguard rule.attributeConditions().setSetOperator(Rule::setOperatorFromString(in.string())); } catch (const std::exception& ex) { - throw pegtl::parse_error(ex.what(), in); + throw tao::pegtl::parse_error(ex.what(), in); } } }; diff --git a/src/Library/RuleParser/Grammar.hpp b/src/Library/RuleParser/Grammar.hpp index 9bd4a15..4d785c0 100644 --- a/src/Library/RuleParser/Grammar.hpp +++ b/src/Library/RuleParser/Grammar.hpp @@ -22,37 +22,37 @@ #endif #include "Actions.hpp" -#include -using namespace pegtl; +#include namespace usbguard { namespace RuleParser { + using namespace tao::pegtl; /* * Rule language keywords */ - struct str_allow : pegtl_string_t("allow") {}; - struct str_block : pegtl_string_t("block") {}; - struct str_reject : pegtl_string_t("reject") {}; - struct str_match : pegtl_string_t("match") {}; - struct str_device : pegtl_string_t("device") {}; - - struct str_name : pegtl_string_t("name") {}; - struct str_hash : pegtl_string_t("hash") {}; - struct str_parent_hash : pegtl_string_t("parent-hash") {}; - struct str_via_port : pegtl_string_t("via-port") {}; - struct str_with_interface : pegtl_string_t("with-interface") {}; - struct str_serial : pegtl_string_t("serial") {}; - struct str_if : pegtl_string_t("if") {}; - struct str_id : pegtl_string_t("id") {}; - - struct str_all_of : pegtl_string_t("all-of") {}; - struct str_one_of : pegtl_string_t("one-of") {}; - struct str_none_of : pegtl_string_t("none-of") {}; - struct str_equals : pegtl_string_t("equals") {}; - struct str_equals_ordered : pegtl_string_t("equals-ordered") {}; + struct str_allow : TAOCPP_PEGTL_STRING("allow") {}; + struct str_block : TAOCPP_PEGTL_STRING("block") {}; + struct str_reject : TAOCPP_PEGTL_STRING("reject") {}; + struct str_match : TAOCPP_PEGTL_STRING("match") {}; + struct str_device : TAOCPP_PEGTL_STRING("device") {}; + + struct str_name : TAOCPP_PEGTL_STRING("name") {}; + struct str_hash : TAOCPP_PEGTL_STRING("hash") {}; + struct str_parent_hash : TAOCPP_PEGTL_STRING("parent-hash") {}; + struct str_via_port : TAOCPP_PEGTL_STRING("via-port") {}; + struct str_with_interface : TAOCPP_PEGTL_STRING("with-interface") {}; + struct str_serial : TAOCPP_PEGTL_STRING("serial") {}; + struct str_if : TAOCPP_PEGTL_STRING("if") {}; + struct str_id : TAOCPP_PEGTL_STRING("id") {}; + + struct str_all_of : TAOCPP_PEGTL_STRING("all-of") {}; + struct str_one_of : TAOCPP_PEGTL_STRING("one-of") {}; + struct str_none_of : TAOCPP_PEGTL_STRING("none-of") {}; + struct str_equals : TAOCPP_PEGTL_STRING("equals") {}; + struct str_equals_ordered : TAOCPP_PEGTL_STRING("equals-ordered") {}; /* * Generic rule attribute diff --git a/src/Library/UEventParser.cpp b/src/Library/UEventParser.cpp index 2e0ce39..aebe948 100644 --- a/src/Library/UEventParser.cpp +++ b/src/Library/UEventParser.cpp @@ -27,7 +27,9 @@ #include "usbguard/Logger.hpp" #include -#include + +#include +using namespace tao; namespace usbguard { @@ -114,25 +116,14 @@ namespace usbguard void parseUEventFromString(const std::string& uevent_string, UEvent& uevent, bool trace) { try { -#if HAVE_PEGTL_LTE_1_3_1 + tao::pegtl::string_input<> in(uevent_string, std::string()); if (!trace) { - pegtl::parse(uevent_string, std::string(), uevent); + tao::pegtl::parse(in, uevent); } else { - pegtl::parse(uevent_string, std::string(), uevent); - } - -#else - - if (!trace) { - pegtl::parse_string(uevent_string, std::string(), uevent); + tao::pegtl::parse(in, uevent); } - else { - pegtl::parse_string(uevent_string, std::string(), uevent); - } - -#endif } catch (...) { throw; diff --git a/src/Library/UEventParser.hpp b/src/Library/UEventParser.hpp index 856d5ff..4261bd5 100644 --- a/src/Library/UEventParser.hpp +++ b/src/Library/UEventParser.hpp @@ -23,9 +23,7 @@ #include "usbguard/Typedefs.hpp" -#include - -using namespace pegtl; +#include namespace usbguard { @@ -33,6 +31,8 @@ namespace usbguard namespace UEventParser { + using namespace tao::pegtl; + struct value : seq, star>> {}; diff --git a/src/Library/public/usbguard/RuleParser.cpp b/src/Library/public/usbguard/RuleParser.cpp index 4061e01..140bf14 100644 --- a/src/Library/public/usbguard/RuleParser.cpp +++ b/src/Library/public/usbguard/RuleParser.cpp @@ -34,7 +34,7 @@ #include #include -#include +#include namespace usbguard { @@ -42,35 +42,21 @@ namespace usbguard { try { Rule rule; -#if HAVE_PEGTL_LTE_1_3_1 + tao::pegtl::string_input<> input(rule_spec, file); if (!trace) { - pegtl::parse(rule_spec, file, rule); + tao::pegtl::parse(input, rule); } else { - pegtl::parse(rule_spec, file, rule); + tao::pegtl::parse(input, rule); } -#else - - if (!trace) { - pegtl::parse_string(rule_spec, file, rule); - } - else { - pegtl::parse_string(rule_spec, file, rule); - } - -#endif return rule; } - catch (const pegtl::parse_error& ex) { + catch (const tao::pegtl::parse_error& ex) { RuleParserError error(rule_spec); error.setHint(ex.what()); -#if HAVE_PEGTL_LTE_1_3_1 - error.setOffset(ex.positions[0].column); -#else error.setOffset(ex.positions[0].byte_in_line); -#endif if (!file.empty() || line != 0) { error.setFileInfo(file, line); -- 2.13.6