mirror of
https://github.com/ossrs/srs.git
synced 2025-02-15 04:42:04 +00:00
For the DJI M30, there is a bug where empty NALU packets with a size of zero are causing issues with HLS streaming. This bug leads to random unpublish events due to the SRS disconnecting the connection for the HLS module when it fails to handle empty NALU packets. To address this bug, we have patched the system to ignore any empty NALU packets with a size of zero. Additionally, we have created a tool in the srs-bench to replay pcapng files captured by tcpdump or Wireshark. We have also added utest using mprotect and asan to detect any memory corruption. It is important to note that this bug has been fixed in versions 4.0.2716477f31004
and 5.0.170939f6b484b
. This patch specifically addresses the issue in SRS 6.0. Please be aware that there is another commit related to this bug that partially fixes the issue but still leaves a small problem for asan to detect memory corruption. This commit,577cd299e1
, only ignores empty NALU packets but still reads beyond the memory. --------- Co-authored-by: chundonglinlin <chundonglinlin@163.com>
288 lines
6.3 KiB
Bash
288 lines
6.3 KiB
Bash
#!/bin/bash
|
|
# Copyright 2012 Google, Inc. All rights reserved.
|
|
|
|
# This script provides a simple way to run benchmarks against previous code and
|
|
# keep a log of how benchmarks change over time. When used with the --benchmark
|
|
# flag, it runs benchmarks from the current code and from the last commit run
|
|
# with --benchmark, then stores the results in the git commit description. We
|
|
# rerun the old benchmarks along with the new ones, since there's no guarantee
|
|
# that git commits will happen on the same machine, so machine differences could
|
|
# cause wildly inaccurate results.
|
|
#
|
|
# If you're making changes to 'gopacket' which could cause performance changes,
|
|
# you may be requested to use this commit script to make sure your changes don't
|
|
# have large detrimental effects (or to show off how awesome your performance
|
|
# improvements are).
|
|
#
|
|
# If not run with the --benchmark flag, this script is still very useful... it
|
|
# makes sure all the correct go formatting, building, and testing work as
|
|
# expected.
|
|
|
|
function Usage {
|
|
cat <<EOF
|
|
USAGE: $0 [--benchmark regexp] [--root] [--gen] <git commit flags...>
|
|
|
|
--benchmark: Run benchmark comparisons against last benchmark'd commit
|
|
--root: Run tests that require root priviledges
|
|
--gen: Generate code for MACs/ports by pulling down external data
|
|
|
|
Note, some 'git commit' flags are necessary, if all else fails, pass in -a
|
|
EOF
|
|
exit 1
|
|
}
|
|
|
|
BENCH=""
|
|
GEN=""
|
|
ROOT=""
|
|
while [ ! -z "$1" ]; do
|
|
case "$1" in
|
|
"--benchmark")
|
|
BENCH="$2"
|
|
shift
|
|
shift
|
|
;;
|
|
"--gen")
|
|
GEN="yes"
|
|
shift
|
|
;;
|
|
"--root")
|
|
ROOT="yes"
|
|
shift
|
|
;;
|
|
"--help")
|
|
Usage
|
|
;;
|
|
"-h")
|
|
Usage
|
|
;;
|
|
"help")
|
|
Usage
|
|
;;
|
|
*)
|
|
break
|
|
;;
|
|
esac
|
|
done
|
|
|
|
function Root {
|
|
if [ ! -z "$ROOT" ]; then
|
|
local exec="$1"
|
|
# Some folks (like me) keep source code in places inaccessible by root (like
|
|
# NFS), so to make sure things run smoothly we copy them to a /tmp location.
|
|
local tmpfile="$(mktemp -t gopacket_XXXXXXXX)"
|
|
echo "Running root test executable $exec as $tmpfile"
|
|
cp "$exec" "$tmpfile"
|
|
chmod a+x "$tmpfile"
|
|
shift
|
|
sudo "$tmpfile" "$@"
|
|
fi
|
|
}
|
|
|
|
if [ "$#" -eq "0" ]; then
|
|
Usage
|
|
fi
|
|
|
|
cd $(dirname $0)
|
|
|
|
# Check for copyright notices.
|
|
for filename in $(find ./ -type f -name '*.go'); do
|
|
if ! head -n 1 "$filename" | grep -q Copyright; then
|
|
echo "File '$filename' may not have copyright notice"
|
|
exit 1
|
|
fi
|
|
done
|
|
|
|
set -e
|
|
set -x
|
|
|
|
if [ ! -z "$ROOT" ]; then
|
|
echo "Running SUDO to get root priviledges for root tests"
|
|
sudo echo "have root"
|
|
fi
|
|
|
|
if [ ! -z "$GEN" ]; then
|
|
pushd macs
|
|
go run gen.go | gofmt > valid_mac_prefixes.go
|
|
popd
|
|
pushd layers
|
|
go run gen.go | gofmt > iana_ports.go
|
|
go run gen2.go | gofmt > enums_generated.go
|
|
popd
|
|
fi
|
|
|
|
# Make sure everything is formatted, compiles, and tests pass.
|
|
go fmt ./...
|
|
go test -i ./... 2>/dev/null >/dev/null || true
|
|
go test
|
|
go build
|
|
pushd examples/bytediff
|
|
go build
|
|
popd
|
|
if [ -f /usr/include/pcap.h ]; then
|
|
pushd pcap
|
|
go test ./...
|
|
go build ./...
|
|
go build pcap_tester.go
|
|
Root pcap_tester --mode=basic
|
|
Root pcap_tester --mode=filtered
|
|
Root pcap_tester --mode=timestamp || echo "You might not support timestamp sources"
|
|
popd
|
|
pushd examples/afpacket
|
|
go build
|
|
popd
|
|
pushd examples/pcapdump
|
|
go build
|
|
popd
|
|
pushd examples/arpscan
|
|
go build
|
|
popd
|
|
pushd examples/bidirectional
|
|
go build
|
|
popd
|
|
pushd examples/synscan
|
|
go build
|
|
popd
|
|
pushd examples/httpassembly
|
|
go build
|
|
popd
|
|
pushd examples/statsassembly
|
|
go build
|
|
popd
|
|
fi
|
|
pushd macs
|
|
go test ./...
|
|
gofmt -w gen.go
|
|
go build gen.go
|
|
popd
|
|
pushd tcpassembly
|
|
go test ./...
|
|
popd
|
|
pushd reassembly
|
|
go test ./...
|
|
popd
|
|
pushd layers
|
|
gofmt -w gen.go
|
|
go build gen.go
|
|
go test ./...
|
|
popd
|
|
pushd pcapgo
|
|
go test ./...
|
|
go build ./...
|
|
popd
|
|
if [ -f /usr/include/linux/if_packet.h ]; then
|
|
if grep -q TPACKET_V3 /usr/include/linux/if_packet.h; then
|
|
pushd afpacket
|
|
go build ./...
|
|
go test ./...
|
|
popd
|
|
fi
|
|
fi
|
|
if [ -f /usr/include/pfring.h ]; then
|
|
pushd pfring
|
|
go test ./...
|
|
go build ./...
|
|
popd
|
|
pushd examples/pfdump
|
|
go build
|
|
popd
|
|
fi
|
|
pushd ip4defrag
|
|
go test ./...
|
|
popd
|
|
pushd defrag
|
|
go test ./...
|
|
popd
|
|
|
|
for travis_script in `ls .travis.*.sh`; do
|
|
./$travis_script
|
|
done
|
|
|
|
# Run our initial commit
|
|
git commit "$@"
|
|
|
|
if [ -z "$BENCH" ]; then
|
|
set +x
|
|
echo "We're not benchmarking and we've committed... we're done!"
|
|
exit
|
|
fi
|
|
|
|
### If we get here, we want to run benchmarks from current commit, and compare
|
|
### then to benchmarks from the last --benchmark commit.
|
|
|
|
# Get our current branch.
|
|
BRANCH="$(git branch | grep '^*' | awk '{print $2}')"
|
|
|
|
# File we're going to build our commit description in.
|
|
COMMIT_FILE="$(mktemp /tmp/tmp.XXXXXXXX)"
|
|
|
|
# Add the word "BENCH" to the start of the git commit.
|
|
echo -n "BENCH " > $COMMIT_FILE
|
|
|
|
# Get the current description... there must be an easier way.
|
|
git log -n 1 | grep '^ ' | sed 's/^ //' >> $COMMIT_FILE
|
|
|
|
# Get the commit sha for the last benchmark commit
|
|
PREV=$(git log -n 1 --grep='BENCHMARK_MARKER_DO_NOT_CHANGE' | head -n 1 | awk '{print $2}')
|
|
|
|
## Run current benchmarks
|
|
|
|
cat >> $COMMIT_FILE <<EOF
|
|
|
|
|
|
----------------------------------------------------------
|
|
BENCHMARK_MARKER_DO_NOT_CHANGE
|
|
----------------------------------------------------------
|
|
|
|
Go version $(go version)
|
|
|
|
|
|
TEST BENCHMARKS "$BENCH"
|
|
EOF
|
|
# go seems to have trouble with 'go test --bench=. ./...'
|
|
go test --test.bench="$BENCH" 2>&1 | tee -a $COMMIT_FILE
|
|
pushd layers
|
|
go test --test.bench="$BENCH" 2>&1 | tee -a $COMMIT_FILE
|
|
popd
|
|
cat >> $COMMIT_FILE <<EOF
|
|
|
|
|
|
PCAP BENCHMARK
|
|
EOF
|
|
if [ "$BENCH" -eq ".*" ]; then
|
|
go run pcap/gopacket_benchmark/*.go 2>&1 | tee -a $COMMIT_FILE
|
|
fi
|
|
|
|
|
|
|
|
## Reset to last benchmark commit, run benchmarks
|
|
|
|
git checkout $PREV
|
|
|
|
cat >> $COMMIT_FILE <<EOF
|
|
----------------------------------------------------------
|
|
BENCHMARKING AGAINST COMMIT $PREV
|
|
----------------------------------------------------------
|
|
|
|
|
|
OLD TEST BENCHMARKS
|
|
EOF
|
|
# go seems to have trouble with 'go test --bench=. ./...'
|
|
go test --test.bench="$BENCH" 2>&1 | tee -a $COMMIT_FILE
|
|
pushd layers
|
|
go test --test.bench="$BENCH" 2>&1 | tee -a $COMMIT_FILE
|
|
popd
|
|
cat >> $COMMIT_FILE <<EOF
|
|
|
|
|
|
OLD PCAP BENCHMARK
|
|
EOF
|
|
if [ "$BENCH" -eq ".*" ]; then
|
|
go run pcap/gopacket_benchmark/*.go 2>&1 | tee -a $COMMIT_FILE
|
|
fi
|
|
|
|
|
|
|
|
## Reset back to the most recent commit, edit the commit message by appending
|
|
## benchmark results.
|
|
git checkout $BRANCH
|
|
git commit --amend -F $COMMIT_FILE
|