D. Allen [CGL]" <idallen@watcgl.waterloo.edu> (05/16/91)
#!/bin/sh
# A script that shows how a bug in FIND triggers a bug in /bin/sh
#
# This bug exists on:
# Ultrix 4.1 RISC, Ultrix 3.1C RISC, Ultrix 3.1 VAX, etc.
# Unix 4.3BSD, Sequent DYNIX
# It does not exit on:
# Irix 3.3.1, RISC/os (UMIPS) 4.51, SunOS 4.x
#
# The FIND program opens directories as it goes down a tree.
# Those descriptors remain open across the -exec of a program.
# If that program happens to be /bin/sh, and the depth is right (8),
# /bin/sh will silently exit (and not run your shell script).
#
# This means if you use FIND to search your file system and execute
# a Bourne shell script to do something, it won't work on directories
# eight deep.
#
# FIX:
#
# FIND should use fcntl F_SETFD to set the close-on-exec flag on all
# its open directory descriptors. The "-exec" sub-processes should not
# inherit them.
#
# /bin/sh should be more clever about its file descriptors and not
# exit silently because the descriptor it wants to use is occupied.
#
# Work around:
#
# Change all your FIND commands to -print the file names and use some
# other script to read the names and perform the actions you want.
# Note that using xargs incorrectly may result in security problems.
# (See back issues of comp.unix.shell etc.)
#
# Submit an SPR.
#-----------------------------------------------------------------------
# any name will do here
name=x7x
cd /tmp
rm -rf $name
# nest some directories
for i in 1 2 3 4 5 6 7 ; do
mkdir $name && cd $name
done
# create a file at the bottom
echo hi >file
# start back at the top
cd /tmp
# create a /bin/sh script
rm -f shscript
cat >shscript <<EOF
#!/bin/sh
echo This will never be seen.
EOF
# make it executable
chmod +x shscript
# try to execute it -- no output from the script will appear
/usr/bin/find $name -type f -print -exec /tmp/shscript \; -print
# change shell interpreters and watch it work
cat >shscript <<EOF
#!/bin/csh -f
echo This works.
EOF
# try to execute it and see it now works.
/usr/bin/find $name -type f -print -exec /tmp/shscript \; -print
# Output:
# % ./showbug
# x7x/x7x/x7x/x7x/x7x/x7x/x7x/file
# x7x/x7x/x7x/x7x/x7x/x7x/x7x/file
# x7x/x7x/x7x/x7x/x7x/x7x/x7x/file
# This works.
# x7x/x7x/x7x/x7x/x7x/x7x/x7x/file
--
-IAN! (Ian! D. Allen) idallen@watcgl.uwaterloo.ca idallen@watcgl.waterloo.edu
[129.97.128.64] Computer Graphics Lab/University of Waterloo/Ontario/Canadamurphy@burfle.dco.dec.com (Rick Murphy) (05/16/91)
I've run this under V4.2 and it works fine: burfle.dco.dec.com> foo.sh x7x/x7x/x7x/x7x/x7x/x7x/x7x/file This will never be seen. x7x/x7x/x7x/x7x/x7x/x7x/x7x/file x7x/x7x/x7x/x7x/x7x/x7x/x7x/file This works. x7x/x7x/x7x/x7x/x7x/x7x/x7x/file burfle.dco.dec.com> -Rick -- Rick Murphy, WA1SPT/4 DEC Washington ULTRIX Resource Center Domain: murphy@burfle.dco.dec.com -or- murphy@ufp.enet.dec.com Bang: decwrl!ufp.enet!murphy Ding: (301) 306-2985 Disclaimer: This nonsense came from an AI program written in TECO. Ignore it.