Hi,

when reading past the end of a storeio provided file, you get EIO because
offset is equal to the size of the underlying store, but the only offset
check is in dev_rw:

  if (offs < 0 || offs > dev->store->size)
    return EINVAL;
  else if (offs + len > dev->store->size)
    len = dev->store->size - offs;

First, it is strange that offs = dev->store->size is explicitely allowed.
Note that in this case, len will be 0, and storeio is doing a lot of
unnecessary work.  It will eventually fail in store_read because it can not
find a store run for suhc large an offset:

  addr = store_find_first_run (store, addr, &run, &runs_end, &base, &index);
  if (addr < 0 || run->start < 0)
    return EIO;                 /* Reading from a hole.  */

Now, I have looked into it a bit, but I am unsure where the guard should be
put.  All those layers confuse me a bit.

BTW, I have fixed a couple of bugs in the concat store.  It has never worked!
Now it does, and encoding/decoding, too.  Other stores that don't have an
open function (mvol, ileave) can not work anymore, too, because the argp
parser checks that the store has an open function.  Should we add open
functions for all the stores lacking them?

Thanks,
Marcus

-- 
`Rhubarb is no Egyptian god.' Debian http://www.debian.org [EMAIL PROTECTED]
Marcus Brinkmann              GNU    http://www.gnu.org    [EMAIL PROTECTED]
[EMAIL PROTECTED]
http://www.marcus-brinkmann.de

_______________________________________________
Bug-hurd mailing list
[EMAIL PROTECTED]
http://mail.gnu.org/mailman/listinfo/bug-hurd

Reply via email to