/* * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "src/protozero/filtering/message_filter.h" #include "perfetto/base/logging.h" #include "perfetto/protozero/proto_utils.h" #include "src/protozero/filtering/string_filter.h" namespace protozero { namespace { // Inline helpers to append proto fields in output. They are the equivalent of // the protozero::Message::AppendXXX() fields but don't require building and // maintaining a full protozero::Message object or dealing with scattered // output slices. // All these functions assume there is enough space in the output buffer, which // should be always the case assuming that we don't end up generating more // output than input. inline void AppendVarInt(uint32_t field_id, uint64_t value, uint8_t** out) { … } // For fixed32 / fixed64. template <typename INT_T /* uint32_t | uint64_t*/> inline void AppendFixed(uint32_t field_id, INT_T value, uint8_t** out) { … } // For length-delimited (string, bytes) fields. Note: this function appends only // the proto preamble and the varint field that states the length of the payload // not the payload itself. // In the case of submessages, the caller needs to re-write the length at the // end in the in the returned memory area. // The problem here is that, because of filtering, the length of a submessage // might be < original length (the original length is still an upper-bound). // Returns a pair with: (1) the pointer where the final length should be written // into, (2) the length of the size field. // The caller must write a redundant varint to match the original size (i.e. // needs to use WriteRedundantVarInt()). inline std::pair<uint8_t*, uint32_t> AppendLenDelim(uint32_t field_id, uint32_t len, uint8_t** out) { … } } // namespace MessageFilter::MessageFilter(Config config) : … { … } MessageFilter::MessageFilter() : … { … } MessageFilter::~MessageFilter() = default; bool MessageFilter::Config::LoadFilterBytecode(const void* filter_data, size_t len) { … } bool MessageFilter::Config::SetFilterRoot( std::initializer_list<uint32_t> field_ids) { … } MessageFilter::FilteredMessage MessageFilter::FilterMessageFragments( const InputSlice* slices, size_t num_slices) { … } void MessageFilter::FilterOneByte(uint8_t octet) { … } void MessageFilter::SetUnrecoverableErrorState() { … } void MessageFilter::IncrementCurrentFieldUsage(uint32_t field_id, bool allowed) { … } } // namespace protozero