From 035a4cb3f453271b7ae63bcb53a7963b8dbe4c41 Mon Sep 17 00:00:00 2001 From: Anuradha Weeraman Date: Thu, 2 Jul 2020 18:29:07 -0400 Subject: [PATCH] Fix segfault if $PATH contains a .paths directory (#55) ksh crashed if it encountered a .paths directory in any of the directories in $PATH. Ref: https://bugs.launchpad.net/ubuntu/+source/ksh/+bug/1534855 src/cmd/ksh93/sh/path.c: path_chkpaths(): - Refuse to read .paths if it's not a regular file or a symlink to a regular file. Upstream-commit: 035a4cb3f453271b7ae63bcb53a7963b8dbe4c41 Cherry-picked-by: Lukáš Zaoral --- src/cmd/ksh93/sh/path.c | 4 ++++ src/cmd/ksh93/tests/path.sh | 9 +++++++++ 2 files changed, 13 insertions(+) diff --git a/src/cmd/ksh93/sh/path.c b/src/cmd/ksh93/sh/path.c index 213a2a6c7375..25ade4073dad 100644 --- a/src/cmd/ksh93/sh/path.c +++ b/src/cmd/ksh93/sh/path.c @@ -1507,6 +1507,10 @@ static int path_chkpaths(Shell_t *shp,Pathcomp_t *first, Pathcomp_t* old,Pathcom if((fd=open(stakptr(offset),O_RDONLY))>=0) { fstat(fd,&statb); + if (!S_ISREG(statb.st_mode)) { + close(fd); + return 0; + } n = statb.st_size; stakseek(offset+pp->len+n+2); sp = stakptr(offset+pp->len); diff --git a/src/cmd/ksh93/tests/path.sh b/src/cmd/ksh93/tests/path.sh index c9d8d2485e28..9725c74e31ea 100755 --- a/src/cmd/ksh93/tests/path.sh +++ b/src/cmd/ksh93/tests/path.sh @@ -408,5 +408,14 @@ END END ) || err_exit '${.sh.xxx} variables causes cat not be found' +# ksh segfaults if $PATH contains a .paths directory +mkdir -p $tmp/paths-dir-crash/ +cat > $tmp/paths-dir-crash/run.sh <<- EOF +mkdir -p $tmp/paths-dir-crash/.paths +export PATH=$tmp/paths-dir-crash:$PATH +print ok +EOF +[[ $($SHELL $tmp/paths-dir-crash/run.sh 2>/dev/null) == ok ]] || err_exit "ksh crashes if PATH contains a .paths directory" + exit $((Errors<125?Errors:125))