mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-03-09 15:50:02 +00:00
Fix incorrect behavior of 'cd ../.foo' (#46)
The cd builtin was removing '.' from directory names when combined
with a preceding '../', which caused commands like 'cd ../.local'
to become 'cd ../local'. This patch fixes the problem by limiting
the extra handling to leading '..'. The bugfix comes from ksh93v-
2013-10-10-alpha, although this version is a shortened patch from
Solaris (as ksh93v- refactored a decent amount of the code for the
cd builtin).
src/cmd/ksh93/bltins/cd_pwd.c:
- cd should only check for leading '..', as trying to handle a lone
'.' only causes problems.
src/cmd/ksh93/tests/builtins.sh:
- Add a regression test for this problem based on the test present in
ksh93v- 2013-10-10-alpha.
Patch from Solaris:
860d27f/components/ksh93/patches/270-23319761.patch
This commit is contained in:
parent
eaaa0de74d
commit
bb4745e897
4 changed files with 27 additions and 27 deletions
5
NEWS
5
NEWS
|
@ -3,6 +3,11 @@ For full details, see the git log at: https://github.com/ksh93/ksh
|
||||||
|
|
||||||
Any uppercase BUG_* names are modernish shell bug IDs.
|
Any uppercase BUG_* names are modernish shell bug IDs.
|
||||||
|
|
||||||
|
2020-06-26:
|
||||||
|
|
||||||
|
- Changing to a directory that has a name starting with a '.' will no
|
||||||
|
longer fail if preceded by '../' (i.e. 'cd ../.local' will now work).
|
||||||
|
|
||||||
2020-06-24:
|
2020-06-24:
|
||||||
|
|
||||||
- Fixed buggy tab completion of tilde-expanded paths such as
|
- Fixed buggy tab completion of tilde-expanded paths such as
|
||||||
|
|
|
@ -109,34 +109,20 @@ int b_cd(int argc, char *argv[],Shbltin_t *context)
|
||||||
if(!oldpwd)
|
if(!oldpwd)
|
||||||
oldpwd = path_pwd(shp,1);
|
oldpwd = path_pwd(shp,1);
|
||||||
}
|
}
|
||||||
if(*dir=='.')
|
if(*dir!='/')
|
||||||
{
|
{
|
||||||
/* test for pathname . ./ .. or ../ */
|
/* check for leading .. */
|
||||||
int n=0;
|
char *cp;
|
||||||
char *sp;
|
sfprintf(shp->strbuf,"%s",dir);
|
||||||
for(dp=dir; *dp=='.'; dp++)
|
cp = sfstruse(shp->strbuf);
|
||||||
|
pathcanon(cp, 0);
|
||||||
|
if(cp[0]=='.' && cp[1]=='.' && (cp[2]=='/' || cp[2]==0))
|
||||||
{
|
{
|
||||||
if(*++dp=='.' && (*++dp=='/' || *dp==0))
|
if(!shp->strbuf2)
|
||||||
n++;
|
shp->strbuf2 = sfstropen();
|
||||||
else if(*dp && *dp!='/')
|
sfprintf(shp->strbuf2,"%s/%s",oldpwd,cp);
|
||||||
break;
|
dir = sfstruse(shp->strbuf2);
|
||||||
if(*dp==0)
|
pathcanon(dir, 0);
|
||||||
break;
|
|
||||||
}
|
|
||||||
if(n)
|
|
||||||
{
|
|
||||||
cdpath = 0;
|
|
||||||
sp = oldpwd + strlen(oldpwd);
|
|
||||||
while(n--)
|
|
||||||
{
|
|
||||||
while(--sp > oldpwd && *sp!='/');
|
|
||||||
if(sp==oldpwd)
|
|
||||||
break;
|
|
||||||
|
|
||||||
}
|
|
||||||
sfwrite(shp->strbuf,oldpwd,sp+1-oldpwd);
|
|
||||||
sfputr(shp->strbuf,dp,0);
|
|
||||||
dir = sfstruse(shp->strbuf);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
rval = -1;
|
rval = -1;
|
||||||
|
|
|
@ -17,4 +17,4 @@
|
||||||
* David Korn <dgk@research.att.com> *
|
* David Korn <dgk@research.att.com> *
|
||||||
* *
|
* *
|
||||||
***********************************************************************/
|
***********************************************************************/
|
||||||
#define SH_RELEASE "93u+m 2020-06-24"
|
#define SH_RELEASE "93u+m 2020-06-26"
|
||||||
|
|
|
@ -717,5 +717,14 @@ chmod is $(whence -p chmod)
|
||||||
chmod is a tracked alias for $(whence -p chmod)"
|
chmod is a tracked alias for $(whence -p chmod)"
|
||||||
[[ $actual == $expected ]] || err_exit '`whence -a` does not work correctly with tracked aliases'
|
[[ $actual == $expected ]] || err_exit '`whence -a` does not work correctly with tracked aliases'
|
||||||
|
|
||||||
|
# ======
|
||||||
|
# 'cd ../.foo' should not exclude the '.' in '.foo'
|
||||||
|
(
|
||||||
|
cd "$tmp"
|
||||||
|
mkdir foo .bar
|
||||||
|
cd foo
|
||||||
|
cd ../.bar
|
||||||
|
) || err_exit 'cd ../.bar when ../.bar exists should not fail'
|
||||||
|
|
||||||
# ======
|
# ======
|
||||||
exit $((Errors<125?Errors:125))
|
exit $((Errors<125?Errors:125))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue