Roland McGrath <[EMAIL PROTECTED]> writes:

> [...] Some call somewhere either clobbers the _hurd_fd[fd] data
> structure, or consumes the send right.  With these techniques, you
> should be able to tell which and where.

Thanks for your helpful advice; fd_get_device() in `dlabel.c' -- this
file is used for providing a disklabel determining function for being
used by mkfs.ufs -- is the place, where the behaviour comes from:

,----------------------------------------------------------------------------
|  file_t node = getdport (fd);
|
|  if (node == MACH_PORT_NULL)
|    return errno;
|
|  err = store_create (node, 0, 0, &store);
|  if (! err)
|    {
|      [...]
|      store_free (store);
|    }
|
|  mach_port_deallocate (mach_task_self (), node);
´---------------------------------------------------------------------------

If run as non-root user, there's no store created, `err' is EPERM; so
mach_port_deallocate() correctly ends the use of `node' (I don't know
whether I am using the right terms, when speaking of freeing or
deallocating ports etc.).

When run as root, a store is created that has store->source set to
`node'. `err' is zero, so that after some lines of code the store will
be freed. But within the implementation of store_free() there already
is a call to mach_port_deallocate(self, store->source), if
store->source is not MACH_PORT_NULL.

Since store->source == node, the next call to mach_...(self, node)
seems to destroy the send right or make the port invalid.

A line `store->source = MACH_PORT_NULL;' before the store_free() call
does it fix, but maybe that's dirty. As far as I unterstand it, the
store mechanism takes over the control of the source port when
creating a store, so the source port is deallocated when calling
store_free(). If this is wanted, the line above could probably be one
solution.

The Store Library info entry for store_free() only tells about
deallocation of the underlying stores. Maybe the source should not be
deallocated there since there is store_close_source() to do that?

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

Reply via email to