26 Apr. 2016 19:58 "Theo de Raadt" <dera...@cvs.openbsd.org> wrote: > > Here is a new version that does a more comprehensive test of the new > libc.so before installing it, and uses install -S > > Index: etc/rc > =================================================================== > RCS file: /cvs/src/etc/rc,v > retrieving revision 1.474 > diff -u -p -u -r1.474 rc > --- etc/rc 29 Dec 2015 19:41:24 -0000 1.474 > +++ etc/rc 26 Apr 2016 11:56:46 -0000 > @@ -158,6 +158,35 @@ make_keys() { > ssh-keygen -A > } > > +rebuildlibs() { > + local _l _liba _libas _tmpdir > + > + # Only choose newest > + for _liba in /usr/lib/libc.so.*.a; do > + _liba=$(ls ${_liba%%.[0-9]*}*.a | sort -n | tail -1) > + for _l in $_libas; do > + [[ $_l == $_liba ]] && continue 2 > + done > + _libas="$_libas $_liba" > + done
I'm afraid sort -n would not behave the way you probably think: $ (echo 10.2; echo 10.10; echo 10.50) | sort -n 10.10 10.2 10.50 Also, you code does something strange, because $_liba will be always the same thing in the loop. > + for _liba in $_libas; do > + _tmpdir=$(mktemp -dq /tmp/_librebuild.XXXXXXXXXXXX) || return > + ( > + set -o errexit > + _lib=${_liba#/usr/lib/} > + _lib=${_lib%.a} > + cd $_tmpdir > + ar x ${_liba} > + cc -shared -o $_lib $(ls *.so | sort -R) $(cat .ldadd) > + [[ -s $_lib ]] && file $_lib | fgrep -q 'shared > object' > + LD_BIND_NOW=1 LD_LIBRARY_PATH=$_tmpdir awk 'BEGIN > {exit 0}' > + install -S -o root -g bin -m 0444 $_lib /usr/lib/$_lib > + ) > + rm -rf /tmp/_librebuild.${_tmpdir#*.} > + done > +} So I propose something like that instead: find_newest() { set -x local _l _ls _bestmaj _bestmin _maj _min for _l in /usr/lib/lib$1.so.+([0-9]).+([0-9]); do _ls=${_l%.*} _maj=${_ls##*.} _min=${_l##*.} if [ _maj -gt _bestmaj -o \ _maj -eq _bestmaj -a _min -gt _bestmin ]; then _bestmaj=$_maj _bestmin=$_min fi done if [ -n $_bestmaj ]; then echo $_bestmaj.$_bestmin else return 1 fi } rebuildlibs() { local _lib _tmpdir _v _v=$(find_newest c) || return _lib=libc.so.$_v _tmpdir=$(mktemp -dq /tmp/_librebuild.XXXXXXXXXXXX) || return ( set -o errexit cd $_tmpdir ar x ${_lib}.a cc -shared -o $_lib $(ls *.so | sort -R) $(cat .ldadd) [[ -s $_lib ]] && file $_lib | fgrep -q 'shared object' LD_BIND_NOW=1 LD_LIBRARY_PATH=$_tmpdir awk 'BEGIN {exit 0}' install -S -o root -g bin -m 0444 $_lib /usr/lib/$_lib ) } -- WBR, Vadim Zhukov