Discussion:
[ast-developers] Bug in path handling in path_nextcomp()
Michael Schroeder
2014-10-10 10:01:55 UTC
Permalink
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.
--
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);}
Loading...