lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20080824195908.GQ28946@ZenIV.linux.org.uk>
Date:	Sun, 24 Aug 2008 20:59:08 +0100
From:	Al Viro <viro@...IV.linux.org.uk>
To:	Linus Torvalds <torvalds@...ux-foundation.org>
Cc:	Jan Harkes <jaharkes@...cmu.edu>, linux-fsdevel@...r.kernel.org,
	linux-kernel@...r.kernel.org
Subject: Re: [RFC] readdir mess

On Sun, Aug 24, 2008 at 10:20:52AM -0700, Linus Torvalds wrote:
> 
> 
> On Sun, 24 Aug 2008, Al Viro wrote:
> > 
> > One obvious note: that'll break old_readdir() on coda.  There you need to
> > change the existing check (you need to check buf.result, then ignore error
> > unless buf.result ended up 0).
> 
> Hmm? old_readdir() was the only one that I didn't change, because it 
> didn't need changing. It already ignores the return value of 
> "vfs_readdir()" entirely if it is positive or zero, and takes it from 
> buf.result.
> 
> So old_readdir() literally doesn't care at all (and never has) whether a 
> ->readdir() function returns zero or a positive number. So changing coda 
> readdir() it to return zero _instead_ of a positive number makes 
> absolutely zero difference: old_readdir() will do the same thing 
> regardless.
> 
> What am I missing?

The fact that coda_readdir() will _not_ be returning 0 with your change
when called with the arguments old_readdir() gives it?  You'll get ret
from filldir, i.e. what you'll normally see will be -EINVAL in case of
fillonedir as callback.

The normal sequence for old_readdir() is
	* call fillonedir on the current entry
	* have it bump ->result from 0 to 1 and return 0
	* advance f_pos to the next entry
	* call fillonedir for it
	* have it see ->result != 0 and immediately bail out with -EINVAL
	* seeing a negative from the callback, foo_readdir does *not* advance
f_pos this time and returns 0 (or at least something non-negative)
	* old_readdir() sees non-negative from vfs_readdir() and returns
buf->result (i.e. 1)

Now you've got vfs_readdir() returning -EINVAL in that scenario.  See why
old_readdir() needs an update too?  It doesn't have the "OK, we'd already
called its filldir, so bugger whatever had happened afterwards" logics -
and it'll need it now.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ