commit 47b10b686e8e94fe0a2096135d4d9b195afb5267 Author: Alex Xu (Hello71) <alex_y...@yahoo.ca> Date: Tue Jan 23 10:01:17 2018 -0500
Fix a bunch of stuff in the wrapper script, #24967 --- src/bin/torsocks.in | 160 ++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 125 insertions(+), 35 deletions(-) diff --git a/src/bin/torsocks.in b/src/bin/torsocks.in index fe8b67a..68ec2e5 100644 --- a/src/bin/torsocks.in +++ b/src/bin/torsocks.in @@ -58,6 +58,7 @@ # Tamas Szerb <t...@rulez.org> # Modified by Robert Hogan <rob...@roberthogan.net> April 16th 2006 # Modified by David Goulet <dgou...@ev0ke.net> 2013 +# Modified by Alex Xu (Hello71) <alex_y...@yahoo.ca> 2018 prefix=@prefix@ exec_prefix=@exec_prefix@ @@ -67,15 +68,108 @@ LIB_NAME="libtorsocks" SHLIB_EXT="@SHLIB_EXT@" SHLIB="${LIBDIR}/${LIB_NAME}.${SHLIB_EXT}" +# https://github.com/mkropat/sh-realpath +# +# Copyright (c) 2014 Michael Kropat +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +realpath() { + canonicalize_path "$(resolve_symlinks "$1")" +} + +resolve_symlinks() { + _resolve_symlinks "$1" +} + +_resolve_symlinks() { + _assert_no_path_cycles "$@" || return + + local dir_context path + path=$(readlink -- "$1") + if [ $? -eq 0 ]; then + dir_context=$(dirname -- "$1") + _resolve_symlinks "$(_prepend_dir_context_if_necessary "$dir_context" "$path")" "$@" + else + printf '%s\n' "$1" + fi +} + +_prepend_dir_context_if_necessary() { + if [ "$1" = . ]; then + printf '%s\n' "$2" + else + _prepend_path_if_relative "$1" "$2" + fi +} + +_prepend_path_if_relative() { + case "$2" in + /* ) printf '%s\n' "$2" ;; + * ) printf '%s\n' "$1/$2" ;; + esac +} + +_assert_no_path_cycles() { + local target path + + target=$1 + shift + + for path in "$@"; do + if [ "$path" = "$target" ]; then + return 1 + fi + done +} + +canonicalize_path() { + if [ -d "$1" ]; then + _canonicalize_dir_path "$1" + else + _canonicalize_file_path "$1" + fi +} + +_canonicalize_dir_path() { + (cd "$1" 2>/dev/null && pwd -P) +} + +_canonicalize_file_path() { + local dir file + dir=$(dirname -- "$1") + file=$(basename -- "$1") + (cd "$dir" 2>/dev/null && printf '%s/%s\n' "$(pwd -P)" "$file") +} + # Set @LDPRELOAD@ variable with torsocks library path. set_ld_preload () { - if [ -z "$@LDPRELOAD@" ]; then - export @LDPRELOAD@="${SHLIB}" - else - echo "$@LDPRELOAD@" | grep -q "${SHLIB}" || \ - export @LDPRELOAD@="${SHLIB} $@LDPRELOAD@" - fi + case "$@LDPRELOAD@" in + *"${SHLIB}"*) ;; + '') + export @LDPRELOAD@="${SHLIB}" + ;; + *) + export @LDPRELOAD@="${SHLIB}:$@LDPRELOAD@" + ;; + esac # OS X specific env variable case "$OSTYPE" in @@ -88,7 +182,7 @@ set_ld_preload () # Report error due to Apple's System Integrity Protection. macos_sip_error () { - echo "ERROR: $1 is located in a directory protected by Apple's System Integrity Protection." >&2 + printf "ERROR: %s is located in a directory protected by Apple's System Integrity Protection.\n" "$1" >&2 exit 1 } @@ -101,21 +195,20 @@ macos_sip_check () darwin*) # We need to figure out if Apple's System Integrity Protection is # enabled on the users' system. - if /usr/bin/csrutil status | grep -q enabled; then - local abs_app_dir=`cd "$(dirname "$app_path")" && pwd -P` - - # It seems like /usr/** (with an exception of /usr/local/**), - # /System/**, /sbin/**, and /bin/** are currently protected - # using SIP. - case "$abs_app_dir/`basename $app_path`" in - /usr/local/*) - # Must be listed before the match on /usr/* - ;; - /usr/*|/System/*|/sbin/*|/bin/*) - macos_sip_error $app_path - ;; - esac - fi + case "$(/usr/bin/csrutil status)" in + *enabled*) + # It seems like /usr/** (with an exception of /usr/local/**), + # /System/**, /sbin/**, and /bin/** are currently protected + # using SIP. + case "$(realpath "$app_path")" in + /usr/local/*) + # Must be listed before the match on /usr/* + ;; + /usr/*|/System/*|/sbin/*|/bin/*) + macos_sip_error "$app_path" + ;; + esac + esac ;; esac } @@ -124,14 +217,14 @@ macos_sip_check () tor_shell () { set_ld_preload - echo "$0: New torified shell coming right up..." + echo "New torified shell coming right up..." ${SHELL:-/bin/sh} } torify_app () { - local app_path="`which $1`" - local getcap="`PATH="$PATH:/usr/sbin:/sbin" which getcap`" + local app_path="$(command -v "$1")" + local getcap="$(PATH="$PATH:/usr/sbin:/sbin" command -v getcap)" local caps= if [ -z "$1" ]; then @@ -144,7 +237,7 @@ torify_app () # This must be before torifying because getcap uses cap_get_file(3) # via syscall(2) which breaks torsocks. if [ -n "$getcap" ]; then - caps="`$getcap $app_path 2>/dev/null`" + caps="$("$getcap" "$app_path" 2>/dev/null)" fi # Check if Apple's System Integrity Protection is enabled if the user is @@ -161,9 +254,7 @@ torify_app () echo "ERROR: $1 is setgid. torsocks will not work on a setgid executable." >&2 exit 1 elif [ -n "$caps" ]; then - echo "ERROR: $1 gains the following elevated capabilities. torsocks will \ -not work with privledged executables. -$caps" >&2 + printf "ERROR: %s gains the following elevated capabilities. torsocks will not work with privileged executables.\n%s" "$app_path" "$caps" >&2 exit 1 fi @@ -218,10 +309,9 @@ if [ $# -eq 0 ] ; then exit 1 fi -# Ensure libtorsocks exists, -if [ ! -f "$SHLIB" ]; then - echo "$0: $SHLIB does not exist! Try re-installing torsocks." - exit +if [ ! -e "$SHLIB" ]; then + echo "ERROR: $SHLIB does not exist! Try re-installing torsocks." >&2 + exit 1 fi while true; @@ -235,7 +325,7 @@ do ;; off) check_script_sourced "$1" - export @LDPRELOAD@="`echo -n $@LDPRELOAD@ | sed "s#$SHLIB *##"`" + export @LDPRELOAD@="$(printf '%s' "$@LDPRELOAD@" | sed "s#$SHLIB *##")" if [ -z "$@LDPRELOAD@" ]; then unset @LDPRELOAD@ case "$OSTYPE" in @@ -248,7 +338,7 @@ do break ;; show|sh) - echo "@LDPRELOAD@=\"$@LDPRELOAD@\"" + printf '%s="%s"\n' "@LDPRELOAD@" "$@LDPRELOAD@" break ;; -h|--help) _______________________________________________ tor-commits mailing list tor-commits@lists.torproject.org https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits