Re: [hackers] [sbase][PATCH] ls: abort a directory if we cannot opendir it
Sorry, I should have made the commit message clearer. It is
not the entire operation that is being aborted, but only the
current node, if it cannot be opened.
Before this patch, ls will segfault since it tries to perform
operations on a (null) DIR*. After this patch, it prints the
message, sets the return code and doesn't segfault.
I found this bug while playing with the -R flag (though it is not
isolated to this flag), and I have confirmed that behaviour is
correct as you describe. It will do the regular recursive listing
for all the heirarchy, and in amongst its output is the
ls: opendir ./foodir: Permission denied
output.
Apologies again if my commit message was a bit ambiguous on what
exactly was being aborted.
All the best,
David
On Tue, Aug 22, 2017 at 10:08:48AM +0200, Quentin Rameau wrote:
> Hello David,
>
> > We should not try and perform operations on an invalid DIR* stream.
> > Instead, we shall let the error message be printed, and the return
> > code set (existing behaviour) and abort afterwards.
>
> Any justification you could provide us with?
>
> AFAIK POSIX specifies the opposite, a diognostic message should be
> issued on stderr and the utility should continue processing the
> remaining of the operands/hierarchy.
>
> > ---
> > ls.c | 1 +
> > 1 file changed, 1 insertion(+)
> >
> > diff --git a/ls.c b/ls.c
> > index 5080c8f..b716aba 100644
> > --- a/ls.c
> > +++ b/ls.c
> > _AT_@ -250,6 +250,7 @@ lsdir(const char *path, const struct entry *dir)
> > if (!(dp = opendir(dir->name))) {
> > ret = 1;
> > weprintf("opendir %s%s:", path, dir->name);
> > + return;
> > }
> > if (chdir(dir->name) < 0)
> > eprintf("chdir %s:", dir->name);
>
Received on Tue Aug 22 2017 - 11:07:26 CEST
This archive was generated by hypermail 2.3.0
: Tue Aug 22 2017 - 11:12:23 CEST