Un-break processing of device major/minor values with fstat -n. We do

this by accessing the cdev_priv element of the cdev structure. Looking
forward we need a better way to handle this, as this structure shouldn't
be frobbed by userspace.

Submitted by:	Doug Steinwand
PR:		bin/88203
MFC after:	1 week
Discussed with:	phk
This commit is contained in:
csjp 2005-11-05 23:38:08 +00:00
parent 29221b42d9
commit 06f639fcfa

View File

@ -68,6 +68,7 @@ __FBSDID("$FreeBSD$");
#include <ufs/ufs/quota.h>
#include <ufs/ufs/inode.h>
#include <fs/devfs/devfs.h>
#include <fs/devfs/devfs_int.h>
#undef _KERNEL
#include <nfs/nfsproto.h>
#include <nfs/rpcv2.h>
@ -885,11 +886,12 @@ socktrans(struct socket *sock, int i)
dev_t
dev2udev(struct cdev *dev)
{
struct cdev_priv priv;
struct cdev si;
if (KVM_READ(dev, &si, sizeof si)) {
/* XXX: FIXME! */
return 0;
if (KVM_READ(dev, &si, sizeof si) &&
KVM_READ(si.si_priv, &priv, sizeof priv)) {
return ((dev_t)priv.cdp_inode);
} else {
dprintf(stderr, "can't convert cdev *%p to a dev_t\n", dev);
return -1;