[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#988634: marked as done (unblock: tor/0.4.5.8-1)



Your message dated Thu, 20 May 2021 15:15:52 +0000
with message-id <E1ljkOu-0006QJ-OB@respighi.debian.org>
and subject line unblock tor
has caused the Debian Bug report #988634,
regarding unblock: tor/0.4.5.8-1
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact owner@bugs.debian.org
immediately.)


-- 
988634: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=988634
Debian Bug Tracking System
Contact owner@bugs.debian.org with problems
--- Begin Message ---
Package: release.debian.org
Severity: normal
User: release.debian.org@packages.debian.org
Usertags: unblock

I would like to update Tor in bullseye from 0.4.5.7-1 to 0.4.5.8-1.
Tor 0.4.5.8 is an upstream stable release.


unblock tor/0.4.5.8-1


Please let me know if I may upload to unstable.

An upstream diff is attached.  I cut the geoip databases and the fallback
directory mirror lists.  The ./debian/ diff is expected to contain only an
update to the changelog.  It does not yet exist, but I can provide it
when needed.

The upstream changelog entry follows.

Cheers,

} Changes in version 0.4.5.8 - 2021-05-10
}   Tor 0.4.5.8 fixes several bugs in earlier version, backporting fixes
}   from the 0.4.6.x series.
} 
}   o Minor features (compatibility, Linux seccomp sandbox, backport
} from 0.4.6.3-rc):
}     - Add a workaround to enable the Linux sandbox to work correctly
}       with Glibc 2.33. This version of Glibc has started using the
}       fstatat() system call, which previously our sandbox did not allow.
}       Closes ticket 40382; see the ticket for a discussion of trade-offs.
} 
}   o Minor features (compilation, backport from 0.4.6.3-rc):
}     - Make the autoconf script build correctly with autoconf versions
}       2.70 and later. Closes part of ticket 40335.
} 
}   o Minor features (fallback directory list, backport from 0.4.6.2-alpha):
}     - Regenerate the list of fallback directories to contain a new set
}       of 200 relays. Closes ticket 40265.
} 
}   o Minor features (geoip data):
}     - Update the geoip files to match the IPFire Location Database, as
}       retrieved on 2021/05/07.
} 
}   o Minor features (onion services):
}     - Add warning message when connecting to now deprecated v2 onion
}       services. As announced, Tor 0.4.5.x is the last series that will
}       support v2 onions. Closes ticket 40373.
} 
}   o Minor bugfixes (bridge, pluggable transport, backport from 0.4.6.2-alpha):
}     - Fix a regression that made it impossible start Tor using a bridge
}       line with a transport name and no fingerprint. Fixes bug 40360;
}       bugfix on 0.4.5.4-rc.
} 
}   o Minor bugfixes (build, cross-compilation, backport from 0.4.6.3-rc):
}     - Allow a custom "ar" for cross-compilation. Our previous build
}       script had used the $AR environment variable in most places, but
}       it missed one. Fixes bug 40369; bugfix on 0.4.5.1-alpha.
} 
}   o Minor bugfixes (channel, DoS, backport from 0.4.6.2-alpha):
}     - Fix a non-fatal BUG() message due to a too-early free of a string,
}       when listing a client connection from the DoS defenses subsystem.
}       Fixes bug 40345; bugfix on 0.4.3.4-rc.
} 
}   o Minor bugfixes (compiler warnings, backport from 0.4.6.3-rc):
}     - Fix an indentation problem that led to a warning from GCC 11.1.1.
}       Fixes bug 40380; bugfix on 0.3.0.1-alpha.
} 
}   o Minor bugfixes (controller, backport from 0.4.6.1-alpha):
}     - Fix a "BUG" warning that would appear when a controller chooses
}       the first hop for a circuit, and that circuit completes. Fixes bug
}       40285; bugfix on 0.3.2.1-alpha.
} 
}   o Minor bugfixes (onion service, client, memory leak, backport from
} 0.4.6.3-rc):
}     - Fix a bug where an expired cached descriptor could get overwritten
}       with a new one without freeing it, leading to a memory leak. Fixes
}       bug 40356; bugfix on 0.3.5.1-alpha.
} 
}   o Minor bugfixes (testing, BSD, backport from 0.4.6.2-alpha):
}     - Fix pattern-matching errors when patterns expand to invalid paths
}       on BSD systems. Fixes bug 40318; bugfix on 0.4.5.1-alpha. Patch by
}       Daniel Pinto.

-- 
                            |  .''`.       ** Debian **
      Peter Palfrader       | : :' :      The  universal
 https://www.palfrader.org/ | `. `'      Operating System
                            |   `-    https://www.debian.org/
diff --git a/ChangeLog b/ChangeLog
index a2052fa55f..1c3cbdc82f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,65 @@
+Changes in version 0.4.5.8 - 2021-05-10
+  Tor 0.4.5.8 fixes several bugs in earlier version, backporting fixes
+  from the 0.4.6.x series.
+
+  o Minor features (compatibility, Linux seccomp sandbox, backport from 0.4.6.3-rc):
+    - Add a workaround to enable the Linux sandbox to work correctly
+      with Glibc 2.33. This version of Glibc has started using the
+      fstatat() system call, which previously our sandbox did not allow.
+      Closes ticket 40382; see the ticket for a discussion of trade-offs.
+
+  o Minor features (compilation, backport from 0.4.6.3-rc):
+    - Make the autoconf script build correctly with autoconf versions
+      2.70 and later. Closes part of ticket 40335.
+
+  o Minor features (fallback directory list, backport from 0.4.6.2-alpha):
+    - Regenerate the list of fallback directories to contain a new set
+      of 200 relays. Closes ticket 40265.
+
+  o Minor features (geoip data):
+    - Update the geoip files to match the IPFire Location Database, as
+      retrieved on 2021/05/07.
+
+  o Minor features (onion services):
+    - Add warning message when connecting to now deprecated v2 onion
+      services. As announced, Tor 0.4.5.x is the last series that will
+      support v2 onions. Closes ticket 40373.
+
+  o Minor bugfixes (bridge, pluggable transport, backport from 0.4.6.2-alpha):
+    - Fix a regression that made it impossible start Tor using a bridge
+      line with a transport name and no fingerprint. Fixes bug 40360;
+      bugfix on 0.4.5.4-rc.
+
+  o Minor bugfixes (build, cross-compilation, backport from 0.4.6.3-rc):
+    - Allow a custom "ar" for cross-compilation. Our previous build
+      script had used the $AR environment variable in most places, but
+      it missed one. Fixes bug 40369; bugfix on 0.4.5.1-alpha.
+
+  o Minor bugfixes (channel, DoS, backport from 0.4.6.2-alpha):
+    - Fix a non-fatal BUG() message due to a too-early free of a string,
+      when listing a client connection from the DoS defenses subsystem.
+      Fixes bug 40345; bugfix on 0.4.3.4-rc.
+
+  o Minor bugfixes (compiler warnings, backport from 0.4.6.3-rc):
+    - Fix an indentation problem that led to a warning from GCC 11.1.1.
+      Fixes bug 40380; bugfix on 0.3.0.1-alpha.
+
+  o Minor bugfixes (controller, backport from 0.4.6.1-alpha):
+    - Fix a "BUG" warning that would appear when a controller chooses
+      the first hop for a circuit, and that circuit completes. Fixes bug
+      40285; bugfix on 0.3.2.1-alpha.
+
+  o Minor bugfixes (onion service, client, memory leak, backport from 0.4.6.3-rc):
+    - Fix a bug where an expired cached descriptor could get overwritten
+      with a new one without freeing it, leading to a memory leak. Fixes
+      bug 40356; bugfix on 0.3.5.1-alpha.
+
+  o Minor bugfixes (testing, BSD, backport from 0.4.6.2-alpha):
+    - Fix pattern-matching errors when patterns expand to invalid paths
+      on BSD systems. Fixes bug 40318; bugfix on 0.4.5.1-alpha. Patch by
+      Daniel Pinto.
+
+
 Changes in version 0.4.5.7 - 2021-03-16
   Tor 0.4.5.7 fixes two important denial-of-service bugs in earlier
   versions of Tor.
diff --git a/configure.ac b/configure.ac
index 0f2d6567e1..621fbd1612 100644
--- a/configure.ac
+++ b/configure.ac
@@ -4,7 +4,7 @@ dnl Copyright (c) 2007-2019, The Tor Project, Inc.
 dnl See LICENSE for licensing information
 
 AC_PREREQ([2.63])
-AC_INIT([tor],[0.4.5.7])
+AC_INIT([tor],[0.4.5.8])
 AC_CONFIG_SRCDIR([src/app/main/tor_main.c])
 AC_CONFIG_MACRO_DIR([m4])
 
@@ -16,7 +16,7 @@ configure_flags="$*"
 # version number changes.  Tor uses it to make sure that it
 # only shuts down for missing "required protocols" when those protocols
 # are listed as required by a consensus after this date.
-AC_DEFINE(APPROX_RELEASE_DATE, ["2021-03-15"], # for 0.4.5.7
+AC_DEFINE(APPROX_RELEASE_DATE, ["2021-05-07"], # for 0.4.5.8
           [Approximate date when this software was released. (Updated when the version changes.)])
 
 # "foreign" means we don't follow GNU package layout standards
@@ -441,7 +441,11 @@ AM_CONDITIONAL(BUILD_MANPAGE, [test "x$enable_manpage" != "xno"])
 AM_CONDITIONAL(BUILD_HTML_DOCS, [test "x$enable_html_manual" != "xno"])
 
 AM_PROG_CC_C_O
-AC_PROG_CC_C99
+
+dnl Before autoconf 2.70, AC_PROG_CC_C99 is supposedly necessary for some
+dnl compilers if you wan't C99 support. Starting with 2.70, it is obsolete and
+dnl forbidden.
+m4_version_prereq([2.70], [:], [AC_PROG_CC_C99])
 
 AC_CACHE_CHECK([for Python 3], [tor_cv_PYTHON],
    [AC_PATH_PROGS_FEATURE_CHECK([PYTHON], [ \
diff --git a/contrib/win32build/tor-mingw.nsi.in b/contrib/win32build/tor-mingw.nsi.in
index e599a0857a..580f189525 100644
--- a/contrib/win32build/tor-mingw.nsi.in
+++ b/contrib/win32build/tor-mingw.nsi.in
@@ -8,7 +8,7 @@
 !include "LogicLib.nsh"
 !include "FileFunc.nsh"
 !insertmacro GetParameters
-!define VERSION "0.4.5.7"
+!define VERSION "0.4.5.8"
 !define INSTALLER "tor-${VERSION}-win32.exe"
 !define WEBSITE "https://www.torproject.org/";
 !define LICENSE "LICENSE"
diff --git a/scripts/build/combine_libs b/scripts/build/combine_libs
index fb311552fe..9c87f68248 100755
--- a/scripts/build/combine_libs
+++ b/scripts/build/combine_libs
@@ -25,7 +25,7 @@ for input in "$@"; do
     dir="$TMPDIR"/$(basename "$input" .a)
     mkdir "$dir"
     cd "$dir">/dev/null
-    ar x "$abs"
+    "${AR:-ar}" x "$abs"
 done
 
 cd "$TMPDIR" >/dev/null
diff --git a/src/app/config/fallback_dirs.inc b/src/app/config/fallback_dirs.inc
index a7ef39bb96..4f43a4ba6e 100644
--- a/src/app/config/fallback_dirs.inc
+++ b/src/app/config/fallback_dirs.inc
@@ -1,804 +1,1076 @@
 /* type=fallback */
-/* version=3.0.0 */
-/* timestamp=20200723133610 */
+/* version=4.0.0 */
+/* timestamp=20210412000000 */
 /* source=offer-list */
+
+"62.78.194.4 orport=9001 id=BD5609383472735292627DB86D92A29F3CFEE52A"
+/* nickname=Unnamed */
+/* extrainfo=0 */
 /* ===== */

[...]

diff --git a/src/config/geoip b/src/config/geoip
index 3dce65ed00..222bb1be87 100644
--- a/src/config/geoip
+++ b/src/config/geoip
@@ -7,7 +7,7 @@
 #
 # Location Database Export
 #
-# Generated: Fri, 12 Mar 2021 05:05:24 GMT
+# Generated: Fri, 07 May 2021 05:18:14 GMT
 # Vendor:    IPFire Project
 # License:   CC BY-SA 4.0
 #

[...]
diff --git a/src/config/geoip6 b/src/config/geoip6
index 79a0c627a2..4718eaa827 100644
--- a/src/config/geoip6
+++ b/src/config/geoip6
@@ -7,7 +7,7 @@
 #
 # Location Database Export
 #
-# Generated: Fri, 12 Mar 2021 05:05:24 GMT
+# Generated: Fri, 07 May 2021 05:18:14 GMT
 # Vendor:    IPFire Project
 # License:   CC BY-SA 4.0
 #

[...]
diff --git a/src/core/or/channel.c b/src/core/or/channel.c
index 26c93d169f..1ac029c152 100644
--- a/src/core/or/channel.c
+++ b/src/core/or/channel.c
@@ -1882,11 +1882,11 @@ channel_do_open_actions(channel_t *chan)
         geoip_note_client_seen(GEOIP_CLIENT_CONNECT,
                                &remote_addr, transport_name,
                                now);
-        tor_free(transport_name);
         /* Notify the DoS subsystem of a new client. */
         if (tlschan && tlschan->conn) {
           dos_new_client_conn(tlschan->conn, transport_name);
         }
+        tor_free(transport_name);
       }
       /* Otherwise the underlying transport can't tell us this, so skip it */
     }
diff --git a/src/core/or/circuitbuild.c b/src/core/or/circuitbuild.c
index c0c918abe4..78501c0aa2 100644
--- a/src/core/or/circuitbuild.c
+++ b/src/core/or/circuitbuild.c
@@ -881,14 +881,22 @@ circuit_pick_extend_handshake(uint8_t *cell_type_out,
 }
 
 /**
- * Return true iff <b>purpose</b> is a purpose for a circuit which is
- * allowed to have no guard configured, even if the circuit is multihop
+ * Return true iff <b>circ</b> is allowed
+ * to have no guard configured, even if the circuit is multihop
  * and guards are enabled.
  */
 static int
-circuit_purpose_may_omit_guard(int purpose)
+circuit_may_omit_guard(const origin_circuit_t *circ)
 {
-  switch (purpose) {
+  if (BUG(!circ))
+    return 0;
+
+  if (circ->first_hop_from_controller) {
+    /* The controller picked the first hop: that bypasses the guard system. */
+    return 1;
+  }
+
+  switch (circ->base_.purpose) {
     case CIRCUIT_PURPOSE_TESTING:
     case CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT:
       /* Testing circuits may omit guards because they're measuring
@@ -1019,7 +1027,7 @@ circuit_build_no_more_hops(origin_circuit_t *circ)
   guard_usable_t r;
   if (! circ->guard_state) {
     if (circuit_get_cpath_len(circ) != 1 &&
-        ! circuit_purpose_may_omit_guard(circ->base_.purpose) &&
+        ! circuit_may_omit_guard(circ) &&
         get_options()->UseEntryGuards) {
       log_warn(LD_BUG, "%d-hop circuit %p with purpose %d has no "
                "guard state",
diff --git a/src/core/or/circuitlist.h b/src/core/or/circuitlist.h
index 3178e6cd0d..bd4a117e26 100644
--- a/src/core/or/circuitlist.h
+++ b/src/core/or/circuitlist.h
@@ -118,7 +118,8 @@
  * bandwidth measurement, reachability test and address discovery from an
  * authority using the NETINFO cell. */
 #define CIRCUIT_PURPOSE_TESTING 21
-/** A controller made this circuit and Tor should not use it. */
+/** A controller made this circuit and Tor should not cannibalize it or attach
+ * streams to it without explicitly being told. */
 #define CIRCUIT_PURPOSE_CONTROLLER 22
 /** This circuit is used for path bias probing only */
 #define CIRCUIT_PURPOSE_PATH_BIAS_TESTING 23
diff --git a/src/core/or/circuituse.c b/src/core/or/circuituse.c
index 0f3fc29361..059e43ec47 100644
--- a/src/core/or/circuituse.c
+++ b/src/core/or/circuituse.c
@@ -1320,10 +1320,10 @@ circuit_predict_and_launch_new(void)
     if (router_have_consensus_path() == CONSENSUS_PATH_INTERNAL)
       flags |= CIRCLAUNCH_IS_INTERNAL;
 
-      log_info(LD_CIRC,
-               "Have %d clean circs need another buildtime test circ.", num);
-      circuit_launch(CIRCUIT_PURPOSE_C_GENERAL, flags);
-      return;
+    log_info(LD_CIRC,
+             "Have %d clean circs need another buildtime test circ.", num);
+    circuit_launch(CIRCUIT_PURPOSE_C_GENERAL, flags);
+    return;
   }
 }
 
diff --git a/src/core/or/connection_edge.c b/src/core/or/connection_edge.c
index a33c64fe19..7f260ba185 100644
--- a/src/core/or/connection_edge.c
+++ b/src/core/or/connection_edge.c
@@ -2582,6 +2582,16 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn,
     tor_assert(addresstype == ONION_V2_HOSTNAME ||
                addresstype == ONION_V3_HOSTNAME);
     tor_assert(!automap);
+
+    if (addresstype == ONION_V2_HOSTNAME) {
+      log_warn(LD_PROTOCOL,
+               "Warning! You've just connected to a v2 onion address. These "
+               "addresses are deprecated for security reasons, and are no "
+               "longer supported in Tor. Please encourage the site operator "
+               "to upgrade. For more information see "
+               "https://blog.torproject.org/v2-deprecation-timeline";);
+    }
+
     return connection_ap_handle_onion(conn, socks, circ, addresstype);
   }
 
diff --git a/src/core/or/origin_circuit_st.h b/src/core/or/origin_circuit_st.h
index a45a6573dc..c40e84aed8 100644
--- a/src/core/or/origin_circuit_st.h
+++ b/src/core/or/origin_circuit_st.h
@@ -170,6 +170,18 @@ struct origin_circuit_t {
    * not try to negotiate further circuit padding. */
   unsigned padding_negotiation_failed : 1;
 
+  /**
+   * If this flag is set, then a controller chose the first hop of this
+   * circuit's path, and it's okay to ignore checks that we'd usually do
+   * on this circuit's first hop.
+   *
+   * This flag is distinct from the CIRCUIT_PURPOSE_CONTROLLER purpose: the
+   * purpose indicates _what tor can use the circuit for_.  Controller-created
+   * circuits can still have the CIRCUIT_PURPOSE_GENERAL purpose if Tor is
+   * allowed to attach streams to them.
+   */
+  unsigned first_hop_from_controller : 1;
+
   /**
    * Tristate variable to guard against pathbias miscounting
    * due to circuit purpose transitions changing the decision
diff --git a/src/feature/client/entrynodes.c b/src/feature/client/entrynodes.c
index 232216c521..82866ea668 100644
--- a/src/feature/client/entrynodes.c
+++ b/src/feature/client/entrynodes.c
@@ -804,9 +804,6 @@ get_sampled_guard_for_bridge(guard_selection_t *gs,
   entry_guard_t *guard;
   if (BUG(!addrport))
     return NULL; // LCOV_EXCL_LINE
-  if (bridge_has_invalid_transport(bridge)) {
-    return NULL;
-  }
   guard = get_sampled_guard_by_bridge_addr(gs, addrport);
   if (! guard || (id && tor_memneq(id, guard->identity, DIGEST_LEN)))
     return NULL;
diff --git a/src/feature/control/control_cmd.c b/src/feature/control/control_cmd.c
index 5b75c24692..0456d709f5 100644
--- a/src/feature/control/control_cmd.c
+++ b/src/feature/control/control_cmd.c
@@ -819,6 +819,7 @@ handle_control_extendcircuit(control_connection_t *conn,
   if (zero_circ) {
     /* start a new circuit */
     circ = origin_circuit_init(intended_purpose, 0);
+    circ->first_hop_from_controller = 1;
   }
 
   /* now circ refers to something that is ready to be extended */
diff --git a/src/feature/hs/hs_cache.c b/src/feature/hs/hs_cache.c
index c1334a7d27..9c35936748 100644
--- a/src/feature/hs/hs_cache.c
+++ b/src/feature/hs/hs_cache.c
@@ -353,6 +353,31 @@ static digest256map_t *hs_cache_v3_client;
  * objects all related to a specific service. */
 static digest256map_t *hs_cache_client_intro_state;
 
+#define cache_client_desc_free(val) \
+  FREE_AND_NULL(hs_cache_client_descriptor_t, cache_client_desc_free_, (val))
+
+/** Free memory allocated by <b>desc</b>. */
+static void
+cache_client_desc_free_(hs_cache_client_descriptor_t *desc)
+{
+  if (desc == NULL) {
+    return;
+  }
+  hs_descriptor_free(desc->desc);
+  memwipe(&desc->key, 0, sizeof(desc->key));
+  memwipe(desc->encoded_desc, 0, strlen(desc->encoded_desc));
+  tor_free(desc->encoded_desc);
+  tor_free(desc);
+}
+
+/** Helper function: Use by the free all function to clear the client cache */
+static void
+cache_client_desc_free_void(void *ptr)
+{
+  hs_cache_client_descriptor_t *desc = ptr;
+  cache_client_desc_free(desc);
+}
+
 /** Return the size of a client cache entry in bytes. */
 static size_t
 cache_get_client_entry_size(const hs_cache_client_descriptor_t *entry)
@@ -390,7 +415,18 @@ remove_v3_desc_as_client(const hs_cache_client_descriptor_t *desc)
 static void
 store_v3_desc_as_client(hs_cache_client_descriptor_t *desc)
 {
+  hs_cache_client_descriptor_t *cached_desc;
+
   tor_assert(desc);
+
+  /* Because the lookup function doesn't return an expired entry, it can linger
+   * in the cache until we clean it up or a new descriptor is stored. So,
+   * before adding, we'll make sure we are not overwriting an old descriptor
+   * (which is OK in terms of semantic) but leads to memory leak. */
+  cached_desc = digest256map_get(hs_cache_v3_client, desc->key.pubkey);
+  if (cached_desc) {
+    cache_client_desc_free(cached_desc);
+  }
   digest256map_set(hs_cache_v3_client, desc->key.pubkey, desc);
   /* Update cache size with this entry for the OOM handler. */
   rend_cache_increment_allocation(cache_get_client_entry_size(desc));
@@ -473,31 +509,6 @@ cache_client_desc_new(const char *desc_str,
   return client_desc;
 }
 
-#define cache_client_desc_free(val) \
-  FREE_AND_NULL(hs_cache_client_descriptor_t, cache_client_desc_free_, (val))
-
-/** Free memory allocated by <b>desc</b>. */
-static void
-cache_client_desc_free_(hs_cache_client_descriptor_t *desc)
-{
-  if (desc == NULL) {
-    return;
-  }
-  hs_descriptor_free(desc->desc);
-  memwipe(&desc->key, 0, sizeof(desc->key));
-  memwipe(desc->encoded_desc, 0, strlen(desc->encoded_desc));
-  tor_free(desc->encoded_desc);
-  tor_free(desc);
-}
-
-/** Helper function: Use by the free all function to clear the client cache */
-static void
-cache_client_desc_free_void(void *ptr)
-{
-  hs_cache_client_descriptor_t *desc = ptr;
-  cache_client_desc_free(desc);
-}
-
 /** Return a newly allocated and initialized hs_cache_intro_state_t object. */
 static hs_cache_intro_state_t *
 cache_intro_state_new(void)
diff --git a/src/lib/fs/path.c b/src/lib/fs/path.c
index c2fdddb9db..81960bd69a 100644
--- a/src/lib/fs/path.c
+++ b/src/lib/fs/path.c
@@ -571,6 +571,19 @@ wrap_closedir(void *arg)
 {
   closedir(arg);
 }
+
+/** Function passed to glob to handle processing errors. <b>epath</b> is the
+ * path that caused the error and <b>eerrno</b> is the errno set by the
+ * function that failed. We want to ignore ENOENT and ENOTDIR because, in BSD
+ * systems, these are not ignored automatically, which makes glob fail when
+ * globs expand to non-existing paths and GLOB_ERR is set.
+ */
+static int
+glob_errfunc(const char *epath, int eerrno)
+{
+    (void)epath;
+    return eerrno == ENOENT || eerrno == ENOTDIR ? 0 : -1;
+}
 #endif /* defined(HAVE_GLOB) */
 
 /** Return a new list containing the paths that match the pattern
@@ -591,7 +604,7 @@ tor_glob(const char *pattern)
   tor_free(pattern_normalized);
 #elif HAVE_GLOB /* !(defined(_WIN32)) */
   glob_t matches;
-  int flags = GLOB_ERR | GLOB_NOSORT;
+  int flags = GLOB_NOSORT;
 #ifdef GLOB_ALTDIRFUNC
   /* use functions that call sandbox_intern_string */
   flags |= GLOB_ALTDIRFUNC;
@@ -604,7 +617,10 @@ tor_glob(const char *pattern)
   matches.gl_stat = &prot_stat;
   matches.gl_lstat = &prot_lstat;
 #endif /* defined(GLOB_ALTDIRFUNC) */
-  int ret = glob(pattern, flags, NULL, &matches);
+  // use custom error handler to workaround BSD quirks and do not set GLOB_ERR
+  // because it would make glob fail on error even if the error handler ignores
+  // the error
+  int ret = glob(pattern, flags, glob_errfunc, &matches);
   if (ret == GLOB_NOMATCH) {
     return smartlist_new();
   } else if (ret != 0) {
diff --git a/src/lib/sandbox/sandbox.c b/src/lib/sandbox/sandbox.c
index 168dfd943c..fc90dbe062 100644
--- a/src/lib/sandbox/sandbox.c
+++ b/src/lib/sandbox/sandbox.c
@@ -1608,6 +1608,28 @@ add_noparam_filter(scmp_filter_ctx ctx)
     }
   }
 
+  if (is_libc_at_least(2, 33)) {
+#ifdef __NR_newfstatat
+    // Libc 2.33 uses this syscall to implement both fstat() and stat().
+    //
+    // The trouble is that to implement fstat(fd, &st), it calls:
+    //     newfstatat(fs, "", &st, AT_EMPTY_PATH)
+    // We can't detect this usage in particular, because "" is a pointer
+    // we don't control.  And we can't just look for AT_EMPTY_PATH, since
+    // AT_EMPTY_PATH only has effect when the path string is empty.
+    //
+    // So our only solution seems to be allowing all fstatat calls, which
+    // means that an attacker can stat() anything on the filesystem. That's
+    // not a great solution, but I can't find a better one.
+    rc = seccomp_rule_add_0(ctx, SCMP_ACT_ALLOW, SCMP_SYS(newfstatat));
+    if (rc != 0) {
+      log_err(LD_BUG,"(Sandbox) failed to add newfstatat() syscall; "
+          "received libseccomp error %d", rc);
+      return rc;
+    }
+#endif
+  }
+
   return 0;
 }
 
diff --git a/src/win32/orconfig.h b/src/win32/orconfig.h
index 9a138c0928..06e6ad8ff7 100644
--- a/src/win32/orconfig.h
+++ b/src/win32/orconfig.h
@@ -217,7 +217,7 @@
 #define USING_TWOS_COMPLEMENT
 
 /* Version number of package */
-#define VERSION "0.4.5.7"
+#define VERSION "0.4.5.8"
 
 #define HAVE_STRUCT_SOCKADDR_IN6
 #define HAVE_STRUCT_IN6_ADDR

--- End Message ---
--- Begin Message ---
Unblocked.

--- End Message ---

Reply to: