@ -2,10 +2,6 @@
# insecure ownership or permissions) by:
#
# * Human-readably notifying the user of these insecurities.
# * Moving away all existing completion caches to a temporary directory. Since
# any of these caches may have been generated from insecure directories, they
# are all suspect now. Failing to do so typically causes subsequent compinit()
# calls to fail with "command not found: compdef" errors. (That's bad.)
function handle_completion_insecurities( ) {
# List of the absolute paths of all unique insecure directories, split on
# newline from compaudit()'s output resembling:
@ -22,39 +18,27 @@ function handle_completion_insecurities() {
insecure_dirs = ( ${ (f@) :- " $( compaudit 2>/dev/null) " } )
# If no such directories exist, get us out of here.
if ( ( ! ${# insecure_dirs } ) ) ; then
print "[oh-my-zsh] No insecure completion-dependent directories detected."
return
fi
( ( ! ${# insecure_dirs } ) ) && return
# List ownership and permissions of all insecure directories.
print "[oh-my-zsh] Insecure completion-dependent directories detected:"
ls -ld " ${ (@)insecure_dirs } "
print "[oh-my-zsh] For safety, completions will be disabled until you manually fix all"
print "[oh-my-zsh] insecure directory permissions and ownership and restart oh-my-zsh."
print "[oh-my-zsh] See the above list for directories with group or other writability.\n"
# Locally enable the "NULL_GLOB" option, thus removing unmatched filename
# globs from argument lists *AND* printing no warning when doing so. Failing
# to do so prints an unreadable warning if no completion caches exist below.
setopt local_options null_glob
cat <<EOD
# List of the absolute paths of all unique existing completion caches.
local -aU zcompdump_files
zcompdump_files = ( " ${ ZSH_COMPDUMP } " ( .) " ${ ZDOTDIR :- ${ HOME } } " /.zcompdump* )
[ oh-my-zsh] For safety, we will not load completions from these directories until
[ oh-my-zsh] you fix their permissions and ownership and restart zsh.
[ oh-my-zsh] See the above list for directories with group or other writability.
# Move such caches to a temporary directory.
if ( ( ${# zcompdump_files } ) ) ; then
# Absolute path of the directory to which such files will be moved.
local ZSH_ZCOMPDUMP_BAD_DIR = " ${ ZSH_CACHE_DIR } /zcompdump-bad "
[ oh-my-zsh] To fix your permissions you can do so by disabling
[ oh-my-zsh] the write permission of "group" and "others" and making sure that the
[ oh-my-zsh] owner of these directories is either root or your current user.
[ oh-my-zsh] The following command may help:
[ oh-my-zsh] compaudit | xargs chmod g-w,o-w
# List such files first.
print "[oh-my-zsh] Insecure completion caches also detected:"
ls -l " ${ (@)zcompdump_files } "
[ oh-my-zsh] If the above didn' t help or you want to skip the verification of
[ oh-my-zsh] insecure directories you can set the variable ZSH_DISABLE_COMPFIX to
[ oh-my-zsh] "true" before oh-my-zsh is sourced in your zshrc file.
# For safety, move rather than permanently remove such files.
print " [oh-my-zsh] Moving to \" ${ ZSH_ZCOMPDUMP_BAD_DIR } /\"...\n "
mkdir -p " ${ ZSH_ZCOMPDUMP_BAD_DIR } "
mv " ${ (@)zcompdump_files } " " ${ ZSH_ZCOMPDUMP_BAD_DIR } / "
fi
EOD
}