/* * Copyright (C) 2018 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/tracing/service/packet_stream_validator.h" #include <stddef.h> #include <cinttypes> #include "perfetto/base/logging.h" #include "perfetto/ext/base/utils.h" #include "perfetto/protozero/proto_utils.h" #include "protos/perfetto/trace/trace_packet.pbzero.h" namespace perfetto { namespace { ProtoWireType; const uint32_t kReservedFieldIds[] = …; // This translation unit is quite subtle and perf-sensitive. Remember to check // BM_PacketStreamValidator in perfetto_benchmarks when making changes. // Checks that a packet, spread over several slices, is well-formed and doesn't // contain reserved top-level fields. // The checking logic is based on a state-machine that skips the fields' payload // and operates as follows: // +-------------------------------+ <-------------------------+ // +----------> | Read field preamble (varint) | <----------------------+ | // | +-------------------------------+ | | // | | | | | | // | <Varint> <Fixed 32/64> <Length-delimited field> | | // | V | V | | // | +------------------+ | +--------------+ | | // | | Read field value | | | Read length | | | // | | (another varint) | | | (varint) | | | // | +------------------+ | +--------------+ | | // | | V V | | // +-----------+ +----------------+ +-----------------+ | | // | Skip 4/8 Bytes | | Skip $len Bytes |-------+ | // +----------------+ +-----------------+ | // | | // +------------------------------------------+ class ProtoFieldParserFSM { … }; } // namespace // static bool PacketStreamValidator::Validate(const Slices& slices) { … } } // namespace perfetto