aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArne Juul <arnej@vespa.ai>2023-11-06 09:49:15 +0000
committerArne Juul <arnej@vespa.ai>2023-11-06 11:43:58 +0000
commit601f631c07eeb3aa4f10e264955156d12549a5cf (patch)
tree4aaa5b4b46bd9ef0d7526aab753cd00c4dcf9be7
parent036ec7b3f7a4ff3ff8b4ef7cbeabdfbfc1f72e27 (diff)
escape binary characters
-rw-r--r--searchlib/src/vespa/searchlib/engine/proto_converter.cpp24
1 files changed, 22 insertions, 2 deletions
diff --git a/searchlib/src/vespa/searchlib/engine/proto_converter.cpp b/searchlib/src/vespa/searchlib/engine/proto_converter.cpp
index 59e4b6e99f8..1fd8ff1e628 100644
--- a/searchlib/src/vespa/searchlib/engine/proto_converter.cpp
+++ b/searchlib/src/vespa/searchlib/engine/proto_converter.cpp
@@ -15,6 +15,26 @@ namespace search::engine {
namespace {
+std::string escape_message(const vespalib::string &item) {
+ static const char hexdigits[] = "0123456789ABCDEF";
+ std::string r;
+ r.reserve(item.size());
+ for (char c : item) {
+ if (c == '\\') {
+ r.push_back(c);
+ r.push_back(c);
+ } else if (c < 32 || c > 127) {
+ r.push_back('\\');
+ r.push_back('x');
+ r.push_back(hexdigits[0xF & (c >> 4)]);
+ r.push_back(hexdigits[0xF & c]);
+ } else {
+ r.push_back(c);
+ }
+ }
+ return r;
+}
+
template <typename T>
vespalib::string make_sort_spec(const T &sorting) {
vespalib::string spec;
@@ -166,7 +186,7 @@ ProtoConverter::search_reply_to_proto(const SearchReply &reply, ProtoSearchReply
reply.my_issues->for_each_message([&](const vespalib::string &err_msg)
{
auto *err_obj = proto.add_errors();
- err_obj->set_message(err_msg);
+ err_obj->set_message(escape_message(err_msg));
});
}
}
@@ -223,7 +243,7 @@ ProtoConverter::docsum_reply_to_proto(const DocsumReply &reply, ProtoDocsumReply
reply.issues().for_each_message([&](const vespalib::string &err_msg)
{
auto *err_obj = proto.add_errors();
- err_obj->set_message(err_msg);
+ err_obj->set_message(escape_message(err_msg));
});
}
}