mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-10 21:23:58 +01:00
Merge branch 'maint-0.3.3' of https://git.torproject.org/tor into maint-0.3.3
This commit is contained in:
commit
0431bb61ca
351
.travis.yml
351
.travis.yml
@ -1,10 +1,207 @@
|
||||
language: c
|
||||
|
||||
## Comment out the compiler list for now to allow an explicit build
|
||||
## matrix.
|
||||
# compiler:
|
||||
# - gcc
|
||||
# - clang
|
||||
cache:
|
||||
ccache: true
|
||||
## cargo: true
|
||||
directories:
|
||||
- $HOME/.cargo
|
||||
## where we point CARGO_TARGET_DIR in all our cargo invocations
|
||||
- $TRAVIS_BUILD_DIR/src/rust/target
|
||||
|
||||
compiler:
|
||||
- gcc
|
||||
- clang
|
||||
|
||||
os:
|
||||
- linux
|
||||
- osx
|
||||
|
||||
## The build matrix in the following stanza expands into builds for each
|
||||
## OS and compiler.
|
||||
env:
|
||||
global:
|
||||
## The Travis CI environment allows us two cores, so let's use both.
|
||||
- MAKEFLAGS="-j 2"
|
||||
## We turn on hardening by default
|
||||
## Also known as --enable-fragile-hardening in 0.3.0.3-alpha and later
|
||||
- HARDENING_OPTIONS="--enable-expensive-hardening"
|
||||
## We turn off asciidoc by default, because it's slow
|
||||
- ASCIIDOC_OPTIONS="--disable-asciidoc"
|
||||
matrix:
|
||||
## We want to use each build option at least once
|
||||
##
|
||||
## We don't list default variable values, because we set the defaults
|
||||
## in global (or the default is unset)
|
||||
-
|
||||
## We turn off hardening for Rust builds, because they are incompatible,
|
||||
## and it's going to take a while for them to be fixed. See:
|
||||
## https:/trac.torproject.org/projects/tor/ticket/25386
|
||||
## https:/trac.torproject.org/projects/tor/ticket/26398
|
||||
## TOR_RUST_DEPENDENCIES is spelt RUST_DEPENDENCIES in 0.3.2
|
||||
- RUST_OPTIONS="--enable-rust" TOR_RUST_DEPENDENCIES=true HARDENING_OPTIONS=""
|
||||
|
||||
matrix:
|
||||
## include creates builds with gcc, linux, sudo: false
|
||||
include:
|
||||
## We include a single coverage build with the best options for coverage
|
||||
- env: COVERAGE_OPTIONS="--enable-coverage" HARDENING_OPTIONS=""
|
||||
## We only want to check these build option combinations once
|
||||
## (they shouldn't vary by compiler or OS)
|
||||
## We run rust and coverage with hardening off, which seems like enough
|
||||
# - env: HARDENING_OPTIONS=""
|
||||
## We check asciidoc with distcheck, to make sure we remove doc products
|
||||
- env: DISTCHECK="yes" ASCIIDOC_OPTIONS=""
|
||||
## Check rust online with distcheck, to make sure we remove rust products
|
||||
## But without hardening (see above)
|
||||
- env: DISTCHECK="yes" RUST_OPTIONS="--enable-rust --enable-cargo-online-mode" HARDENING_OPTIONS=""
|
||||
|
||||
## Uncomment to allow the build to report success (with non-required
|
||||
## sub-builds continuing to run) if all required sub-builds have
|
||||
## succeeded. This is somewhat buggy currently: it can cause
|
||||
## duplicate notifications and prematurely report success if a
|
||||
## single sub-build has succeeded. See
|
||||
## https://github.com/travis-ci/travis-ci/issues/1696
|
||||
# fast_finish: true
|
||||
|
||||
## Careful! We use global envs, which makes it hard to exclude or
|
||||
## allow failures by env:
|
||||
## https://docs.travis-ci.com/user/customizing-the-build#matching-jobs-with-allow_failures
|
||||
exclude:
|
||||
## Clang doesn't work in containerized builds, see below.
|
||||
- compiler: clang
|
||||
sudo: false
|
||||
## Non-containerized gcc are slow and redundant.
|
||||
- compiler: gcc
|
||||
sudo: required
|
||||
## gcc on OSX is less useful, because the default compiler is clang.
|
||||
- compiler: gcc
|
||||
os: osx
|
||||
## gcc on Linux with no env is redundant, because all the custom builds use
|
||||
## gcc on Linux
|
||||
- compiler: gcc
|
||||
os: linux
|
||||
env:
|
||||
## offline rust builds for gcc on Linux are redundant, because we do an
|
||||
## online rust build for gcc on Linux
|
||||
- compiler: gcc
|
||||
os: linux
|
||||
## TOR_RUST_DEPENDENCIES is spelt RUST_DEPENDENCIES in 0.3.2
|
||||
env: RUST_OPTIONS="--enable-rust" TOR_RUST_DEPENDENCIES=true HARDENING_OPTIONS=""
|
||||
|
||||
## We don't need sudo. (The "apt:" stanza after this allows us to not need
|
||||
## sudo; otherwise, we would need it for getting dependencies.)
|
||||
##
|
||||
## But we use "sudo: required" to force non-containerized builds, working
|
||||
## around a Travis CI environment issue: clang LeakAnalyzer fails
|
||||
## because it requires ptrace and the containerized environment no
|
||||
## longer allows ptrace.
|
||||
## https://github.com/travis-ci/travis-ci/issues/9033
|
||||
##
|
||||
## In the matrix above, we exclude redundant combinations.
|
||||
sudo:
|
||||
- false
|
||||
- required
|
||||
|
||||
## (Linux only) Use the latest Linux image (Ubuntu Trusty)
|
||||
dist: trusty
|
||||
|
||||
## (Linux only) Download our dependencies
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
## Required dependencies
|
||||
- libevent-dev
|
||||
- zlib1g-dev
|
||||
## Optional dependencies
|
||||
- libcap-dev
|
||||
- liblzma-dev
|
||||
- libscrypt-dev
|
||||
- libseccomp-dev
|
||||
## zstd doesn't exist in Ubuntu Trusty
|
||||
#- libzstd
|
||||
## Conditional dependencies
|
||||
## Always installed, so we don't need sudo
|
||||
- asciidoc
|
||||
- docbook-xsl
|
||||
- docbook-xml
|
||||
- xmlto
|
||||
|
||||
## (OSX only) Use the default OSX image
|
||||
## See https://docs.travis-ci.com/user/reference/osx#os-x-version
|
||||
## Default is Xcode 9.4 on macOS 10.13 as of August 2018
|
||||
#osx_image: xcode9.4
|
||||
|
||||
before_install:
|
||||
## If we're on OSX, homebrew usually needs to be updated first
|
||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update; fi
|
||||
## We might be upgrading some useless packages, but that's better than missing an upgrade
|
||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew upgrade; fi
|
||||
## Create empty rust directories for non-Rust builds, so caching succeeds
|
||||
- if [[ "$RUST_OPTIONS" == "" ]]; then mkdir -p $HOME/.cargo $TRAVIS_BUILD_DIR/src/rust/target; fi
|
||||
|
||||
install:
|
||||
## If we're on OSX use brew to install ccache (ccache is automatically installed on Linux)
|
||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install ccache; fi
|
||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then export PATH="/usr/local/opt/ccache/libexec:$PATH"; fi
|
||||
## If we're on OSX use brew to install required dependencies (for Linux, see the "apt:" section above)
|
||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install libevent; fi
|
||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install openssl; fi
|
||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install pkg-config; fi
|
||||
## macOS comes with zlib by default, so the homebrew install is keg-only
|
||||
# - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install zlib; fi
|
||||
## If we're on OSX also install the optional dependencies
|
||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install libscrypt; fi
|
||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install xz; fi
|
||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install zstd; fi
|
||||
## If we're on OSX, OpenSSL is keg-only, so tor 0.2.9 and later need to be configured --with-openssl-dir= to build
|
||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then OPENSSL_OPTIONS=--with-openssl-dir=`brew --prefix openssl`; fi
|
||||
## Install conditional features
|
||||
## Install coveralls
|
||||
- if [[ "$COVERAGE_OPTIONS" != "" ]]; then pip install --user cpp-coveralls; fi
|
||||
## If we're on OSX, and using asciidoc, install asciidoc
|
||||
- if [[ "$ASCIIDOC_OPTIONS" == "" ]] && [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install asciidoc; fi
|
||||
- if [[ "$ASCIIDOC_OPTIONS" == "" ]] && [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install xmlto; fi
|
||||
- if [[ "$ASCIIDOC_OPTIONS" == "" ]] && [[ "$TRAVIS_OS_NAME" == "osx" ]]; then export XML_CATALOG_FILES="/usr/local/etc/xml/catalog"; fi
|
||||
## If we're using Rust, download rustup
|
||||
- if [[ "$RUST_OPTIONS" != "" ]]; then curl -Ssf -o rustup.sh https://sh.rustup.rs; fi
|
||||
## Install the stable channels of rustc and cargo and setup our toolchain environment
|
||||
- if [[ "$RUST_OPTIONS" != "" ]]; then sh rustup.sh -y --default-toolchain stable; fi
|
||||
- if [[ "$RUST_OPTIONS" != "" ]]; then source $HOME/.cargo/env; fi
|
||||
## If we're testing rust builds in offline-mode, then set up our vendored dependencies
|
||||
- if [[ "$TOR_RUST_DEPENDENCIES" == "true" ]]; then export TOR_RUST_DEPENDENCIES=$PWD/src/ext/rust/crates; fi
|
||||
##
|
||||
## Finally, list installed package versions
|
||||
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then dpkg-query --show; fi
|
||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew list --versions; fi
|
||||
## Get some info about rustup, rustc and cargo
|
||||
- if [[ "$RUST_OPTIONS" != "" ]]; then which rustup; fi
|
||||
- if [[ "$RUST_OPTIONS" != "" ]]; then which rustc; fi
|
||||
- if [[ "$RUST_OPTIONS" != "" ]]; then which cargo; fi
|
||||
- if [[ "$RUST_OPTIONS" != "" ]]; then rustup --version; fi
|
||||
- if [[ "$RUST_OPTIONS" != "" ]]; then rustc --version; fi
|
||||
- if [[ "$RUST_OPTIONS" != "" ]]; then cargo --version; fi
|
||||
|
||||
script:
|
||||
- ./autogen.sh
|
||||
- CONFIGURE_FLAGS="$ASCIIDOC_OPTIONS $COVERAGE_OPTIONS $HARDENING_OPTIONS $OPENSSL_OPTIONS $RUST_OPTIONS --enable-fatal-warnings --disable-silent-rules"
|
||||
- echo "Configure flags are $CONFIGURE_FLAGS"
|
||||
- ./configure $CONFIGURE_FLAGS
|
||||
## We run `make check` because that's what https://jenkins.torproject.org does.
|
||||
- if [[ "$DISTCHECK" == "" ]]; then make check; fi
|
||||
- if [[ "$DISTCHECK" != "" ]]; then make distcheck DISTCHECK_CONFIGURE_FLAGS="$CONFIGURE_FLAGS"; fi
|
||||
|
||||
after_failure:
|
||||
## configure will leave a log file with more details of config failures.
|
||||
## But the log is too long for travis' rendered view, so tail it.
|
||||
- tail -1000 config.log || echo "tail failed"
|
||||
## `make check` will leave a log file with more details of test failures.
|
||||
- if [[ "$DISTCHECK" == "" ]]; then cat test-suite.log || echo "cat failed"; fi
|
||||
## `make distcheck` puts it somewhere different.
|
||||
- if [[ "$DISTCHECK" != "" ]]; then make show-distdir-testlog || echo "make failed"; fi
|
||||
|
||||
after_success:
|
||||
## If this build was one that produced coverage, upload it.
|
||||
- if [[ "$COVERAGE_OPTIONS" != "" ]]; then coveralls -b . --exclude src/test --exclude src/trunnel --gcov-options '\-p'; fi
|
||||
|
||||
notifications:
|
||||
irc:
|
||||
@ -18,147 +215,3 @@ notifications:
|
||||
email:
|
||||
on_success: never
|
||||
on_failure: change
|
||||
|
||||
os:
|
||||
- linux
|
||||
## Uncomment the following line to also run the entire build matrix on OSX.
|
||||
## This will make your CI builds take roughly ten times longer to finish.
|
||||
# - osx
|
||||
|
||||
## Use the Ubuntu Trusty images.
|
||||
dist: trusty
|
||||
|
||||
## We don't need sudo. (The "apt:" stanza after this allows us to not need sudo;
|
||||
## otherwise, we would need it for getting dependencies.)
|
||||
##
|
||||
## We override this in the explicit build matrix to work around a
|
||||
## Travis CI environment regression
|
||||
## https://github.com/travis-ci/travis-ci/issues/9033
|
||||
sudo: false
|
||||
|
||||
## (Linux only) Download our dependencies
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
## Required dependencies
|
||||
- libevent-dev
|
||||
- libseccomp2
|
||||
- zlib1g-dev
|
||||
## Optional dependencies
|
||||
- liblzma-dev
|
||||
- libscrypt-dev
|
||||
## zstd doesn't exist in Ubuntu Trusty
|
||||
#- libzstd
|
||||
|
||||
## The build matrix in the following two stanzas expands into four builds (per OS):
|
||||
##
|
||||
## * with GCC, with Rust
|
||||
## * with GCC, without Rust
|
||||
## * with Clang, with Rust
|
||||
## * with Clang, without Rust
|
||||
env:
|
||||
global:
|
||||
## The Travis CI environment allows us two cores, so let's use both.
|
||||
- MAKEFLAGS="-j 2"
|
||||
matrix:
|
||||
## Leave at least one entry here or Travis seems to generate a
|
||||
## matrix entry with empty matrix environment variables. Leaving
|
||||
## more than one entry causes unwanted matrix entries with
|
||||
## unspecified compilers.
|
||||
- RUST_OPTIONS="--enable-rust --enable-cargo-online-mode"
|
||||
# - RUST_OPTIONS="--enable-rust" TOR_RUST_DEPENDENCIES=true
|
||||
# - RUST_OPTIONS=""
|
||||
|
||||
matrix:
|
||||
## Uncomment to allow the build to report success (with non-required
|
||||
## sub-builds continuing to run) if all required sub-builds have
|
||||
## succeeded. This is somewhat buggy currently: it can cause
|
||||
## duplicate notifications and prematurely report success if a
|
||||
## single sub-build has succeeded. See
|
||||
## https://github.com/travis-ci/travis-ci/issues/1696
|
||||
# fast_finish: true
|
||||
|
||||
## Uncomment the appropriate lines below to allow the build to
|
||||
## report success even if some less-critical sub-builds fail and it
|
||||
## seems likely to take a while for someone to fix it. Currently
|
||||
## Travis CI doesn't distinguish "all builds succeeded" from "some
|
||||
## non-required sub-builds failed" except on the individual build's
|
||||
## page, which makes it somewhat annoying to detect from the
|
||||
## branches and build history pages. See
|
||||
## https://github.com/travis-ci/travis-ci/issues/8716
|
||||
allow_failures:
|
||||
# - env: RUST_OPTIONS="--enable-rust" TOR_RUST_DEPENDENCIES=true
|
||||
# - env: RUST_OPTIONS="--enable-rust --enable-cargo-online-mode
|
||||
# - compiler: clang
|
||||
|
||||
## Create explicit matrix entries to work around a Travis CI
|
||||
## environment issue. Missing keys inherit from the first list
|
||||
## entry under that key outside the "include" clause.
|
||||
include:
|
||||
- compiler: gcc
|
||||
- compiler: gcc
|
||||
env: RUST_OPTIONS="--enable-rust" TOR_RUST_DEPENDENCIES=true
|
||||
- compiler: gcc
|
||||
env: RUST_OPTIONS=""
|
||||
- compiler: gcc
|
||||
env: COVERAGE_OPTIONS="--enable-coverage"
|
||||
- compiler: gcc
|
||||
env: DISTCHECK="yes" RUST_OPTIONS=""
|
||||
- compiler: gcc
|
||||
env: DISTCHECK="yes" RUST_OPTIONS="--enable-rust --enable-cargo-online-mode"
|
||||
## The "sudo: required" forces non-containerized builds, working
|
||||
## around a Travis CI environment issue: clang LeakAnalyzer fails
|
||||
## because it requires ptrace and the containerized environment no
|
||||
## longer allows ptrace.
|
||||
- compiler: clang
|
||||
sudo: required
|
||||
- compiler: clang
|
||||
sudo: required
|
||||
env: RUST_OPTIONS="--enable-rust" TOR_RUST_DEPENDENCIES=true
|
||||
- compiler: clang
|
||||
sudo: required
|
||||
env: RUST_OPTIONS=""
|
||||
|
||||
before_install:
|
||||
## If we're on OSX, homebrew usually needs to updated first
|
||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update ; fi
|
||||
## Download rustup
|
||||
- if [[ "$RUST_OPTIONS" != "" ]]; then curl -Ssf -o rustup.sh https://sh.rustup.rs; fi
|
||||
- if [[ "$COVERAGE_OPTIONS" != "" ]]; then pip install --user cpp-coveralls; fi
|
||||
|
||||
install:
|
||||
## If we're on OSX use brew to install required dependencies (for Linux, see the "apt:" section above)
|
||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then { brew outdated openssl || brew upgrade openssl; }; fi
|
||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then { brew outdated libevent || brew upgrade libevent; }; fi
|
||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then { brew outdated pkg-config || brew upgrade pkg-config; }; fi
|
||||
## If we're on OSX also install the optional dependencies
|
||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then { brew outdated xz || brew upgrade xz; }; fi
|
||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then { brew outdated libscrypt || brew upgrade libscrypt; }; fi
|
||||
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then { brew outdated zstd || brew upgrade zstd; }; fi
|
||||
## Install the stable channels of rustc and cargo and setup our toolchain environment
|
||||
- if [[ "$RUST_OPTIONS" != "" ]]; then sh rustup.sh -y --default-toolchain stable; fi
|
||||
- if [[ "$RUST_OPTIONS" != "" ]]; then source $HOME/.cargo/env; fi
|
||||
## Get some info about rustc and cargo
|
||||
- if [[ "$RUST_OPTIONS" != "" ]]; then which rustc; fi
|
||||
- if [[ "$RUST_OPTIONS" != "" ]]; then which cargo; fi
|
||||
- if [[ "$RUST_OPTIONS" != "" ]]; then rustc --version; fi
|
||||
- if [[ "$RUST_OPTIONS" != "" ]]; then cargo --version; fi
|
||||
## If we're testing rust builds in offline-mode, then set up our vendored dependencies
|
||||
- if [[ "$TOR_RUST_DEPENDENCIES" == "true" ]]; then export TOR_RUST_DEPENDENCIES=$PWD/src/ext/rust/crates; fi
|
||||
|
||||
script:
|
||||
- ./autogen.sh
|
||||
- ./configure $RUST_OPTIONS $COVERAGE_OPTIONS --disable-asciidoc --enable-fatal-warnings --disable-silent-rules --enable-fragile-hardening
|
||||
## We run `make check` because that's what https://jenkins.torproject.org does.
|
||||
- if [[ "$DISTCHECK" == "" ]]; then make check; fi
|
||||
- if [[ "$DISTCHECK" != "" ]]; then make distcheck DISTCHECK_CONFIGURE_FLAGS="$RUST_OPTIONS $COVERAGE_OPTIONS --disable-asciidoc --enable-fatal-warnings --disable-silent-rules --enable-fragile-hardening"; fi
|
||||
|
||||
after_failure:
|
||||
## `make check` will leave a log file with more details of test failures.
|
||||
- if [[ "$DISTCHECK" == "" ]]; then cat test-suite.log; fi
|
||||
## `make distcheck` puts it somewhere different.
|
||||
- if [[ "$DISTCHECK" != "" ]]; then make show-distdir-testlog; fi
|
||||
|
||||
after_success:
|
||||
## If this build was one that produced coverage, upload it.
|
||||
- if [[ "$COVERAGE_OPTIONS" != "" ]]; then coveralls -b . --exclude src/test --exclude src/trunnel --gcov-options '\-p'; fi
|
||||
|
@ -125,6 +125,7 @@ test-network: need-chutney-path $(TESTING_TOR_BINARY) src/tools/tor-gencert
|
||||
# because they're incompatible
|
||||
test-network-all: need-chutney-path test-driver $(TESTING_TOR_BINARY) src/tools/tor-gencert
|
||||
mkdir -p $(TEST_NETWORK_ALL_LOG_DIR)
|
||||
rm -f $(TEST_NETWORK_ALL_LOG_DIR)/*.log $(TEST_NETWORK_ALL_LOG_DIR)/*.trs
|
||||
@flavors="$(TEST_CHUTNEY_FLAVORS)"; \
|
||||
if ping6 -q -c 1 -o ::1 >/dev/null 2>&1 || ping6 -q -c 1 -W 1 ::1 >/dev/null 2>&1 || ping -6 -c 1 -W 1 ::1 >/dev/null 2>&1; then \
|
||||
echo "ping6 ::1 or ping ::1 succeeded, running IPv6 flavors: $(TEST_CHUTNEY_FLAVORS_IPV6)."; \
|
||||
@ -148,7 +149,7 @@ test-network-all: need-chutney-path test-driver $(TESTING_TOR_BINARY) src/tools/
|
||||
$(top_srcdir)/src/test/test-network.sh $(TEST_NETWORK_WARNING_FLAGS); \
|
||||
done; \
|
||||
echo "Log and result files are available in $(TEST_NETWORK_ALL_LOG_DIR)."; \
|
||||
! grep -q FAIL test_network_log/*.trs
|
||||
! grep -q FAIL $(TEST_NETWORK_ALL_LOG_DIR)/*.trs
|
||||
|
||||
need-stem-path:
|
||||
@if test ! -d "$$STEM_SOURCE_DIR"; then \
|
||||
|
4
changes/27286
Normal file
4
changes/27286
Normal file
@ -0,0 +1,4 @@
|
||||
o Minor features (directory authorities):
|
||||
- Authorities no longer vote to make the subprotocol version "LinkAuth=1"
|
||||
a requirement: it is unsupportable with NSS, and hasn't been needed
|
||||
since Tor 0.3.0.1-alpha. Closes ticket 27286.
|
4
changes/bug20424_029_minimal
Normal file
4
changes/bug20424_029_minimal
Normal file
@ -0,0 +1,4 @@
|
||||
o Minor bugfixes (compilation):
|
||||
- When compiling with --enable-openbsd-malloc or --enable-tcmalloc, tell
|
||||
the compiler not to include the system malloc implementation. Fixes bug
|
||||
20424; bugfix on 0.2.0.20-rc.
|
5
changes/bug25440
Normal file
5
changes/bug25440
Normal file
@ -0,0 +1,5 @@
|
||||
o Minor bugfixes (linux seccomp2 sandbox):
|
||||
- Fix a bug in out sandboxing rules for the openat() syscall.
|
||||
Previously, no openat() call would be permitted, which would break
|
||||
filesystem operations on recent glibc versions. Fixes bug 25440;
|
||||
bugfix on 0.2.9.15. Diagnosis and patch from Daniel Pinto.
|
3
changes/bug25505
Normal file
3
changes/bug25505
Normal file
@ -0,0 +1,3 @@
|
||||
o Minor bugfixes (netflow padding):
|
||||
- Ensure circuitmux queues are empty before scheduling or sending padding.
|
||||
Fixes bug 25505; bugfix on 0.3.1.1-alpha.
|
5
changes/bug25512
Normal file
5
changes/bug25512
Normal file
@ -0,0 +1,5 @@
|
||||
o Minor bugfixes (restart-in-process):
|
||||
- When shutting down, Tor now clears all the flags in the control.c
|
||||
module. This should prevent a bug where authentication cookies
|
||||
are not generated on restart. Fixes bug 25512; bugfix on 0.3.3.1-alpha.
|
||||
|
5
changes/bug25705
Normal file
5
changes/bug25705
Normal file
@ -0,0 +1,5 @@
|
||||
o Minor bugfixes (circuit path selection):
|
||||
- Don't count path selection failures as circuit build failures. This
|
||||
should eliminate cases where Tor blames its guard or the network
|
||||
for situations like insufficient microdescriptors and/or overly
|
||||
restrictive torrc settings. Fixes bug 25705; bugfix on 0.3.3.1-alpha.
|
5
changes/bug26269
Normal file
5
changes/bug26269
Normal file
@ -0,0 +1,5 @@
|
||||
o Minor bugfixes (compilation):
|
||||
- Fix a compilation warning on some versions of GCC when
|
||||
building code that calls routerinfo_get_my_routerinfo() twice,
|
||||
assuming that the second call will succeed if the first one did.
|
||||
Fixes bug 26269; bugfix on 0.2.8.2-alpha.
|
4
changes/bug26485
Normal file
4
changes/bug26485
Normal file
@ -0,0 +1,4 @@
|
||||
o Minor bugfixes (directory authority):
|
||||
- When voting for recommended versions, make sure that all of the
|
||||
versions are well-formed and parsable. Fixes bug 26485; bugfix on
|
||||
0.1.1.6-alpha.
|
3
changes/bug26497
Normal file
3
changes/bug26497
Normal file
@ -0,0 +1,3 @@
|
||||
o Minor bugfixes (rust):
|
||||
- Stop setting $CARGO_HOME. cargo will use the user's $CARGO_HOME, or
|
||||
$HOME/.cargo by default. Fixes bug 26497; bugfix on 0.3.1.5-alpha.
|
3
changes/bug26497-backport
Normal file
3
changes/bug26497-backport
Normal file
@ -0,0 +1,3 @@
|
||||
o Minor bugfixes (rust):
|
||||
- Backport test_rust.sh from master.
|
||||
Fixes bug 26497; bugfix on 0.3.1.5-alpha.
|
4
changes/bug26497-cd
Normal file
4
changes/bug26497-cd
Normal file
@ -0,0 +1,4 @@
|
||||
o Minor bugfixes (rust):
|
||||
- cd to ${abs_top_builddir}/src/rust before running cargo in
|
||||
src/test/test_rust.sh. This makes the working directory consistent
|
||||
between builds and tests. Fixes bug 26497; bugfix on 0.3.3.2-alpha.
|
7
changes/bug26627
Normal file
7
changes/bug26627
Normal file
@ -0,0 +1,7 @@
|
||||
o Minor bugfixes (v3 onion services):
|
||||
- Stop sending ed25519 link specifiers in v3 onion service introduce
|
||||
cells, when the rendezvous point doesn't support ed25519 link
|
||||
authentication. Fixes bug 26627; bugfix on 0.3.2.4-alpha.
|
||||
- Stop putting ed25519 link specifiers in v3 onion service descriptors,
|
||||
when the intro point doesn't support ed25519 link authentication.
|
||||
Fixes bug 26627; bugfix on 0.3.2.4-alpha.
|
4
changes/bug26779
Normal file
4
changes/bug26779
Normal file
@ -0,0 +1,4 @@
|
||||
o Minor features (bug workaround):
|
||||
- Compile correctly on systems that provide the C11 stdatomic.h header,
|
||||
but where C11 atomic functions don't actually compile.
|
||||
Closes ticket 26779; workaround for Debian issue 903709.
|
4
changes/bug26785
Normal file
4
changes/bug26785
Normal file
@ -0,0 +1,4 @@
|
||||
o Minor bugfixes (compilation, portability):
|
||||
- Don't try to use a pragma to temporarily disable
|
||||
-Wunused-const-variable if the compiler doesn't support it.
|
||||
Fixes bug 26785; bugfix on 0.3.2.11.
|
3
changes/bug26787
Normal file
3
changes/bug26787
Normal file
@ -0,0 +1,3 @@
|
||||
o Minor bugfixes (testing):
|
||||
- Disable core dumps in test_bt.sh, to avoid failures in "make
|
||||
distcheck". Fixes bug 26787; bugfix on 0.2.5.2-alpha.
|
3
changes/bug26830
Normal file
3
changes/bug26830
Normal file
@ -0,0 +1,3 @@
|
||||
o Minor bugfixes (continuous integration):
|
||||
- Skip an unreliable key generation test on Windows, until the underlying
|
||||
issue in bug 26076 is resolved. Fixes bug 26830; bugfix on 0.2.7.3-rc.
|
3
changes/bug26853
Normal file
3
changes/bug26853
Normal file
@ -0,0 +1,3 @@
|
||||
o Minor bugfixes (continuous integration):
|
||||
- Skip an unreliable key expiration test on Windows, until the underlying
|
||||
issue in bug 26076 is resolved. Fixes bug 26853; bugfix on 0.3.2.1-alpha.
|
4
changes/bug26873
Normal file
4
changes/bug26873
Normal file
@ -0,0 +1,4 @@
|
||||
o Minor bugfixes (portability):
|
||||
- Fix compilation of the unit tests on GNU/Hurd, which does not
|
||||
define PATH_MAX. Fixes bug 26873; bugfix on 0.3.3.1-alpha.
|
||||
Patch from "paulusASol".
|
4
changes/bug26876
Normal file
4
changes/bug26876
Normal file
@ -0,0 +1,4 @@
|
||||
o Minor bugfixes (portability):
|
||||
- Work around two different bugs in the OS X 10.10 and later SDKs that
|
||||
would prevent us from successfully targeting earlier versions of OS X.
|
||||
Fixes bug 26876; bugfix on 0.3.3.1-alpha.
|
4
changes/bug26924
Normal file
4
changes/bug26924
Normal file
@ -0,0 +1,4 @@
|
||||
o Minor bugfixes (single onion services, Tor2web):
|
||||
- Log a protocol warning when single onion services or Tor2web clients
|
||||
fail to authenticate direct connections to relays.
|
||||
Fixes bug 26924; bugfix on 0.2.9.1-alpha.
|
4
changes/bug26927
Normal file
4
changes/bug26927
Normal file
@ -0,0 +1,4 @@
|
||||
o Minor bugfixes (logging):
|
||||
- Improve the log message when connection initiators fail to authenticate
|
||||
direct connections to relays.
|
||||
Fixes bug 26927; bugfix on 0.3.0.1-alpha.
|
3
changes/bug26932
Normal file
3
changes/bug26932
Normal file
@ -0,0 +1,3 @@
|
||||
o Minor bugfixes (onion services):
|
||||
- Fix bug that causes services to not ever rotate their descriptors if they
|
||||
were getting SIGHUPed often. Fixes bug 26932; bugfix on 0.3.2.1-alpha.
|
4
changes/bug26948
Normal file
4
changes/bug26948
Normal file
@ -0,0 +1,4 @@
|
||||
o Minor bugfixes (in-process restart):
|
||||
- Always call tor_free_all() when leaving tor_run_main(). When we
|
||||
did not, restarting tor in-process would cause an assertion failure.
|
||||
Fixes bug 26948; bugfix on 0.3.3.1-alpha.
|
4
changes/bug27081
Normal file
4
changes/bug27081
Normal file
@ -0,0 +1,4 @@
|
||||
o Minor bugfixes (compilation, windows):
|
||||
- Don't link or search for pthreads when building for Windows, even if we
|
||||
are using build environment (like mingw) that provides a pthreads
|
||||
library. Fixes bug 27081; bugfix on 0.1.0.1-rc.
|
5
changes/bug27088
Normal file
5
changes/bug27088
Normal file
@ -0,0 +1,5 @@
|
||||
o Minor bugfixes (continuous integration):
|
||||
- Pass the module flags to distcheck configure, and
|
||||
log the flags before running configure. (Backported
|
||||
to 0.2.9 and later as a precaution.)
|
||||
Fixes bug 27088; bugfix on 0.3.4.1-alpha.
|
3
changes/bug27090
Normal file
3
changes/bug27090
Normal file
@ -0,0 +1,3 @@
|
||||
o Minor bugfixes (continuous integration):
|
||||
- Build with zstd on macOS.
|
||||
Fixes bug 27090; bugfix on 0.3.1.5-alpha.
|
3
changes/bug27093
Normal file
3
changes/bug27093
Normal file
@ -0,0 +1,3 @@
|
||||
o Minor bugfixes (rust):
|
||||
- Consistently use ../../.. as a fallback for $abs_top_srcdir in
|
||||
test_rust.sh. Fixes bug 27093; bugfix on 0.3.4.3-alpha.
|
4
changes/bug27164
Normal file
4
changes/bug27164
Normal file
@ -0,0 +1,4 @@
|
||||
o Minor bugfixes (rust):
|
||||
- Protover parsing was ignoring a 2nd hyphen and everything after it,
|
||||
accepting entries like "Link=1-5-foo". Fixes bug 27164; bugfix on
|
||||
0.3.3.1-alpha.
|
4
changes/bug27177
Normal file
4
changes/bug27177
Normal file
@ -0,0 +1,4 @@
|
||||
o Minor bugfixes (rust):
|
||||
- Protover parsing was accepting the presence of whitespace in version
|
||||
strings, which the C implementation would choke on, e.g. "Desc=1\t,2".
|
||||
Fixes bug 27177; bugfix on 0.3.3.5-rc.
|
3
changes/bug27185
Normal file
3
changes/bug27185
Normal file
@ -0,0 +1,3 @@
|
||||
o Minor bugfixes (Windows, compilation):
|
||||
- Silence a compilation warning on MSVC 2017 and clang-cl.
|
||||
Fixes bug 27185; bugfix on 0.2.2.2-alpha.
|
4
changes/bug27206
Normal file
4
changes/bug27206
Normal file
@ -0,0 +1,4 @@
|
||||
o Minor bugfixes (rust):
|
||||
- protover_all_supported() would attempt to allocate up to 16GB on some
|
||||
inputs, leading to a potential memory DoS. Fixes bug 27206; bugfix on
|
||||
0.3.3.5-rc.
|
5
changes/bug27226
Normal file
5
changes/bug27226
Normal file
@ -0,0 +1,5 @@
|
||||
o Minor bugfixes (testing, openssl compatibility):
|
||||
- Our "tortls/cert_matches_key" unit test no longer relies on OpenSSL
|
||||
internals. Previously, it relied on unsupported OpenSSL behavior in
|
||||
a way that caused it to crash with OpenSSL 1.0.2p. Fixes bug 27226;
|
||||
bugfix on 0.2.5.1-alpha.
|
3
changes/bug27295
Normal file
3
changes/bug27295
Normal file
@ -0,0 +1,3 @@
|
||||
o Minor bugfixes (testing, chutney):
|
||||
- Before running make test-network-all, delete old logs and test result
|
||||
files, to avoid spurious failures. Fixes bug 27295; bugfix on 0.2.7.3-rc.
|
4
changes/bug27335
Normal file
4
changes/bug27335
Normal file
@ -0,0 +1,4 @@
|
||||
o Minor bugfixes (hidden service v3):
|
||||
- In case the hidden service directory can't be created or has wrong
|
||||
permissions, do not BUG() on it which lead to a non fatal stacktrace.
|
||||
Fixes bug 27335; bugfix on 0.3.2.1.
|
4
changes/bug27344
Normal file
4
changes/bug27344
Normal file
@ -0,0 +1,4 @@
|
||||
o Minor features (compatibility):
|
||||
- Tell OpenSSL to maintain backward compatibility with previous
|
||||
RSA1024/DH1024 users in Tor. With OpenSSL 1.1.1-pre6, these ciphers
|
||||
are disabled by default. Closes ticket 27344.
|
5
changes/bug27345
Normal file
5
changes/bug27345
Normal file
@ -0,0 +1,5 @@
|
||||
o Minor bugfixes (testing):
|
||||
- When running make test-network-all, use the mixed+hs-v2 network.
|
||||
(A previous fix to chutney removed v3 onion services from the
|
||||
mixed+hs-v23 network, so seeing "mixed+hs-v23" in tests is
|
||||
confusing.) Fixes bug 27345; bugfix on 0.3.2.1-alpha.
|
3
changes/bug27418
Normal file
3
changes/bug27418
Normal file
@ -0,0 +1,3 @@
|
||||
o Minor bugfixes (continuous integration):
|
||||
- When we use echo in Travis, don't pass a --flag as the first argument.
|
||||
Fixes bug 27418; bugfix on 0.3.4.7-rc.
|
3
changes/bug27453
Normal file
3
changes/bug27453
Normal file
@ -0,0 +1,3 @@
|
||||
o Minor bugfixes (continuous integration):
|
||||
- When a Travis build fails, and showing a log fails, keep trying to
|
||||
show the other logs. Fixes bug 27453; bugfix on 0.3.4.7-rc.
|
5
changes/bug27461
Normal file
5
changes/bug27461
Normal file
@ -0,0 +1,5 @@
|
||||
o Minor bugfixes (compilation):
|
||||
- Stop calling SetProcessDEPPolicy() on 64-bit Windows. It is not
|
||||
supported, and always fails. Some compilers warn about the function
|
||||
pointer cast on 64-bit Windows.
|
||||
Fixes bug 27461; bugfix on 0.2.2.23-alpha.
|
3
changes/bug27463
Normal file
3
changes/bug27463
Normal file
@ -0,0 +1,3 @@
|
||||
o Minor bugfixes (onion services):
|
||||
- Silence a spurious compiler warning in rend_client_send_introduction().
|
||||
Fixes bug 27463; bugfix on 0.1.1.2-alpha.
|
5
changes/bug27465
Normal file
5
changes/bug27465
Normal file
@ -0,0 +1,5 @@
|
||||
o Minor bugfixes (compilation):
|
||||
- Silence a spurious compiler warning on the GetAdaptersAddresses
|
||||
function pointer cast. This issue is already fixed by 26481 in
|
||||
0.3.5 and later, by removing the lookup and cast.
|
||||
Fixes bug 27465; bugfix on 0.2.3.11-alpha.
|
4
changes/bug27649
Normal file
4
changes/bug27649
Normal file
@ -0,0 +1,4 @@
|
||||
o Minor bugfixes (rust):
|
||||
- The protover rewrite in 24031 allowed repeated votes from the same
|
||||
voter for the same protocol version to be counted multiple times in
|
||||
protover_compute_vote(). Fixes bug 27649; bugfix on 0.3.3.5-rc.
|
6
changes/bug27658
Normal file
6
changes/bug27658
Normal file
@ -0,0 +1,6 @@
|
||||
o Minor bugfixes (testing):
|
||||
- If a unit test running in a subprocess exits abnormally or with a
|
||||
nonzero status code, treat the test as having failed, even if
|
||||
the test reported success. Without this fix, memory leaks don't cause
|
||||
cause the tests to fail, even with LeakSanitizer. Fixes bug 27658;
|
||||
bugfix on 0.2.2.4-alpha.
|
4
changes/bug27687
Normal file
4
changes/bug27687
Normal file
@ -0,0 +1,4 @@
|
||||
o Minor bugfixes (rust):
|
||||
- protover parsed and accepted unknown protocol names containing invalid
|
||||
characters outside the range [A-Za-z0-9-]. Fixes bug 27687; bugfix on
|
||||
0.3.3.1-alpha.
|
4
changes/bug27708
Normal file
4
changes/bug27708
Normal file
@ -0,0 +1,4 @@
|
||||
o Major bugfixes (restart-in-process):
|
||||
- Fix a use-after-free error that could be caused by passing Tor an
|
||||
impossible set of options that would fail during options_act().
|
||||
Fixes bug 27708; bugfix on 0.3.3.1-alpha.
|
4
changes/geoip-2018-07-03
Normal file
4
changes/geoip-2018-07-03
Normal file
@ -0,0 +1,4 @@
|
||||
o Minor features (geoip):
|
||||
- Update geoip and geoip6 to the July 3 2018 Maxmind GeoLite2
|
||||
Country database. Closes ticket 26674.
|
||||
|
4
changes/geoip-2018-08-07
Normal file
4
changes/geoip-2018-08-07
Normal file
@ -0,0 +1,4 @@
|
||||
o Minor features (geoip):
|
||||
- Update geoip and geoip6 to the August 7 2018 Maxmind GeoLite2
|
||||
Country database. Closes ticket 27089.
|
||||
|
4
changes/geoip-2018-09-06
Normal file
4
changes/geoip-2018-09-06
Normal file
@ -0,0 +1,4 @@
|
||||
o Minor features (geoip):
|
||||
- Update geoip and geoip6 to the September 6 2018 Maxmind GeoLite2
|
||||
Country database. Closes ticket 27631.
|
||||
|
4
changes/task26771
Normal file
4
changes/task26771
Normal file
@ -0,0 +1,4 @@
|
||||
o Directory authority changes:
|
||||
- The "Bifroest" bridge authority has been retired; the new bridge
|
||||
authority is "Serge", and it is operated by George from the
|
||||
TorBSD project. Closes ticket 26771.
|
3
changes/ticket24629
Normal file
3
changes/ticket24629
Normal file
@ -0,0 +1,3 @@
|
||||
o Minor features (continuous integration):
|
||||
- Enable macOS builds in our Travis CI configuration.
|
||||
Closes ticket 24629.
|
3
changes/ticket24629-backport
Normal file
3
changes/ticket24629-backport
Normal file
@ -0,0 +1,3 @@
|
||||
o Minor features (continuous integration):
|
||||
- Backport Travis rust distcheck to 0.3.3.
|
||||
Closes ticket 24629.
|
3
changes/ticket26560
Normal file
3
changes/ticket26560
Normal file
@ -0,0 +1,3 @@
|
||||
o Minor features (continuous integration):
|
||||
- Install libcap-dev and libseccomp2-dev so these optional
|
||||
dependencies get tested on Travis CI. Closes ticket 26560.
|
4
changes/ticket26647
Normal file
4
changes/ticket26647
Normal file
@ -0,0 +1,4 @@
|
||||
o Minor features (controller):
|
||||
- The control port now exposes the list of HTTPTunnelPorts and
|
||||
ExtOrPorts via GETINFO net/listeners/httptunnel and net/listeners/extor
|
||||
respectively. Closes ticket 26647.
|
3
changes/ticket26952-cargo
Normal file
3
changes/ticket26952-cargo
Normal file
@ -0,0 +1,3 @@
|
||||
o Minor features (continuous integration, rust):
|
||||
- Use cargo cache in our Travis CI configuration.
|
||||
Closes ticket 26952.
|
3
changes/ticket26952-ccache
Normal file
3
changes/ticket26952-ccache
Normal file
@ -0,0 +1,3 @@
|
||||
o Minor features (continuous integration):
|
||||
- Use ccache in our Travis CI configuration.
|
||||
Closes ticket 26952.
|
3
changes/ticket27087
Normal file
3
changes/ticket27087
Normal file
@ -0,0 +1,3 @@
|
||||
o Minor features (continuous integration):
|
||||
- Run asciidoc during Travis CI.
|
||||
Implements ticket 27087.
|
6
changes/ticket27252
Normal file
6
changes/ticket27252
Normal file
@ -0,0 +1,6 @@
|
||||
o Minor features (continuous integration):
|
||||
- Skip gcc on OSX in Travis CI, it's rarely used.
|
||||
Skip a duplicate hardening-off build in Travis on Tor 0.2.9.
|
||||
Skip gcc on Linux with default settings, because all the non-default
|
||||
builds use gcc on Linux.
|
||||
Implements ticket 27252.
|
5
changes/ticket27252-032
Normal file
5
changes/ticket27252-032
Normal file
@ -0,0 +1,5 @@
|
||||
o Minor features (continuous integration):
|
||||
- Only run one online rust build in Travis, to reduce network errors.
|
||||
Skip offline rust builds on Travis for Linux gcc, because they're
|
||||
redundant.
|
||||
Implements ticket 27252.
|
68
configure.ac
68
configure.ac
@ -4,7 +4,7 @@ dnl Copyright (c) 2007-2017, The Tor Project, Inc.
|
||||
dnl See LICENSE for licensing information
|
||||
|
||||
AC_PREREQ([2.63])
|
||||
AC_INIT([tor],[0.3.3.7-dev])
|
||||
AC_INIT([tor],[0.3.3.10-dev])
|
||||
AC_CONFIG_SRCDIR([src/or/main.c])
|
||||
AC_CONFIG_MACRO_DIR([m4])
|
||||
|
||||
@ -515,8 +515,10 @@ if test "$LIBS" != "$saved_LIBS"; then
|
||||
have_rt=yes
|
||||
fi
|
||||
|
||||
AC_SEARCH_LIBS(pthread_create, [pthread])
|
||||
AC_SEARCH_LIBS(pthread_detach, [pthread])
|
||||
if test "$bwin32" = "false"; then
|
||||
AC_SEARCH_LIBS(pthread_create, [pthread])
|
||||
AC_SEARCH_LIBS(pthread_detach, [pthread])
|
||||
fi
|
||||
|
||||
AM_CONDITIONAL(THREADS_WIN32, test "$bwin32" = "true")
|
||||
AM_CONDITIONAL(THREADS_PTHREADS, test "$bwin32" = "false")
|
||||
@ -548,7 +550,6 @@ AC_CHECK_FUNCS(
|
||||
llround \
|
||||
localtime_r \
|
||||
lround \
|
||||
mach_approximate_time \
|
||||
memmem \
|
||||
memset_s \
|
||||
pipe \
|
||||
@ -574,9 +575,36 @@ AC_CHECK_FUNCS(
|
||||
_vscprintf
|
||||
)
|
||||
|
||||
# Apple messed up when they added two functions functions in Sierra: they
|
||||
# Apple messed up when they added some functions: they
|
||||
# forgot to decorate them with appropriate AVAILABLE_MAC_OS_VERSION
|
||||
# checks. So we should only probe for those functions if we are sure that we
|
||||
# checks.
|
||||
|
||||
# We should only probe for these functions if we are sure that we
|
||||
# are not targeting OS X 10.9 or earlier.
|
||||
AC_MSG_CHECKING([for a pre-Yosemite OS X build target])
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
|
||||
#ifdef __APPLE__
|
||||
# include <AvailabilityMacros.h>
|
||||
# ifndef MAC_OS_X_VERSION_10_10
|
||||
# define MAC_OS_X_VERSION_10_10 101000
|
||||
# endif
|
||||
# if defined(MAC_OS_X_VERSION_MIN_REQUIRED)
|
||||
# if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_10
|
||||
# error "Running on Mac OS X 10.9 or earlier"
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
]], [[]])],
|
||||
[on_macos_pre_10_10=no ; AC_MSG_RESULT([no])],
|
||||
[on_macos_pre_10_10=yes; AC_MSG_RESULT([yes])])
|
||||
|
||||
if test "$on_macos_pre_10_10" = "no"; then
|
||||
AC_CHECK_FUNCS(
|
||||
mach_approximate_time \
|
||||
)
|
||||
fi
|
||||
|
||||
# We should only probe for these functions if we are sure that we
|
||||
# are not targeting OSX 10.11 or earlier.
|
||||
AC_MSG_CHECKING([for a pre-Sierra OSX build target])
|
||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
|
||||
@ -828,6 +856,7 @@ AC_CHECK_FUNCS([ \
|
||||
SSL_get_client_ciphers \
|
||||
SSL_get_client_random \
|
||||
SSL_CIPHER_find \
|
||||
SSL_CTX_set_security_level \
|
||||
TLS_method
|
||||
])
|
||||
|
||||
@ -1531,6 +1560,26 @@ AC_CHECK_SIZEOF(socklen_t, , [AC_INCLUDES_DEFAULT()
|
||||
|
||||
AC_CHECK_SIZEOF(cell_t)
|
||||
|
||||
# Let's see if stdatomic works. (There are some debian clangs that screw it
|
||||
# up; see Tor bug #26779 and debian bug 903709.)
|
||||
AC_CACHE_CHECK([whether C11 stdatomic.h actually works],
|
||||
tor_cv_stdatomic_works,
|
||||
[AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
|
||||
#include <stdatomic.h>
|
||||
struct x { atomic_size_t y; };
|
||||
void try_atomic_init(struct x *xx)
|
||||
{
|
||||
atomic_init(&xx->y, 99);
|
||||
atomic_fetch_add(&xx->y, 1);
|
||||
}
|
||||
]])], [tor_cv_stdatomic_works=yes], [tor_cv_stdatomic_works=no])])
|
||||
|
||||
if test "$tor_cv_stdatomic_works" = "yes"; then
|
||||
AC_DEFINE(STDATOMIC_WORKS, 1, [Set to 1 if we can compile a simple stdatomic example.])
|
||||
elif test "$ac_cv_header_stdatomic_h" = "yes"; then
|
||||
AC_MSG_WARN([Your compiler provides the stdatomic.h header, but it doesn't seem to work. I'll pretend it isn't there. If you are using Clang on Debian, maybe this is because of https://bugs.debian.org/903709 ])
|
||||
fi
|
||||
|
||||
# Now make sure that NULL can be represented as zero bytes.
|
||||
AC_CACHE_CHECK([whether memset(0) sets pointers to NULL], tor_cv_null_is_zero,
|
||||
[AC_RUN_IFELSE([AC_LANG_SOURCE(
|
||||
@ -1698,6 +1747,10 @@ fi
|
||||
if test "$using_custom_malloc" = "no"; then
|
||||
AC_CHECK_FUNCS(mallinfo)
|
||||
fi
|
||||
if test "$using_custom_malloc" = "yes"; then
|
||||
# Tell the C compiler not to use the system allocator functions.
|
||||
TOR_CHECK_CFLAGS([-fno-builtin-malloc -fno-builtin-realloc -fno-builtin-calloc -fno-builtin-free])
|
||||
fi
|
||||
|
||||
# By default, we're going to assume we don't have mlockall()
|
||||
# bionic and other platforms have various broken mlockall subsystems.
|
||||
@ -2172,6 +2225,9 @@ dnl -Wthread-safety-precise
|
||||
if test "$tor_cv_cflags__Woverlength_strings" = "yes"; then
|
||||
AC_DEFINE([HAVE_CFLAG_WOVERLENGTH_STRINGS], 1, [True if we have -Woverlength-strings])
|
||||
fi
|
||||
if test "$tor_cv_cflags__warn_unused_const_variable_2" = "yes"; then
|
||||
AC_DEFINE([HAVE_CFLAG_WUNUSED_CONST_VARIABLE], 1, [True if we have -Wunused-const-variable])
|
||||
fi
|
||||
|
||||
if test "x$enable_fatal_warnings" = "xyes"; then
|
||||
# I'd like to use TOR_CHECK_CFLAGS here, but I can't, since the
|
||||
|
@ -8,7 +8,7 @@
|
||||
!include "LogicLib.nsh"
|
||||
!include "FileFunc.nsh"
|
||||
!insertmacro GetParameters
|
||||
!define VERSION "0.3.3.7-dev"
|
||||
!define VERSION "0.3.3.10-dev"
|
||||
!define INSTALLER "tor-${VERSION}-win32.exe"
|
||||
!define WEBSITE "https://www.torproject.org/"
|
||||
!define LICENSE "LICENSE"
|
||||
|
@ -122,9 +122,10 @@ the module calls. Modules which call fewer other modules are better targets.
|
||||
|
||||
Strive to change the C API as little as possible.
|
||||
|
||||
We are currently targeting Rust nightly, *for now*. We expect this to
|
||||
change moving forward, as we understand more about which nightly
|
||||
features we need. It is on our TODO list to try to cultivate good
|
||||
We are currently targetting Rust stable. (See CodingStandardsRust.md for more
|
||||
details.)
|
||||
|
||||
It is on our TODO list to try to cultivate good
|
||||
standing with various distro maintainers of `rustc` and `cargo`, in
|
||||
order to ensure that whatever version we solidify on is readily
|
||||
available.
|
||||
@ -139,6 +140,7 @@ Where <name_of_c_object> can be an enum, struct, constant, etc. Then,
|
||||
do the same in the C code, to note that rust will need to be changed
|
||||
when the C does.
|
||||
|
||||
|
||||
Adding your Rust module to Tor's build system
|
||||
-----------------------------------------------
|
||||
|
||||
|
@ -1496,7 +1496,10 @@ get_interface_addresses_win32(int severity, sa_family_t family)
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (!(fn = (GetAdaptersAddresses_fn_t)
|
||||
/* Cast through a void function pointer, to silence a spurious compiler
|
||||
* warning on 64-bit Windows. This cast is safe, because we are casting to
|
||||
* the correct type for GetAdaptersAddresses(). */
|
||||
if (!(fn = (GetAdaptersAddresses_fn_t)(void(*)(void))
|
||||
GetProcAddress(lib, "GetAdaptersAddresses"))) {
|
||||
log_fn(severity, LD_NET, "Unable to obtain pointer to "
|
||||
"GetAdaptersAddresses");
|
||||
|
@ -352,7 +352,7 @@ alert_sockets_close(alert_sockets_t *socks)
|
||||
socks->read_fd = socks->write_fd = -1;
|
||||
}
|
||||
|
||||
#ifndef HAVE_STDATOMIC_H
|
||||
#ifndef HAVE_WORKING_STDATOMIC
|
||||
/** Initialize a new atomic counter with the value 0 */
|
||||
void
|
||||
atomic_counter_init(atomic_counter_t *counter)
|
||||
@ -403,5 +403,4 @@ atomic_counter_exchange(atomic_counter_t *counter, size_t newval)
|
||||
tor_mutex_release(&counter->mutex);
|
||||
return oldval;
|
||||
}
|
||||
#endif /* !defined(HAVE_STDATOMIC_H) */
|
||||
|
||||
#endif /* !defined(HAVE_WORKING_STDATOMIC) */
|
||||
|
@ -14,7 +14,11 @@
|
||||
#include <pthread.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_STDATOMIC_H
|
||||
#if defined(HAVE_STDATOMIC_H) && defined(STDATOMIC_WORKS)
|
||||
#define HAVE_WORKING_STDATOMIC
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_WORKING_STDATOMIC
|
||||
#include <stdatomic.h>
|
||||
#endif
|
||||
|
||||
@ -156,18 +160,18 @@ void tor_threadlocal_set(tor_threadlocal_t *threadlocal, void *value);
|
||||
/**
|
||||
* Atomic counter type; holds a size_t value.
|
||||
*/
|
||||
#ifdef HAVE_STDATOMIC_H
|
||||
#ifdef HAVE_WORKING_STDATOMIC
|
||||
typedef struct atomic_counter_t {
|
||||
atomic_size_t val;
|
||||
} atomic_counter_t;
|
||||
#define ATOMIC_LINKAGE static
|
||||
#else /* !(defined(HAVE_STDATOMIC_H)) */
|
||||
#else /* !(defined(HAVE_WORKING_STDATOMIC)) */
|
||||
typedef struct atomic_counter_t {
|
||||
tor_mutex_t mutex;
|
||||
size_t val;
|
||||
} atomic_counter_t;
|
||||
#define ATOMIC_LINKAGE
|
||||
#endif /* defined(HAVE_STDATOMIC_H) */
|
||||
#endif /* defined(HAVE_WORKING_STDATOMIC) */
|
||||
|
||||
ATOMIC_LINKAGE void atomic_counter_init(atomic_counter_t *counter);
|
||||
ATOMIC_LINKAGE void atomic_counter_destroy(atomic_counter_t *counter);
|
||||
@ -178,7 +182,7 @@ ATOMIC_LINKAGE size_t atomic_counter_exchange(atomic_counter_t *counter,
|
||||
size_t newval);
|
||||
#undef ATOMIC_LINKAGE
|
||||
|
||||
#ifdef HAVE_STDATOMIC_H
|
||||
#ifdef HAVE_WORKING_STDATOMIC
|
||||
/** Initialize a new atomic counter with the value 0 */
|
||||
static inline void
|
||||
atomic_counter_init(atomic_counter_t *counter)
|
||||
@ -216,8 +220,7 @@ atomic_counter_exchange(atomic_counter_t *counter, size_t newval)
|
||||
return atomic_exchange(&counter->val, newval);
|
||||
}
|
||||
|
||||
#else /* !(defined(HAVE_STDATOMIC_H)) */
|
||||
#endif /* defined(HAVE_STDATOMIC_H) */
|
||||
#else /* !(defined(HAVE_WORKING_STDATOMIC)) */
|
||||
#endif /* defined(HAVE_WORKING_STDATOMIC) */
|
||||
|
||||
#endif /* !defined(TOR_COMPAT_THREADS_H) */
|
||||
|
||||
|
@ -19,10 +19,14 @@
|
||||
#include "compress_zstd.h"
|
||||
|
||||
#ifdef HAVE_ZSTD
|
||||
#ifdef HAVE_CFLAG_WUNUSED_CONST_VARIABLE
|
||||
DISABLE_GCC_WARNING(unused-const-variable)
|
||||
#endif
|
||||
#include <zstd.h>
|
||||
#ifdef HAVE_CFLAG_WUNUSED_CONST_VARIABLE
|
||||
ENABLE_GCC_WARNING(unused-const-variable)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/** Total number of bytes allocated for Zstandard state. */
|
||||
static atomic_counter_t total_zstd_allocation;
|
||||
|
@ -450,7 +450,7 @@ allow_file_open(scmp_filter_ctx ctx, int use_openat, const char *file)
|
||||
{
|
||||
if (use_openat) {
|
||||
return seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(openat),
|
||||
SCMP_CMP_STR(0, SCMP_CMP_EQ, AT_FDCWD),
|
||||
SCMP_CMP(0, SCMP_CMP_EQ, (unsigned int)AT_FDCWD),
|
||||
SCMP_CMP_STR(1, SCMP_CMP_EQ, file));
|
||||
} else {
|
||||
return seccomp_rule_add_1(ctx, SCMP_ACT_ALLOW, SCMP_SYS(open),
|
||||
|
@ -896,18 +896,20 @@ tor_tls_cert_get_key(tor_x509_cert_t *cert)
|
||||
MOCK_IMPL(int,
|
||||
tor_tls_cert_matches_key,(const tor_tls_t *tls, const tor_x509_cert_t *cert))
|
||||
{
|
||||
X509 *peercert = SSL_get_peer_certificate(tls->ssl);
|
||||
tor_x509_cert_t *peer = tor_tls_get_peer_cert((tor_tls_t *)tls);
|
||||
if (!peer)
|
||||
return 0;
|
||||
|
||||
X509 *peercert = peer->cert;
|
||||
EVP_PKEY *link_key = NULL, *cert_key = NULL;
|
||||
int result;
|
||||
|
||||
if (!peercert)
|
||||
return 0;
|
||||
link_key = X509_get_pubkey(peercert);
|
||||
cert_key = X509_get_pubkey(cert->cert);
|
||||
|
||||
result = link_key && cert_key && EVP_PKEY_cmp(cert_key, link_key) == 1;
|
||||
|
||||
X509_free(peercert);
|
||||
tor_x509_cert_free(peer);
|
||||
if (link_key)
|
||||
EVP_PKEY_free(link_key);
|
||||
if (cert_key)
|
||||
@ -1170,6 +1172,12 @@ tor_tls_context_new(crypto_pk_t *identity, unsigned int key_lifetime,
|
||||
if (!(result->ctx = SSL_CTX_new(SSLv23_method())))
|
||||
goto error;
|
||||
#endif /* defined(HAVE_TLS_METHOD) */
|
||||
|
||||
#ifdef HAVE_SSL_CTX_SET_SECURITY_LEVEL
|
||||
/* Level 1 re-enables RSA1024 and DH1024 for compatibility with old tors */
|
||||
SSL_CTX_set_security_level(result->ctx, 1);
|
||||
#endif
|
||||
|
||||
SSL_CTX_set_options(result->ctx, SSL_OP_NO_SSLv2);
|
||||
SSL_CTX_set_options(result->ctx, SSL_OP_NO_SSLv3);
|
||||
|
||||
@ -2639,4 +2647,3 @@ evaluate_ecgroup_for_tls(const char *ecgroup)
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
59634
src/config/geoip
59634
src/config/geoip
File diff suppressed because it is too large
Load Diff
9942
src/config/geoip6
9942
src/config/geoip6
File diff suppressed because it is too large
Load Diff
@ -207,12 +207,20 @@ testcase_run_forked_(const struct testgroup_t *group,
|
||||
r = (int)read(outcome_pipe[0], b, 1);
|
||||
if (r == 0) {
|
||||
printf("[Lost connection!] ");
|
||||
return 0;
|
||||
return FAIL;
|
||||
} else if (r != 1) {
|
||||
perror("read outcome from pipe");
|
||||
}
|
||||
waitpid(pid, &status, 0);
|
||||
r = waitpid(pid, &status, 0);
|
||||
close(outcome_pipe[0]);
|
||||
if (r == -1) {
|
||||
perror("waitpid");
|
||||
return FAIL;
|
||||
}
|
||||
if (! WIFEXITED(status) || WEXITSTATUS(status) != 0) {
|
||||
printf("[did not exit cleanly.]");
|
||||
return FAIL;
|
||||
}
|
||||
return b[0]=='Y' ? OK : (b[0]=='S' ? SKIP : FAIL);
|
||||
}
|
||||
#endif
|
||||
|
@ -8,8 +8,8 @@
|
||||
"dizum orport=443 "
|
||||
"v3ident=E8A9C45EDE6D711294FADF8E7951F4DE6CA56B58 "
|
||||
"194.109.206.212:80 7EA6 EAD6 FD83 083C 538F 4403 8BBF A077 587D D755",
|
||||
"Bifroest orport=443 bridge "
|
||||
"37.218.247.217:80 1D8F 3A91 C37C 5D1C 4C19 B1AD 1D0C FBE8 BF72 D8E1",
|
||||
"Serge orport=9001 bridge "
|
||||
"66.111.2.131:9030 BA44 A889 E64B 93FA A2B1 14E0 2C2A 279A 8555 C533",
|
||||
"gabelmoo orport=443 "
|
||||
"v3ident=ED03BB616EB2F60BEC80151114BB25CEF515B226 "
|
||||
"ipv6=[2001:638:a000:4140::ffff:189]:443 "
|
||||
|
@ -379,7 +379,8 @@ channelpadding_send_padding_cell_for_callback(channel_t *chan)
|
||||
chan->pending_padding_callback = 0;
|
||||
|
||||
if (monotime_coarse_is_zero(&chan->next_padding_time) ||
|
||||
chan->has_queued_writes(chan)) {
|
||||
chan->has_queued_writes(chan) ||
|
||||
(chan->cmux && circuitmux_num_cells(chan->cmux))) {
|
||||
/* We must have been active before the timer fired */
|
||||
monotime_coarse_zero(&chan->next_padding_time);
|
||||
return;
|
||||
@ -755,7 +756,11 @@ channelpadding_decide_to_pad_channel(channel_t *chan)
|
||||
return CHANNELPADDING_WONTPAD;
|
||||
}
|
||||
|
||||
if (!chan->has_queued_writes(chan)) {
|
||||
/* There should always be a cmux on the circuit. After that,
|
||||
* only schedule padding if there are no queued writes and no
|
||||
* queued cells in circuitmux queues. */
|
||||
if (chan->cmux && !chan->has_queued_writes(chan) &&
|
||||
!circuitmux_num_cells(chan->cmux)) {
|
||||
int is_client_channel = 0;
|
||||
|
||||
if (CHANNEL_IS_CLIENT(chan, options)) {
|
||||
|
@ -1757,6 +1757,39 @@ circuit_build_failed(origin_circuit_t *circ)
|
||||
* the last hop or an earlier hop. then use this info below.
|
||||
*/
|
||||
int failed_at_last_hop = 0;
|
||||
|
||||
/* First, check to see if this was a path failure, rather than build
|
||||
* failure.
|
||||
*
|
||||
* Note that we deliberately use circuit_get_cpath_len() (and not
|
||||
* circuit_get_cpath_opened_len()) because we only want to ensure
|
||||
* that a full path is *chosen*. This is different than a full path
|
||||
* being *built*. We only want to count *build* failures below.
|
||||
*
|
||||
* Path selection failures can happen spuriously for a number
|
||||
* of reasons (such as aggressive/invalid user-specified path
|
||||
* restrictions in the torrc, insufficient microdescriptors, and
|
||||
* non-user reasons like exitpolicy issues), and so should not be
|
||||
* counted as failures below.
|
||||
*/
|
||||
if (circuit_get_cpath_len(circ) < circ->build_state->desired_path_len) {
|
||||
static ratelim_t pathfail_limit = RATELIM_INIT(3600);
|
||||
log_fn_ratelim(&pathfail_limit, LOG_NOTICE, LD_CIRC,
|
||||
"Our circuit %u (id: %" PRIu32 ") died due to an invalid "
|
||||
"selected path, purpose %s. This may be a torrc "
|
||||
"configuration issue, or a bug.",
|
||||
TO_CIRCUIT(circ)->n_circ_id, circ->global_identifier,
|
||||
circuit_purpose_to_string(TO_CIRCUIT(circ)->purpose));
|
||||
|
||||
/* If the path failed on an RP, retry it. */
|
||||
if (TO_CIRCUIT(circ)->purpose == CIRCUIT_PURPOSE_S_CONNECT_REND)
|
||||
hs_circ_retry_service_rendezvous_point(circ);
|
||||
|
||||
/* In all other cases, just bail. The rest is just failure accounting
|
||||
* that we don't want to do */
|
||||
return;
|
||||
}
|
||||
|
||||
/* If the last hop isn't open, and the second-to-last is, we failed
|
||||
* at the last hop. */
|
||||
if (circ->cpath &&
|
||||
@ -1806,18 +1839,8 @@ circuit_build_failed(origin_circuit_t *circ)
|
||||
* If we have guard state (new guard API) and our path selection
|
||||
* code actually chose a full path, then blame the failure of this
|
||||
* circuit on the guard.
|
||||
*
|
||||
* Note that we deliberately use circuit_get_cpath_len() (and not
|
||||
* circuit_get_cpath_opened_len()) because we only want to ensure
|
||||
* that a full path is *chosen*. This is different than a full path
|
||||
* being *built*. We only want to blame *build* failures on this
|
||||
* guard. Path selection failures can happen spuriously for a number
|
||||
* of reasons (such as aggressive/invalid user-specified path
|
||||
* restrictions in the torrc, as well as non-user reasons like
|
||||
* exitpolicy issues), and so should not be counted here.
|
||||
*/
|
||||
if (circ->guard_state &&
|
||||
circuit_get_cpath_len(circ) >= circ->build_state->desired_path_len)
|
||||
if (circ->guard_state)
|
||||
entry_guard_failed(&circ->guard_state);
|
||||
/* if there are any one-hop streams waiting on this circuit, fail
|
||||
* them now so they can retry elsewhere. */
|
||||
|
@ -868,6 +868,7 @@ set_options(or_options_t *new_val, char **msg)
|
||||
"Acting on config options left us in a broken state. Dying.");
|
||||
tor_shutdown_event_loop_and_exit(1);
|
||||
}
|
||||
global_options = old_options;
|
||||
return -1;
|
||||
}
|
||||
/* Issues a CONF_CHANGED event to notify controller of the change. If Tor is
|
||||
@ -3472,6 +3473,14 @@ options_validate(or_options_t *old_options, or_options_t *options,
|
||||
!options->RecommendedServerVersions))
|
||||
REJECT("Versioning authoritative dir servers must set "
|
||||
"Recommended*Versions.");
|
||||
|
||||
char *t;
|
||||
/* Call these functions to produce warnings only. */
|
||||
t = format_recommended_version_list(options->RecommendedClientVersions, 1);
|
||||
tor_free(t);
|
||||
t = format_recommended_version_list(options->RecommendedServerVersions, 1);
|
||||
tor_free(t);
|
||||
|
||||
if (options->UseEntryGuards) {
|
||||
log_info(LD_CONFIG, "Authoritative directory servers can't set "
|
||||
"UseEntryGuards. Disabling.");
|
||||
@ -8399,4 +8408,3 @@ init_cookie_authentication(const char *fname, const char *header,
|
||||
tor_free(cookie_file_str);
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
@ -4166,4 +4166,3 @@ connection_edge_free_all(void)
|
||||
smartlist_free(pending_entry_connections);
|
||||
pending_entry_connections = NULL;
|
||||
}
|
||||
|
||||
|
@ -50,6 +50,7 @@
|
||||
#include "proto_cell.h"
|
||||
#include "reasons.h"
|
||||
#include "relay.h"
|
||||
#include "rendcommon.h"
|
||||
#include "rephist.h"
|
||||
#include "router.h"
|
||||
#include "routerkeys.h"
|
||||
@ -1923,10 +1924,13 @@ connection_or_client_learned_peer_id(or_connection_t *conn,
|
||||
conn->identity_digest);
|
||||
const int is_authority_fingerprint = router_digest_is_trusted_dir(
|
||||
conn->identity_digest);
|
||||
const int non_anonymous_mode = rend_non_anonymous_mode_enabled(options);
|
||||
int severity;
|
||||
const char *extra_log = "";
|
||||
|
||||
if (server_mode(options)) {
|
||||
/* Relays, Single Onion Services, and Tor2web make direct connections using
|
||||
* untrusted authentication keys. */
|
||||
if (server_mode(options) || non_anonymous_mode) {
|
||||
severity = LOG_PROTOCOL_WARN;
|
||||
} else {
|
||||
if (using_hardcoded_fingerprints) {
|
||||
@ -1950,8 +1954,8 @@ connection_or_client_learned_peer_id(or_connection_t *conn,
|
||||
}
|
||||
|
||||
log_fn(severity, LD_HANDSHAKE,
|
||||
"Tried connecting to router at %s:%d, but RSA identity key was not "
|
||||
"as expected: wanted %s + %s but got %s + %s.%s",
|
||||
"Tried connecting to router at %s:%d, but RSA + ed25519 identity "
|
||||
"keys were not as expected: wanted %s + %s but got %s + %s.%s",
|
||||
conn->base_.address, conn->base_.port,
|
||||
expected_rsa, expected_ed, seen_rsa, seen_ed, extra_log);
|
||||
|
||||
@ -1968,8 +1972,8 @@ connection_or_client_learned_peer_id(or_connection_t *conn,
|
||||
}
|
||||
|
||||
if (!expected_ed_key && ed_peer_id) {
|
||||
log_info(LD_HANDSHAKE, "(we had no Ed25519 ID in mind when we made this "
|
||||
"connection.");
|
||||
log_info(LD_HANDSHAKE, "(We had no Ed25519 ID in mind when we made this "
|
||||
"connection.)");
|
||||
connection_or_set_identity_digest(conn,
|
||||
(const char*)rsa_peer_id, ed_peer_id);
|
||||
changed_identity = 1;
|
||||
|
@ -1896,6 +1896,8 @@ getinfo_helper_listeners(control_connection_t *control_conn,
|
||||
|
||||
if (!strcmp(question, "net/listeners/or"))
|
||||
type = CONN_TYPE_OR_LISTENER;
|
||||
else if (!strcmp(question, "net/listeners/extor"))
|
||||
type = CONN_TYPE_EXT_OR_LISTENER;
|
||||
else if (!strcmp(question, "net/listeners/dir"))
|
||||
type = CONN_TYPE_DIR_LISTENER;
|
||||
else if (!strcmp(question, "net/listeners/socks"))
|
||||
@ -1904,6 +1906,8 @@ getinfo_helper_listeners(control_connection_t *control_conn,
|
||||
type = CONN_TYPE_AP_TRANS_LISTENER;
|
||||
else if (!strcmp(question, "net/listeners/natd"))
|
||||
type = CONN_TYPE_AP_NATD_LISTENER;
|
||||
else if (!strcmp(question, "net/listeners/httptunnel"))
|
||||
type = CONN_TYPE_AP_HTTP_CONNECT_LISTENER;
|
||||
else if (!strcmp(question, "net/listeners/dns"))
|
||||
type = CONN_TYPE_AP_DNS_LISTENER;
|
||||
else if (!strcmp(question, "net/listeners/control"))
|
||||
@ -7610,6 +7614,14 @@ control_free_all(void)
|
||||
tor_event_free(flush_queued_events_event);
|
||||
flush_queued_events_event = NULL;
|
||||
}
|
||||
bootstrap_percent = BOOTSTRAP_STATUS_UNDEF;
|
||||
notice_bootstrap_percent = 0;
|
||||
bootstrap_problems = 0;
|
||||
authentication_cookie_is_set = 0;
|
||||
global_event_mask = 0;
|
||||
disable_log_messages = 0;
|
||||
memset(last_sent_bootstrap_message, 0, sizeof(last_sent_bootstrap_message));
|
||||
flush_queued_event_pending = 0;
|
||||
}
|
||||
|
||||
#ifdef TOR_UNIT_TESTS
|
||||
@ -7620,4 +7632,3 @@ control_testing_set_global_event_mask(uint64_t mask)
|
||||
global_event_mask = mask;
|
||||
}
|
||||
#endif /* defined(TOR_UNIT_TESTS) */
|
||||
|
||||
|
@ -74,7 +74,6 @@
|
||||
static int routers_with_measured_bw = 0;
|
||||
|
||||
static void directory_remove_invalid(void);
|
||||
static char *format_versions_list(config_line_t *ln);
|
||||
struct authdir_config_t;
|
||||
static uint32_t
|
||||
dirserv_get_status_impl(const char *fp, const char *nickname,
|
||||
@ -1061,8 +1060,8 @@ list_server_status_v1(smartlist_t *routers, char **router_status_out,
|
||||
* allocate and return a new string containing the version numbers, in order,
|
||||
* separated by commas. Used to generate Recommended(Client|Server)?Versions
|
||||
*/
|
||||
static char *
|
||||
format_versions_list(config_line_t *ln)
|
||||
char *
|
||||
format_recommended_version_list(const config_line_t *ln, int warn)
|
||||
{
|
||||
smartlist_t *versions;
|
||||
char *result;
|
||||
@ -1071,6 +1070,37 @@ format_versions_list(config_line_t *ln)
|
||||
smartlist_split_string(versions, ln->value, ",",
|
||||
SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0);
|
||||
}
|
||||
|
||||
/* Handle the case where a dirauth operator has accidentally made some
|
||||
* versions space-separated instead of comma-separated. */
|
||||
smartlist_t *more_versions = smartlist_new();
|
||||
SMARTLIST_FOREACH_BEGIN(versions, char *, v) {
|
||||
if (strchr(v, ' ')) {
|
||||
if (warn)
|
||||
log_warn(LD_DIRSERV, "Unexpected space in versions list member %s. "
|
||||
"(These are supposed to be comma-separated; I'll pretend you "
|
||||
"used commas instead.)", escaped(v));
|
||||
SMARTLIST_DEL_CURRENT(versions, v);
|
||||
smartlist_split_string(more_versions, v, NULL,
|
||||
SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0);
|
||||
tor_free(v);
|
||||
}
|
||||
} SMARTLIST_FOREACH_END(v);
|
||||
smartlist_add_all(versions, more_versions);
|
||||
smartlist_free(more_versions);
|
||||
|
||||
/* Check to make sure everything looks like a version. */
|
||||
if (warn) {
|
||||
SMARTLIST_FOREACH_BEGIN(versions, const char *, v) {
|
||||
tor_version_t ver;
|
||||
if (tor_version_parse(v, &ver) < 0) {
|
||||
log_warn(LD_DIRSERV, "Recommended version %s does not look valid. "
|
||||
" (I'll include it anyway, since you told me to.)",
|
||||
escaped(v));
|
||||
}
|
||||
} SMARTLIST_FOREACH_END(v);
|
||||
}
|
||||
|
||||
sort_version_list(versions, 1);
|
||||
result = smartlist_join_strings(versions,",",0,NULL);
|
||||
SMARTLIST_FOREACH(versions,char *,s,tor_free(s));
|
||||
@ -2911,8 +2941,10 @@ dirserv_generate_networkstatus_vote_obj(crypto_pk_t *private_key,
|
||||
}
|
||||
|
||||
if (options->VersioningAuthoritativeDir) {
|
||||
client_versions = format_versions_list(options->RecommendedClientVersions);
|
||||
server_versions = format_versions_list(options->RecommendedServerVersions);
|
||||
client_versions =
|
||||
format_recommended_version_list(options->RecommendedClientVersions, 0);
|
||||
server_versions =
|
||||
format_recommended_version_list(options->RecommendedServerVersions, 0);
|
||||
}
|
||||
|
||||
contact = get_options()->ContactInfo;
|
||||
@ -3076,16 +3108,16 @@ dirserv_generate_networkstatus_vote_obj(crypto_pk_t *private_key,
|
||||
/* These are hardwired, to avoid disaster. */
|
||||
v3_out->recommended_relay_protocols =
|
||||
tor_strdup("Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 "
|
||||
"Link=4 LinkAuth=1 Microdesc=1-2 Relay=2");
|
||||
"Link=4 Microdesc=1-2 Relay=2");
|
||||
v3_out->recommended_client_protocols =
|
||||
tor_strdup("Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 "
|
||||
"Link=4 LinkAuth=1 Microdesc=1-2 Relay=2");
|
||||
"Link=4 Microdesc=1-2 Relay=2");
|
||||
v3_out->required_client_protocols =
|
||||
tor_strdup("Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 "
|
||||
"Link=4 LinkAuth=1 Microdesc=1-2 Relay=2");
|
||||
"Link=4 Microdesc=1-2 Relay=2");
|
||||
v3_out->required_relay_protocols =
|
||||
tor_strdup("Cons=1 Desc=1 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 "
|
||||
"Link=3-4 LinkAuth=1 Microdesc=1 Relay=1-2");
|
||||
"Link=3-4 Microdesc=1 Relay=1-2");
|
||||
|
||||
/* We are not allowed to vote to require anything we don't have. */
|
||||
tor_assert(protover_all_supported(v3_out->required_relay_protocols, NULL));
|
||||
@ -4062,4 +4094,3 @@ dirserv_free_all(void)
|
||||
|
||||
dirserv_clear_measured_bw_cache();
|
||||
}
|
||||
|
||||
|
@ -155,7 +155,7 @@ char *routerstatus_format_entry(
|
||||
void dirserv_free_all(void);
|
||||
void cached_dir_decref(cached_dir_t *d);
|
||||
cached_dir_t *new_cached_dir(char *s, time_t published);
|
||||
|
||||
char *format_recommended_version_list(const config_line_t *line, int warn);
|
||||
int validate_recommended_package_line(const char *line);
|
||||
|
||||
#ifdef DIRSERV_PRIVATE
|
||||
@ -208,4 +208,3 @@ void dirserv_spool_sort(dir_connection_t *conn);
|
||||
void dir_conn_clear_spool(dir_connection_t *conn);
|
||||
|
||||
#endif /* !defined(TOR_DIRSERV_H) */
|
||||
|
||||
|
@ -707,6 +707,14 @@ compute_consensus_versions_list(smartlist_t *lst, int n_versioning)
|
||||
int min = n_versioning / 2;
|
||||
smartlist_t *good = smartlist_new();
|
||||
char *result;
|
||||
SMARTLIST_FOREACH_BEGIN(lst, const char *, v) {
|
||||
if (strchr(v, ' ')) {
|
||||
log_warn(LD_DIR, "At least one authority has voted for a version %s "
|
||||
"that contains a space. This probably wasn't intentional, and "
|
||||
"is likely to cause trouble. Please tell them to stop it.",
|
||||
escaped(v));
|
||||
}
|
||||
} SMARTLIST_FOREACH_END(v);
|
||||
sort_version_list(lst, 0);
|
||||
get_frequent_members(good, lst, min);
|
||||
result = smartlist_join_strings(good, ",", 0, NULL);
|
||||
@ -4077,4 +4085,3 @@ vote_routerstatus_find_microdesc_hash(char *digest256_out,
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -559,10 +559,14 @@ retry_service_rendezvous_point(const origin_circuit_t *circ)
|
||||
return;
|
||||
}
|
||||
|
||||
/* Add all possible link specifiers in node to lspecs.
|
||||
* legacy ID is mandatory thus MUST be present in node. If the primary address
|
||||
* is not IPv4, log a BUG() warning, and return an empty smartlist.
|
||||
* Includes ed25519 id and IPv6 link specifiers if present in the node. */
|
||||
/* Add all possible link specifiers in node to lspecs:
|
||||
* - legacy ID is mandatory thus MUST be present in node;
|
||||
* - include ed25519 link specifier if present in the node, and the node
|
||||
* supports ed25519 link authentication, even if its link versions are not
|
||||
* compatible with us;
|
||||
* - include IPv4 link specifier, if the primary address is not IPv4, log a
|
||||
* BUG() warning, and return an empty smartlist;
|
||||
* - include IPv6 link specifier if present in the node. */
|
||||
static void
|
||||
get_lspecs_from_node(const node_t *node, smartlist_t *lspecs)
|
||||
{
|
||||
@ -600,8 +604,12 @@ get_lspecs_from_node(const node_t *node, smartlist_t *lspecs)
|
||||
link_specifier_set_ls_len(ls, link_specifier_getlen_un_legacy_id(ls));
|
||||
smartlist_add(lspecs, ls);
|
||||
|
||||
/* ed25519 ID is only included if the node has it. */
|
||||
if (!ed25519_public_key_is_zero(&node->ed25519_id)) {
|
||||
/* ed25519 ID is only included if the node has it, and the node declares a
|
||||
protocol version that supports ed25519 link authentication, even if that
|
||||
link version is not compatible with us. (We are sending the ed25519 key
|
||||
to another tor, which may support different link versions.) */
|
||||
if (!ed25519_public_key_is_zero(&node->ed25519_id) &&
|
||||
node_supports_ed25519_link_authentication(node, 0)) {
|
||||
ls = link_specifier_new();
|
||||
link_specifier_set_ls_type(ls, LS_ED25519_ID);
|
||||
memcpy(link_specifier_getarray_un_ed25519_id(ls), &node->ed25519_id,
|
||||
|
@ -376,17 +376,21 @@ service_intro_point_free_void(void *obj)
|
||||
}
|
||||
|
||||
/* Return a newly allocated service intro point and fully initialized from the
|
||||
* given extend_info_t ei if non NULL. If is_legacy is true, we also generate
|
||||
* the legacy key. On error, NULL is returned.
|
||||
* given extend_info_t ei if non NULL.
|
||||
* If is_legacy is true, we also generate the legacy key.
|
||||
* If supports_ed25519_link_handshake_any is true, we add the relay's ed25519
|
||||
* key to the link specifiers.
|
||||
*
|
||||
* If ei is NULL, returns a hs_service_intro_point_t with an empty link
|
||||
* specifier list and no onion key. (This is used for testing.)
|
||||
* On any other error, NULL is returned.
|
||||
*
|
||||
* ei must be an extend_info_t containing an IPv4 address. (We will add supoort
|
||||
* for IPv6 in a later release.) When calling extend_info_from_node(), pass
|
||||
* 0 in for_direct_connection to make sure ei always has an IPv4 address. */
|
||||
STATIC hs_service_intro_point_t *
|
||||
service_intro_point_new(const extend_info_t *ei, unsigned int is_legacy)
|
||||
service_intro_point_new(const extend_info_t *ei, unsigned int is_legacy,
|
||||
unsigned int supports_ed25519_link_handshake_any)
|
||||
{
|
||||
hs_desc_link_specifier_t *ls;
|
||||
hs_service_intro_point_t *ip;
|
||||
@ -453,10 +457,13 @@ service_intro_point_new(const extend_info_t *ei, unsigned int is_legacy)
|
||||
}
|
||||
smartlist_add(ip->base.link_specifiers, ls);
|
||||
|
||||
/* ed25519 identity key is optional for intro points */
|
||||
ls = hs_desc_link_specifier_new(ei, LS_ED25519_ID);
|
||||
if (ls) {
|
||||
smartlist_add(ip->base.link_specifiers, ls);
|
||||
/* ed25519 identity key is optional for intro points. If the node supports
|
||||
* ed25519 link authentication, we include it. */
|
||||
if (supports_ed25519_link_handshake_any) {
|
||||
ls = hs_desc_link_specifier_new(ei, LS_ED25519_ID);
|
||||
if (ls) {
|
||||
smartlist_add(ip->base.link_specifiers, ls);
|
||||
}
|
||||
}
|
||||
|
||||
/* IPv6 is not supported in this release. */
|
||||
@ -847,6 +854,7 @@ move_hs_state(hs_service_t *src_service, hs_service_t *dst_service)
|
||||
replaycache_free(dst->replay_cache_rend_cookie);
|
||||
}
|
||||
dst->replay_cache_rend_cookie = src->replay_cache_rend_cookie;
|
||||
dst->next_rotation_time = src->next_rotation_time;
|
||||
|
||||
src->replay_cache_rend_cookie = NULL; /* steal pointer reference */
|
||||
}
|
||||
@ -975,9 +983,9 @@ load_service_keys(hs_service_t *service)
|
||||
* files to that directory so make sure it exists and has the right
|
||||
* permissions. We do this here because at this stage we know that Tor is
|
||||
* actually running and the service we have has been validated. */
|
||||
if (BUG(hs_check_service_private_dir(get_options()->User,
|
||||
config->directory_path,
|
||||
config->dir_group_readable, 1) < 0)) {
|
||||
if (hs_check_service_private_dir(get_options()->User,
|
||||
config->directory_path,
|
||||
config->dir_group_readable, 1) < 0) {
|
||||
goto end;
|
||||
}
|
||||
|
||||
@ -1586,8 +1594,12 @@ pick_intro_point(unsigned int direct_conn, smartlist_t *exclude_nodes)
|
||||
tor_assert_nonfatal(!ed25519_public_key_is_zero(&info->ed_identity));
|
||||
}
|
||||
|
||||
/* Create our objects and populate them with the node information. */
|
||||
ip = service_intro_point_new(info, !node_supports_ed25519_hs_intro(node));
|
||||
/* Create our objects and populate them with the node information.
|
||||
* We don't care if the intro's link auth is compatible with us, because
|
||||
* we are sending the ed25519 key to a remote client via the descriptor. */
|
||||
ip = service_intro_point_new(info, !node_supports_ed25519_hs_intro(node),
|
||||
node_supports_ed25519_link_authentication(node,
|
||||
0));
|
||||
if (ip == NULL) {
|
||||
goto err;
|
||||
}
|
||||
|
@ -307,8 +307,9 @@ STATIC void remove_service(hs_service_ht *map, hs_service_t *service);
|
||||
STATIC int register_service(hs_service_ht *map, hs_service_t *service);
|
||||
/* Service introduction point functions. */
|
||||
STATIC hs_service_intro_point_t *service_intro_point_new(
|
||||
const extend_info_t *ei,
|
||||
unsigned int is_legacy);
|
||||
const extend_info_t *ei,
|
||||
unsigned int is_legacy,
|
||||
unsigned int supports_ed25519_link_handshake_any);
|
||||
STATIC void service_intro_point_free_(hs_service_intro_point_t *ip);
|
||||
#define service_intro_point_free(ip) \
|
||||
FREE_AND_NULL(hs_service_intro_point_t, \
|
||||
|
@ -3995,6 +3995,13 @@ tor_run_main(const tor_main_configuration_t *tor_cfg)
|
||||
#endif
|
||||
/* On heap corruption, just give up; don't try to play along. */
|
||||
HeapSetInformation(NULL, HeapEnableTerminationOnCorruption, NULL, 0);
|
||||
|
||||
/* SetProcessDEPPolicy is only supported on 32-bit Windows.
|
||||
* (On 64-bit Windows it always fails, and some compilers don't like the
|
||||
* PSETDEP cast.)
|
||||
* 32-bit Windows defines _WIN32.
|
||||
* 64-bit Windows defines _WIN32 and _WIN64. */
|
||||
#ifndef _WIN64
|
||||
/* Call SetProcessDEPPolicy to permanently enable DEP.
|
||||
The function will not resolve on earlier versions of Windows,
|
||||
and failure is not dangerous. */
|
||||
@ -4008,6 +4015,7 @@ tor_run_main(const tor_main_configuration_t *tor_cfg)
|
||||
setdeppolicy(3);
|
||||
}
|
||||
}
|
||||
#endif /* !defined(_WIN64) */
|
||||
#endif /* defined(_WIN32) */
|
||||
|
||||
configure_backtrace_handler(get_version());
|
||||
@ -4035,10 +4043,10 @@ tor_run_main(const tor_main_configuration_t *tor_cfg)
|
||||
#endif /* defined(NT_SERVICE) */
|
||||
{
|
||||
int init_rv = tor_init(argc, argv);
|
||||
if (init_rv < 0)
|
||||
return -1;
|
||||
else if (init_rv > 0)
|
||||
return 0;
|
||||
if (init_rv) {
|
||||
tor_free_all(0);
|
||||
return (init_rv < 0) ? -1 : 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (get_options()->Sandbox && get_options()->command == CMD_RUN_TOR) {
|
||||
@ -4046,6 +4054,7 @@ tor_run_main(const tor_main_configuration_t *tor_cfg)
|
||||
|
||||
if (sandbox_init(cfg)) {
|
||||
log_err(LD_BUG,"Failed to create syscall sandbox filter");
|
||||
tor_free_all(0);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -238,6 +238,15 @@ rend_client_send_introduction(origin_circuit_t *introcirc,
|
||||
dh_offset = v3_shift+7+DIGEST_LEN+2+klen+REND_COOKIE_LEN;
|
||||
} else {
|
||||
/* Version 0. */
|
||||
|
||||
/* Some compilers are smart enough to work out that nickname can be more
|
||||
* than 19 characters, when it's a hexdigest. They warn that strncpy()
|
||||
* will truncate hexdigests without NUL-terminating them. But we only put
|
||||
* hexdigests in HSDir and general circuit exits. */
|
||||
if (BUG(strlen(rendcirc->build_state->chosen_exit->nickname)
|
||||
> MAX_NICKNAME_LEN)) {
|
||||
goto perm_err;
|
||||
}
|
||||
strncpy(tmp, rendcirc->build_state->chosen_exit->nickname,
|
||||
(MAX_NICKNAME_LEN+1)); /* nul pads */
|
||||
memcpy(tmp+MAX_NICKNAME_LEN+1, rendcirc->rend_data->rend_cookie,
|
||||
|
@ -1950,10 +1950,11 @@ router_compare_to_my_exit_policy(const tor_addr_t *addr, uint16_t port)
|
||||
MOCK_IMPL(int,
|
||||
router_my_exit_policy_is_reject_star,(void))
|
||||
{
|
||||
if (!router_get_my_routerinfo()) /* make sure routerinfo exists */
|
||||
const routerinfo_t *me = router_get_my_routerinfo();
|
||||
if (!me) /* make sure routerinfo exists */
|
||||
return -1;
|
||||
|
||||
return router_get_my_routerinfo()->policy_is_reject_star;
|
||||
return me->policy_is_reject_star;
|
||||
}
|
||||
|
||||
/** Return true iff I'm a server and <b>digest</b> is equal to
|
||||
@ -2522,10 +2523,11 @@ check_descriptor_bandwidth_changed(time_t now)
|
||||
{
|
||||
static time_t last_changed = 0;
|
||||
uint64_t prev, cur;
|
||||
if (!router_get_my_routerinfo())
|
||||
const routerinfo_t *my_ri = router_get_my_routerinfo();
|
||||
if (!my_ri) /* make sure routerinfo exists */
|
||||
return;
|
||||
|
||||
prev = router_get_my_routerinfo()->bandwidthcapacity;
|
||||
prev = my_ri->bandwidthcapacity;
|
||||
cur = we_are_hibernating() ? 0 : rep_hist_bandwidth_assess();
|
||||
if ((prev != cur && (!prev || !cur)) ||
|
||||
cur > prev*2 ||
|
||||
@ -2576,14 +2578,15 @@ check_descriptor_ipaddress_changed(time_t now)
|
||||
const or_options_t *options = get_options();
|
||||
const char *method = NULL;
|
||||
char *hostname = NULL;
|
||||
const routerinfo_t *my_ri = router_get_my_routerinfo();
|
||||
|
||||
(void) now;
|
||||
|
||||
if (router_get_my_routerinfo() == NULL)
|
||||
if (my_ri == NULL) /* make sure routerinfo exists */
|
||||
return;
|
||||
|
||||
/* XXXX ipv6 */
|
||||
prev = router_get_my_routerinfo()->addr;
|
||||
prev = my_ri->addr;
|
||||
if (resolve_my_address(LOG_INFO, options, &cur, &method, &hostname) < 0) {
|
||||
log_info(LD_CONFIG,"options->Address didn't resolve into an IP.");
|
||||
return;
|
||||
|
@ -18,6 +18,7 @@ pub enum ProtoverError {
|
||||
ExceedsExpansionLimit,
|
||||
UnknownProtocol,
|
||||
ExceedsNameLimit,
|
||||
InvalidProtocol,
|
||||
}
|
||||
|
||||
/// Descriptive error messages for `ProtoverError` variants.
|
||||
@ -38,6 +39,8 @@ impl Display for ProtoverError {
|
||||
=> write!(f, "A protocol in the protover string we attempted to parse is unknown."),
|
||||
ProtoverError::ExceedsNameLimit
|
||||
=> write!(f, "An unrecognised protocol name was too long."),
|
||||
ProtoverError::InvalidProtocol
|
||||
=> write!(f, "A protocol name includes invalid characters."),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -4,6 +4,8 @@
|
||||
|
||||
//! Sets for lazily storing ordered, non-overlapping ranges of integers.
|
||||
|
||||
use std::cmp;
|
||||
use std::iter;
|
||||
use std::slice;
|
||||
use std::str::FromStr;
|
||||
use std::u32;
|
||||
@ -174,7 +176,7 @@ impl ProtoSet {
|
||||
if low == u32::MAX || high == u32::MAX {
|
||||
return Err(ProtoverError::ExceedsMax);
|
||||
}
|
||||
if low < last_high {
|
||||
if low <= last_high {
|
||||
return Err(ProtoverError::Overlap);
|
||||
} else if low > high {
|
||||
return Err(ProtoverError::LowGreaterThanHigh);
|
||||
@ -240,8 +242,8 @@ impl ProtoSet {
|
||||
false
|
||||
}
|
||||
|
||||
/// Retain only the `Version`s in this `ProtoSet` for which the predicate
|
||||
/// `F` returns `true`.
|
||||
/// Returns all the `Version`s in `self` which are not also in the `other`
|
||||
/// `ProtoSet`.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
@ -250,24 +252,45 @@ impl ProtoSet {
|
||||
/// use protover::protoset::ProtoSet;
|
||||
///
|
||||
/// # fn do_test() -> Result<bool, ProtoverError> {
|
||||
/// let mut protoset: ProtoSet = "1,3-5,9".parse()?;
|
||||
/// let protoset: ProtoSet = "1,3-6,10-12,15-16".parse()?;
|
||||
/// let other: ProtoSet = "2,5-7,9-11,14-20".parse()?;
|
||||
///
|
||||
/// // Keep only versions less than or equal to 8:
|
||||
/// protoset.retain(|x| x <= &8);
|
||||
/// let subset: ProtoSet = protoset.and_not_in(&other);
|
||||
///
|
||||
/// assert_eq!(protoset.expand(), vec![1, 3, 4, 5]);
|
||||
/// assert_eq!(subset.expand(), vec![1, 3, 4, 12]);
|
||||
/// #
|
||||
/// # Ok(true)
|
||||
/// # }
|
||||
/// # fn main() { do_test(); } // wrap the test so we can use the ? operator
|
||||
/// ```
|
||||
// XXX we could probably do something more efficient here. —isis
|
||||
pub fn retain<F>(&mut self, f: F)
|
||||
where F: FnMut(&Version) -> bool
|
||||
{
|
||||
let mut expanded: Vec<Version> = self.clone().expand();
|
||||
expanded.retain(f);
|
||||
*self = expanded.into();
|
||||
pub fn and_not_in(&self, other: &Self) -> Self {
|
||||
if self.is_empty() || other.is_empty() {
|
||||
return self.clone();
|
||||
}
|
||||
|
||||
let pairs = self.iter().flat_map(|&(lo, hi)| {
|
||||
let the_end = (hi + 1, hi + 1); // special case to mark the end of the range.
|
||||
let excluded_ranges = other
|
||||
.iter()
|
||||
.cloned() // have to be owned tuples, to match iter::once(the_end).
|
||||
.skip_while(move|&(_, hi2)| hi2 < lo) // skip the non-overlapping ranges.
|
||||
.take_while(move|&(lo2, _)| lo2 <= hi) // take all the overlapping ones.
|
||||
.chain(iter::once(the_end));
|
||||
|
||||
let mut nextlo = lo;
|
||||
excluded_ranges.filter_map(move |(excluded_lo, excluded_hi)| {
|
||||
let pair = if nextlo < excluded_lo {
|
||||
Some((nextlo, excluded_lo - 1))
|
||||
} else {
|
||||
None
|
||||
};
|
||||
nextlo = cmp::min(excluded_hi, u32::MAX - 1) + 1;
|
||||
pair
|
||||
})
|
||||
});
|
||||
|
||||
let pairs = pairs.collect();
|
||||
ProtoSet::is_ok(ProtoSet{ pairs }).expect("should be already sorted")
|
||||
}
|
||||
}
|
||||
|
||||
@ -340,15 +363,13 @@ impl FromStr for ProtoSet {
|
||||
/// ```
|
||||
fn from_str(version_string: &str) -> Result<Self, Self::Err> {
|
||||
let mut pairs: Vec<(Version, Version)> = Vec::new();
|
||||
let pieces: ::std::str::Split<char> = version_string.trim().split(',');
|
||||
|
||||
for piece in pieces {
|
||||
let p: &str = piece.trim();
|
||||
let pieces: ::std::str::Split<char> = version_string.split(',');
|
||||
|
||||
for p in pieces {
|
||||
if p.is_empty() {
|
||||
continue;
|
||||
} else if p.contains('-') {
|
||||
let mut pair = p.split('-');
|
||||
let mut pair = p.splitn(2, '-');
|
||||
|
||||
let low = pair.next().ok_or(ProtoverError::Unparseable)?;
|
||||
let high = pair.next().ok_or(ProtoverError::Unparseable)?;
|
||||
@ -369,7 +390,7 @@ impl FromStr for ProtoSet {
|
||||
pairs.push((v, v));
|
||||
}
|
||||
}
|
||||
// If we were passed in an empty string, or a bunch of whitespace, or
|
||||
// If we were passed in an empty string, or
|
||||
// simply a comma, or a pile of commas, then return an empty ProtoSet.
|
||||
if pairs.len() == 0 {
|
||||
return Ok(ProtoSet::default());
|
||||
@ -522,7 +543,6 @@ mod test {
|
||||
test_protoset_contains_versions!(&[1], "1");
|
||||
test_protoset_contains_versions!(&[1, 2], "1,2");
|
||||
test_protoset_contains_versions!(&[1, 2, 3], "1-3");
|
||||
test_protoset_contains_versions!(&[0, 1], "0-1");
|
||||
test_protoset_contains_versions!(&[1, 2, 5], "1-2,5");
|
||||
test_protoset_contains_versions!(&[1, 3, 4, 5], "1,3-5");
|
||||
test_protoset_contains_versions!(&[42, 55, 56, 57, 58], "42,55-58");
|
||||
@ -538,6 +558,18 @@ mod test {
|
||||
assert_eq!(Err(ProtoverError::Unparseable), ProtoSet::from_str("-1"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_versions_from_str_hyphens() {
|
||||
assert_eq!(Err(ProtoverError::Unparseable), ProtoSet::from_str("--1"));
|
||||
assert_eq!(Err(ProtoverError::Unparseable), ProtoSet::from_str("-1-2"));
|
||||
assert_eq!(Err(ProtoverError::Unparseable), ProtoSet::from_str("1--2"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_versions_from_str_triple() {
|
||||
assert_eq!(Err(ProtoverError::Unparseable), ProtoSet::from_str("1-2-3"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_versions_from_str_1exclam() {
|
||||
assert_eq!(Err(ProtoverError::Unparseable), ProtoSet::from_str("1,!"));
|
||||
@ -548,6 +580,13 @@ mod test {
|
||||
assert_eq!(Err(ProtoverError::Unparseable), ProtoSet::from_str("%="));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_versions_from_str_whitespace() {
|
||||
assert_eq!(Err(ProtoverError::Unparseable), ProtoSet::from_str("1,2\n"));
|
||||
assert_eq!(Err(ProtoverError::Unparseable), ProtoSet::from_str("1\r,2"));
|
||||
assert_eq!(Err(ProtoverError::Unparseable), ProtoSet::from_str("1,\t2"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_versions_from_str_overlap() {
|
||||
assert_eq!(Err(ProtoverError::Overlap), ProtoSet::from_str("1-3,2-4"));
|
||||
@ -570,9 +609,9 @@ mod test {
|
||||
|
||||
#[test]
|
||||
fn test_protoset_contains() {
|
||||
let protoset: ProtoSet = ProtoSet::from_slice(&[(0, 5), (7, 9), (13, 14)]).unwrap();
|
||||
let protoset: ProtoSet = ProtoSet::from_slice(&[(1, 5), (7, 9), (13, 14)]).unwrap();
|
||||
|
||||
for x in 0..6 { assert!(protoset.contains(&x), format!("should contain {}", x)); }
|
||||
for x in 1..6 { assert!(protoset.contains(&x), format!("should contain {}", x)); }
|
||||
for x in 7..10 { assert!(protoset.contains(&x), format!("should contain {}", x)); }
|
||||
for x in 13..15 { assert!(protoset.contains(&x), format!("should contain {}", x)); }
|
||||
|
||||
@ -582,10 +621,10 @@ mod test {
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_protoset_contains_0_3() {
|
||||
let protoset: ProtoSet = ProtoSet::from_slice(&[(0, 3)]).unwrap();
|
||||
fn test_protoset_contains_1_3() {
|
||||
let protoset: ProtoSet = ProtoSet::from_slice(&[(1, 3)]).unwrap();
|
||||
|
||||
for x in 0..4 { assert!(protoset.contains(&x), format!("should contain {}", x)); }
|
||||
for x in 1..4 { assert!(protoset.contains(&x), format!("should contain {}", x)); }
|
||||
}
|
||||
|
||||
macro_rules! assert_protoset_from_vec_contains_all {
|
||||
@ -605,8 +644,8 @@ mod test {
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_protoset_from_vec_0_315() {
|
||||
assert_protoset_from_vec_contains_all!(0, 1, 2, 3, 15);
|
||||
fn test_protoset_from_vec_1_315() {
|
||||
assert_protoset_from_vec_contains_all!(1, 2, 3, 15);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
@ -113,11 +113,17 @@ impl fmt::Display for UnknownProtocol {
|
||||
}
|
||||
}
|
||||
|
||||
fn is_valid_proto(s: &str) -> bool {
|
||||
s.chars().all(|c| c.is_ascii_alphanumeric() || c == '-')
|
||||
}
|
||||
|
||||
impl FromStr for UnknownProtocol {
|
||||
type Err = ProtoverError;
|
||||
|
||||
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||
if s.len() <= MAX_PROTOCOL_NAME_LENGTH {
|
||||
if !is_valid_proto(s) {
|
||||
Err(ProtoverError::InvalidProtocol)
|
||||
} else if s.len() <= MAX_PROTOCOL_NAME_LENGTH {
|
||||
Ok(UnknownProtocol(s.to_string()))
|
||||
} else {
|
||||
Err(ProtoverError::ExceedsNameLimit)
|
||||
@ -129,6 +135,9 @@ impl UnknownProtocol {
|
||||
/// Create an `UnknownProtocol`, ignoring whether or not it
|
||||
/// exceeds MAX_PROTOCOL_NAME_LENGTH.
|
||||
fn from_str_any_len(s: &str) -> Result<Self, ProtoverError> {
|
||||
if !is_valid_proto(s) {
|
||||
return Err(ProtoverError::InvalidProtocol);
|
||||
}
|
||||
Ok(UnknownProtocol(s.to_string()))
|
||||
}
|
||||
}
|
||||
@ -356,7 +365,6 @@ impl UnvalidatedProtoEntry {
|
||||
|
||||
let maybe_supported_versions: Option<&ProtoSet> = supported.get(&supported_protocol);
|
||||
let supported_versions: &ProtoSet;
|
||||
let mut unsupported_versions: ProtoSet;
|
||||
|
||||
// If the protocol wasn't in the map, then we don't know about it
|
||||
// and don't support any of its versions. Add its versions to the
|
||||
@ -369,8 +377,7 @@ impl UnvalidatedProtoEntry {
|
||||
} else {
|
||||
supported_versions = maybe_supported_versions.unwrap();
|
||||
}
|
||||
unsupported_versions = versions.clone();
|
||||
unsupported_versions.retain(|x| !supported_versions.contains(x));
|
||||
let unsupported_versions = versions.and_not_in(supported_versions);
|
||||
|
||||
if !unsupported_versions.is_empty() {
|
||||
unsupported.insert(protocol.clone(), unsupported_versions);
|
||||
@ -777,6 +784,29 @@ mod test {
|
||||
|
||||
use super::*;
|
||||
|
||||
macro_rules! parse_proto {
|
||||
($e:expr) => {{
|
||||
let proto: Result<UnknownProtocol, _> = $e.parse();
|
||||
let proto2 = UnknownProtocol::from_str_any_len($e);
|
||||
assert_eq!(proto, proto2);
|
||||
proto
|
||||
}};
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_protocol_from_str() {
|
||||
assert!(parse_proto!("Cons").is_ok());
|
||||
assert!(parse_proto!("123").is_ok());
|
||||
assert!(parse_proto!("1-2-3").is_ok());
|
||||
|
||||
let err = Err(ProtoverError::InvalidProtocol);
|
||||
assert_eq!(err, parse_proto!("a_b_c"));
|
||||
assert_eq!(err, parse_proto!("a b"));
|
||||
assert_eq!(err, parse_proto!("a,"));
|
||||
assert_eq!(err, parse_proto!("b."));
|
||||
assert_eq!(err, parse_proto!("é"));
|
||||
}
|
||||
|
||||
macro_rules! assert_protoentry_is_parseable {
|
||||
($e:expr) => (
|
||||
let protoentry: Result<ProtoEntry, ProtoverError> = $e.parse();
|
||||
@ -867,10 +897,10 @@ mod test {
|
||||
|
||||
#[test]
|
||||
fn test_protoentry_all_supported_unsupported_low_version() {
|
||||
let protocols: UnvalidatedProtoEntry = "Cons=0-1".parse().unwrap();
|
||||
let protocols: UnvalidatedProtoEntry = "HSIntro=2-3".parse().unwrap();
|
||||
let unsupported: Option<UnvalidatedProtoEntry> = protocols.all_supported();
|
||||
assert_eq!(true, unsupported.is_some());
|
||||
assert_eq!("Cons=0", &unsupported.unwrap().to_string());
|
||||
assert_eq!("HSIntro=2", &unsupported.unwrap().to_string());
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
@ -106,10 +106,10 @@ fn protocol_all_supported_with_unsupported_versions() {
|
||||
|
||||
#[test]
|
||||
fn protocol_all_supported_with_unsupported_low_version() {
|
||||
let protocols: UnvalidatedProtoEntry = "Cons=0-1".parse().unwrap();
|
||||
let protocols: UnvalidatedProtoEntry = "HSIntro=2-3".parse().unwrap();
|
||||
let unsupported: Option<UnvalidatedProtoEntry> = protocols.all_supported();
|
||||
assert_eq!(true, unsupported.is_some());
|
||||
assert_eq!("Cons=0", &unsupported.unwrap().to_string());
|
||||
assert_eq!("HSIntro=2", &unsupported.unwrap().to_string());
|
||||
}
|
||||
|
||||
#[test]
|
||||
@ -354,18 +354,18 @@ fn protover_all_supported_should_exclude_some_versions_and_entire_protocols() {
|
||||
|
||||
#[test]
|
||||
fn protover_all_supported_should_not_dos_anyones_computer() {
|
||||
let proto: UnvalidatedProtoEntry = "Sleen=0-2147483648".parse().unwrap();
|
||||
let proto: UnvalidatedProtoEntry = "Link=1-2147483648".parse().unwrap();
|
||||
let result: String = proto.all_supported().unwrap().to_string();
|
||||
|
||||
assert_eq!(result, "Sleen=0-2147483648".to_string());
|
||||
assert_eq!(result, "Link=6-2147483648".to_string());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn protover_all_supported_should_not_dos_anyones_computer_max_versions() {
|
||||
let proto: UnvalidatedProtoEntry = "Sleen=0-4294967294".parse().unwrap();
|
||||
let proto: UnvalidatedProtoEntry = "Link=1-4294967294".parse().unwrap();
|
||||
let result: String = proto.all_supported().unwrap().to_string();
|
||||
|
||||
assert_eq!(result, "Sleen=0-4294967294".to_string());
|
||||
assert_eq!(result, "Link=6-4294967294".to_string());
|
||||
}
|
||||
|
||||
#[test]
|
||||
@ -388,7 +388,7 @@ fn protover_unvalidatedprotoentry_should_err_entirely_unparseable_things() {
|
||||
|
||||
#[test]
|
||||
fn protover_all_supported_over_maximum_limit() {
|
||||
let proto: Result<UnvalidatedProtoEntry, ProtoverError> = "Sleen=0-4294967295".parse();
|
||||
let proto: Result<UnvalidatedProtoEntry, ProtoverError> = "Sleen=1-4294967295".parse();
|
||||
|
||||
assert_eq!(Err(ProtoverError::ExceedsMax), proto);
|
||||
}
|
||||
|
@ -7,7 +7,6 @@ EXTRA_CARGO_OPTIONS=
|
||||
src/rust/target/release/@TOR_RUST_STATIC_NAME@: FORCE
|
||||
( cd "$(abs_top_builddir)/src/rust" ; \
|
||||
CARGO_TARGET_DIR="$(abs_top_builddir)/src/rust/target" \
|
||||
CARGO_HOME="$(abs_top_builddir)/src/rust" \
|
||||
$(CARGO) build --release $(EXTRA_CARGO_OPTIONS) \
|
||||
$(CARGO_ONLINE) \
|
||||
--manifest-path "$(abs_top_srcdir)/src/rust/tor_rust/Cargo.toml" )
|
||||
@ -15,7 +14,6 @@ src/rust/target/release/@TOR_RUST_STATIC_NAME@: FORCE
|
||||
distclean-rust:
|
||||
( cd "$(abs_top_builddir)/src/rust" ; \
|
||||
CARGO_TARGET_DIR="$(abs_top_builddir)/src/rust/target" \
|
||||
CARGO_HOME="$(abs_top_builddir)/src/rust" \
|
||||
$(CARGO) clean $(EXTRA_CARGO_OPTIONS) \
|
||||
$(CARGO_ONLINE) \
|
||||
--manifest-path "$(abs_top_srcdir)/src/rust/tor_rust/Cargo.toml" )
|
||||
|
@ -48,7 +48,7 @@ TEST_CHUTNEY_FLAVORS = basic-min bridges-min hs-v2-min hs-v3-min \
|
||||
TEST_CHUTNEY_FLAVORS_IPV6 = bridges+ipv6-min ipv6-exit-min hs-v23-ipv6-md \
|
||||
single-onion-ipv6-md
|
||||
# only run if we can find a stable (or simply another) version of tor
|
||||
TEST_CHUTNEY_FLAVORS_MIXED = mixed+hs-v23
|
||||
TEST_CHUTNEY_FLAVORS_MIXED = mixed+hs-v2
|
||||
|
||||
### This is a lovely feature, but it requires automake >= 1.12, and Tor
|
||||
### doesn't require that yet.
|
||||
|
@ -22,6 +22,8 @@
|
||||
#include <dirent.h>
|
||||
#endif /* defined(_WIN32) */
|
||||
|
||||
#include <math.h>
|
||||
|
||||
/* These macros pull in declarations for some functions and structures that
|
||||
* are typically file-private. */
|
||||
#define GEOIP_PRIVATE
|
||||
@ -31,14 +33,6 @@
|
||||
#define MAIN_PRIVATE
|
||||
#define STATEFILE_PRIVATE
|
||||
|
||||
/*
|
||||
* Linux doesn't provide lround in math.h by default, but mac os does...
|
||||
* It's best just to leave math.h out of the picture entirely.
|
||||
*/
|
||||
//#include <math.h>
|
||||
long int lround(double x);
|
||||
double fabs(double x);
|
||||
|
||||
#include "or.h"
|
||||
#include "backtrace.h"
|
||||
#include "buffers.h"
|
||||
|
@ -3,6 +3,8 @@
|
||||
|
||||
exitcode=0
|
||||
|
||||
ulimit -c 0
|
||||
|
||||
export ASAN_OPTIONS="handle_segv=0:allow_user_segv_handler=1"
|
||||
"${builddir:-.}/src/test/test-bt-cl" backtraces || exit $?
|
||||
"${builddir:-.}/src/test/test-bt-cl" assert 2>&1 | "${PYTHON:-python}" "${abs_top_srcdir:-.}/src/test/bt_test.py" || exitcode="$?"
|
||||
|
@ -5540,6 +5540,12 @@ test_config_include_opened_file_list(void *data)
|
||||
|
||||
config_line_t *result = NULL;
|
||||
smartlist_t *opened_files = smartlist_new();
|
||||
char *torrcd = NULL;
|
||||
char *subfolder = NULL;
|
||||
char *path = NULL;
|
||||
char *empty = NULL;
|
||||
char *file = NULL;
|
||||
char *dot = NULL;
|
||||
char *dir = tor_strdup(get_fname("test_include_opened_file_list"));
|
||||
tt_ptr_op(dir, OP_NE, NULL);
|
||||
|
||||
@ -5549,8 +5555,7 @@ test_config_include_opened_file_list(void *data)
|
||||
tt_int_op(mkdir(dir, 0700), OP_EQ, 0);
|
||||
#endif
|
||||
|
||||
char torrcd[PATH_MAX+1];
|
||||
tor_snprintf(torrcd, sizeof(torrcd), "%s"PATH_SEPARATOR"%s", dir, "torrc.d");
|
||||
tor_asprintf(&torrcd, "%s"PATH_SEPARATOR"%s", dir, "torrc.d");
|
||||
|
||||
#ifdef _WIN32
|
||||
tt_int_op(mkdir(torrcd), OP_EQ, 0);
|
||||
@ -5558,9 +5563,7 @@ test_config_include_opened_file_list(void *data)
|
||||
tt_int_op(mkdir(torrcd, 0700), OP_EQ, 0);
|
||||
#endif
|
||||
|
||||
char subfolder[PATH_MAX+1];
|
||||
tor_snprintf(subfolder, sizeof(subfolder), "%s"PATH_SEPARATOR"%s", torrcd,
|
||||
"subfolder");
|
||||
tor_asprintf(&subfolder, "%s"PATH_SEPARATOR"%s", torrcd, "subfolder");
|
||||
|
||||
#ifdef _WIN32
|
||||
tt_int_op(mkdir(subfolder), OP_EQ, 0);
|
||||
@ -5568,21 +5571,17 @@ test_config_include_opened_file_list(void *data)
|
||||
tt_int_op(mkdir(subfolder, 0700), OP_EQ, 0);
|
||||
#endif
|
||||
|
||||
char path[PATH_MAX+1];
|
||||
tor_snprintf(path, sizeof(path), "%s"PATH_SEPARATOR"%s", subfolder,
|
||||
tor_asprintf(&path, "%s"PATH_SEPARATOR"%s", subfolder,
|
||||
"01_file_in_subfolder");
|
||||
tt_int_op(write_str_to_file(path, "Test 1\n", 0), OP_EQ, 0);
|
||||
|
||||
char empty[PATH_MAX+1];
|
||||
tor_snprintf(empty, sizeof(empty), "%s"PATH_SEPARATOR"%s", torrcd, "empty");
|
||||
tor_asprintf(&empty, "%s"PATH_SEPARATOR"%s", torrcd, "empty");
|
||||
tt_int_op(write_str_to_file(empty, "", 0), OP_EQ, 0);
|
||||
|
||||
char file[PATH_MAX+1];
|
||||
tor_snprintf(file, sizeof(file), "%s"PATH_SEPARATOR"%s", torrcd, "file");
|
||||
tor_asprintf(&file, "%s"PATH_SEPARATOR"%s", torrcd, "file");
|
||||
tt_int_op(write_str_to_file(file, "Test 2\n", 0), OP_EQ, 0);
|
||||
|
||||
char dot[PATH_MAX+1];
|
||||
tor_snprintf(dot, sizeof(dot), "%s"PATH_SEPARATOR"%s", torrcd, ".dot");
|
||||
tor_asprintf(&dot, "%s"PATH_SEPARATOR"%s", torrcd, ".dot");
|
||||
tt_int_op(write_str_to_file(dot, "Test 3\n", 0), OP_EQ, 0);
|
||||
|
||||
char torrc_contents[1000];
|
||||
@ -5609,6 +5608,12 @@ test_config_include_opened_file_list(void *data)
|
||||
SMARTLIST_FOREACH(opened_files, char *, f, tor_free(f));
|
||||
smartlist_free(opened_files);
|
||||
config_free_lines(result);
|
||||
tor_free(torrcd);
|
||||
tor_free(subfolder);
|
||||
tor_free(path);
|
||||
tor_free(empty);
|
||||
tor_free(file);
|
||||
tor_free(dot);
|
||||
tor_free(dir);
|
||||
}
|
||||
|
||||
|
@ -5853,6 +5853,57 @@ test_dir_networkstatus_consensus_has_ipv6(void *arg)
|
||||
UNMOCK(networkstatus_get_latest_consensus_by_flavor);
|
||||
}
|
||||
|
||||
static void
|
||||
test_dir_format_versions_list(void *arg)
|
||||
{
|
||||
(void)arg;
|
||||
char *s = NULL;
|
||||
config_line_t *lines = NULL;
|
||||
|
||||
setup_capture_of_logs(LOG_WARN);
|
||||
s = format_recommended_version_list(lines, 1);
|
||||
tt_str_op(s, OP_EQ, "");
|
||||
|
||||
tor_free(s);
|
||||
config_line_append(&lines, "ignored", "0.3.4.1, 0.2.9.111-alpha, 4.4.4-rc");
|
||||
s = format_recommended_version_list(lines, 1);
|
||||
tt_str_op(s, OP_EQ, "0.2.9.111-alpha,0.3.4.1,4.4.4-rc");
|
||||
|
||||
tor_free(s);
|
||||
config_line_append(&lines, "ignored", "0.1.2.3,0.2.9.10 ");
|
||||
s = format_recommended_version_list(lines, 1);
|
||||
tt_str_op(s, OP_EQ, "0.1.2.3,0.2.9.10,0.2.9.111-alpha,0.3.4.1,4.4.4-rc");
|
||||
|
||||
/* There should be no warnings so far. */
|
||||
expect_no_log_entry();
|
||||
|
||||
/* Now try a line with a space in it. */
|
||||
tor_free(s);
|
||||
config_line_append(&lines, "ignored", "1.3.3.8 1.3.3.7");
|
||||
s = format_recommended_version_list(lines, 1);
|
||||
tt_str_op(s, OP_EQ, "0.1.2.3,0.2.9.10,0.2.9.111-alpha,0.3.4.1,"
|
||||
"1.3.3.7,1.3.3.8,4.4.4-rc");
|
||||
|
||||
expect_single_log_msg_containing(
|
||||
"Unexpected space in versions list member \"1.3.3.8 1.3.3.7\"." );
|
||||
|
||||
/* Start over, with a line containing a bogus version */
|
||||
config_free_lines(lines);
|
||||
lines = NULL;
|
||||
tor_free(s);
|
||||
mock_clean_saved_logs();
|
||||
config_line_append(&lines, "ignored", "0.1.2.3, alpha-complex, 0.1.1.8-rc");
|
||||
s = format_recommended_version_list(lines,1);
|
||||
tt_str_op(s, OP_EQ, "0.1.1.8-rc,0.1.2.3,alpha-complex");
|
||||
expect_single_log_msg_containing(
|
||||
"Recommended version \"alpha-complex\" does not look valid.");
|
||||
|
||||
done:
|
||||
tor_free(s);
|
||||
config_free_lines(lines);
|
||||
teardown_capture_of_logs();
|
||||
}
|
||||
|
||||
#define DIR_LEGACY(name) \
|
||||
{ #name, test_dir_ ## name , TT_FORK, NULL, NULL }
|
||||
|
||||
@ -5921,6 +5972,6 @@ struct testcase_t dir_tests[] = {
|
||||
DIR(networkstatus_compute_bw_weights_v10, 0),
|
||||
DIR(platform_str, 0),
|
||||
DIR(networkstatus_consensus_has_ipv6, TT_FORK),
|
||||
DIR(format_versions_list, TT_FORK),
|
||||
END_OF_TESTCASES
|
||||
};
|
||||
|
||||
|
@ -1125,6 +1125,7 @@ test_entry_guard_update_from_consensus_status(void *arg)
|
||||
for (i = 0; i < 5; ++i) {
|
||||
entry_guard_t *g = smartlist_get(gs->sampled_entry_guards, i);
|
||||
node_t *n = (node_t*) bfn_mock_node_get_by_id(g->identity);
|
||||
tt_assert(n);
|
||||
n->is_possible_guard = 0;
|
||||
}
|
||||
|
||||
@ -1163,6 +1164,7 @@ test_entry_guard_update_from_consensus_status(void *arg)
|
||||
{
|
||||
entry_guard_t *g = smartlist_get(gs->sampled_entry_guards, 0);
|
||||
node_t *n = (node_t*) bfn_mock_node_get_by_id(g->identity);
|
||||
tt_assert(n);
|
||||
n->is_possible_guard = 1;
|
||||
}
|
||||
{
|
||||
@ -1170,6 +1172,7 @@ test_entry_guard_update_from_consensus_status(void *arg)
|
||||
*/
|
||||
entry_guard_t *g = smartlist_get(gs->sampled_entry_guards, 5);
|
||||
node_t *n = (node_t*) bfn_mock_node_get_by_id(g->identity);
|
||||
tt_assert(n);
|
||||
smartlist_remove(big_fake_net_nodes, n);
|
||||
tor_free(n->rs);
|
||||
tor_free(n->md);
|
||||
@ -1228,6 +1231,7 @@ test_entry_guard_update_from_consensus_repair(void *arg)
|
||||
/* these will get a date. */
|
||||
entry_guard_t *g = smartlist_get(gs->sampled_entry_guards, i);
|
||||
node_t *n = (node_t*) bfn_mock_node_get_by_id(g->identity);
|
||||
tt_assert(n);
|
||||
n->is_possible_guard = 0;
|
||||
g->currently_listed = 0;
|
||||
}
|
||||
@ -1293,6 +1297,7 @@ test_entry_guard_update_from_consensus_remove(void *arg)
|
||||
{
|
||||
entry_guard_t *g = smartlist_get(gs->sampled_entry_guards, 0);
|
||||
node_t *n = (node_t*) bfn_mock_node_get_by_id(g->identity);
|
||||
tt_assert(n);
|
||||
n->is_possible_guard = 0;
|
||||
g->currently_listed = 0;
|
||||
g->unlisted_since_date = one_day_ago;
|
||||
@ -1302,6 +1307,7 @@ test_entry_guard_update_from_consensus_remove(void *arg)
|
||||
{
|
||||
entry_guard_t *g = smartlist_get(gs->sampled_entry_guards, 1);
|
||||
node_t *n = (node_t*) bfn_mock_node_get_by_id(g->identity);
|
||||
tt_assert(n);
|
||||
n->is_possible_guard = 0;
|
||||
g->currently_listed = 0;
|
||||
g->unlisted_since_date = one_year_ago;
|
||||
|
@ -38,7 +38,7 @@ test_gen_establish_intro_cell(void *arg)
|
||||
attempt to parse it. */
|
||||
{
|
||||
/* We only need the auth key pair here. */
|
||||
hs_service_intro_point_t *ip = service_intro_point_new(NULL, 0);
|
||||
hs_service_intro_point_t *ip = service_intro_point_new(NULL, 0, 0);
|
||||
/* Auth key pair is generated in the constructor so we are all set for
|
||||
* using this IP object. */
|
||||
ret = hs_cell_build_establish_intro(circ_nonce, ip, buf);
|
||||
@ -106,7 +106,7 @@ test_gen_establish_intro_cell_bad(void *arg)
|
||||
ed25519_sign_prefixed() function and make it fail. */
|
||||
cell = trn_cell_establish_intro_new();
|
||||
tt_assert(cell);
|
||||
ip = service_intro_point_new(NULL, 0);
|
||||
ip = service_intro_point_new(NULL, 0, 0);
|
||||
cell_len = hs_cell_build_establish_intro(circ_nonce, ip, NULL);
|
||||
service_intro_point_free(ip);
|
||||
expect_log_msg_containing("Unable to make signature for "
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user