diff options
author | David Goulet <dgoulet@torproject.org> | 2021-09-13 13:25:23 -0400 |
---|---|---|
committer | David Goulet <dgoulet@torproject.org> | 2021-09-13 13:25:23 -0400 |
commit | bc106b9e168730efa406b209acc7625c9c2e0133 (patch) | |
tree | 57b37d0e30a75d572ecbe774ae9e29aafa8c9daa | |
parent | 2d54f2002a26bc84a41d15ab62b78abdfbc13f82 (diff) | |
parent | fcef8e3f75cf39ae7eb6195713d4855b4fc4d08c (diff) | |
download | tor-bc106b9e168730efa406b209acc7625c9c2e0133.tar.gz tor-bc106b9e168730efa406b209acc7625c9c2e0133.zip |
Merge branch 'maint-0.3.5' into release-0.3.5
-rw-r--r-- | .gitlab-ci.yml | 9 | ||||
-rw-r--r-- | src/test/test_switch_id.c | 60 |
2 files changed, 65 insertions, 4 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1e9d03caf5..b83079aa4a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -37,6 +37,12 @@ variables: paths: - artifacts/ + +# This template is used for x86-64 builds. +.x86-64-template: &x86-64-template + tags: + - amd64 + # This template should be usable on any system that's based on apt. .apt-template: &apt-template | export LC_ALL=C.UTF-8 @@ -57,6 +63,7 @@ variables: # This template sets us up for Debian system in particular. .debian-template: &debian-template <<: *artifacts-template + <<: *x86-64-template variables: DEBIAN_FRONTEND: "noninteractive" # TODO: Using "cache" in this way speeds up our downloads. It would be @@ -110,7 +117,7 @@ debian-minimal: # # TODO: This will be faster once we merge #40098 and #40099. debian-hardened: - image: debian:testing + image: debian:bullseye <<: *debian-template variables: ALL_BUGS_ARE_FATAL: "yes" diff --git a/src/test/test_switch_id.c b/src/test/test_switch_id.c index baddf8d66e..91277e374f 100644 --- a/src/test/test_switch_id.c +++ b/src/test/test_switch_id.c @@ -31,7 +31,47 @@ static const struct { { NULL, 0 } }; +/* Returns the first port that we think we can bind to without special + * permissions. Usually this function returns 1024. */ +static uint16_t +unprivileged_port_range_start(void) +{ + uint16_t result = 1024; + +#if defined(__linux__) + char *content = NULL; + + content = read_file_to_str( + "/proc/sys/net/ipv4/ip_unprivileged_port_start", + 0, + NULL); + + if (content != NULL) { + int ok = 1; + uint16_t tmp_result; + + tmp_result = (uint16_t)tor_parse_long(content, 10, 0, 65535, &ok, NULL); + + if (ok) { + result = tmp_result; + } else { + fprintf(stderr, + "Unable to convert ip_unprivileged_port_start to integer: %s\n", + content); + } + } + + tor_free(content); +#endif /* defined(__linux__) */ + + return result; +} + #if !defined(_WIN32) + +#define PORT_TEST_RANGE_START 600 +#define PORT_TEST_RANGE_END 1024 + /* 0 on no, 1 on yes, -1 on failure. */ static int check_can_bind_low_ports(void) @@ -41,7 +81,7 @@ check_can_bind_low_ports(void) memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; - for (port = 600; port < 1024; ++port) { + for (port = PORT_TEST_RANGE_START; port < PORT_TEST_RANGE_END; ++port) { sin.sin_port = htons(port); tor_socket_t fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (! SOCKET_OK(fd)) { @@ -149,10 +189,24 @@ main(int argc, char **argv) /* Succeed if we can do a setuid with capability retention, and doing so * does not make us lose the ability to bind low ports */ { - int keepcaps = (test_id == TEST_SETUID_KEEPCAPS); + const int keepcaps = (test_id == TEST_SETUID_KEEPCAPS); okay = switch_id(username, keepcaps ? SWITCH_ID_KEEP_BINDLOW : 0) == 0; + if (okay) { - okay = check_can_bind_low_ports() == keepcaps; + /* Only run this check if there are ports we may not be able to bind + * to. */ + const uint16_t min_port = unprivileged_port_range_start(); + + if (min_port >= PORT_TEST_RANGE_START && + min_port < PORT_TEST_RANGE_END) { + okay = check_can_bind_low_ports() == keepcaps; + } else { + fprintf(stderr, + "Skipping check for whether we can bind to any " + "privileged ports as the user system seems to " + "allow us to bind to ports even without any " + "capabilities set.\n"); + } } break; } |