Michael Schroeder
2014-10-10 10:01:55 UTC
Hi David & Co,
a while ago, the code in path_nextcomp() (src/cmd/ksh93/sh/path.c)
was changed from
if(pp->flags&PATH_SKIP)
continue;
to
if(pp->flags&PATH_SKIP)
return(ppnext);
Because of this change, path_nextcomp may return without doing
any work, i.e. not changing the PATH_OFFSET element.
This breaks path_opentype(), which does the following:
pp = path_nextcomp(shp,oldpp=pp,name,0);
while(oldpp && (oldpp->flags&PATH_SKIP))
oldpp = oldpp->next;
if(fun && (!oldpp || !(oldpp->flags&PATH_FPATH)))
continue;
if((fd = sh_open(path_relative(shp,stkptr(shp->stk,PATH_OFFSET)),O_RDONLY|O_cloexec,0)) >= 0)
if pp points to a element with PATH_SKIP set, path_nextcomp will
return earlt and the sh_open returns some old element with by
chance is in PATH_OFFSET. In the bug report I got this caused
". script" to process some different file...
So, two questions:
1) why was the continue changed to return(ppnext)?
2) I fixed the issue by changing path_opentype to
pp = path_nextcomp(shp,oldpp=pp,name,0);
if(oldpp && (oldpp->flags&PATH_SKIP))
continue;
...
is this the correct fix?
(This was reported for ksh93u, but the code in ksh93v seems to be
unchanged.)
Thanks,
Michael.
a while ago, the code in path_nextcomp() (src/cmd/ksh93/sh/path.c)
was changed from
if(pp->flags&PATH_SKIP)
continue;
to
if(pp->flags&PATH_SKIP)
return(ppnext);
Because of this change, path_nextcomp may return without doing
any work, i.e. not changing the PATH_OFFSET element.
This breaks path_opentype(), which does the following:
pp = path_nextcomp(shp,oldpp=pp,name,0);
while(oldpp && (oldpp->flags&PATH_SKIP))
oldpp = oldpp->next;
if(fun && (!oldpp || !(oldpp->flags&PATH_FPATH)))
continue;
if((fd = sh_open(path_relative(shp,stkptr(shp->stk,PATH_OFFSET)),O_RDONLY|O_cloexec,0)) >= 0)
if pp points to a element with PATH_SKIP set, path_nextcomp will
return earlt and the sh_open returns some old element with by
chance is in PATH_OFFSET. In the bug report I got this caused
". script" to process some different file...
So, two questions:
1) why was the continue changed to return(ppnext)?
2) I fixed the issue by changing path_opentype to
pp = path_nextcomp(shp,oldpp=pp,name,0);
if(oldpp && (oldpp->flags&PATH_SKIP))
continue;
...
is this the correct fix?
(This was reported for ksh93u, but the code in ksh93v seems to be
unchanged.)
Thanks,
Michael.
--
Michael Schroeder mls at suse.de
SUSE LINUX Products GmbH, GF Jeff Hawn, HRB 16746 AG Nuernberg
main(_){while(_=~getchar())putchar(~_-1/(~(_|32)/13*2-11)*13);}
Michael Schroeder mls at suse.de
SUSE LINUX Products GmbH, GF Jeff Hawn, HRB 16746 AG Nuernberg
main(_){while(_=~getchar())putchar(~_-1/(~(_|32)/13*2-11)*13);}