⬢ DragonFlyBSD Kernel Audit
DF-4533 / static_proof.log
← back to finding ↓ download raw
== every drm_minor_acquire / drm_minor_release site ==
sys/dev/drm/drm_drv.c:265: * object with drm_minor_release().
sys/dev/drm/drm_drv.c:271:struct drm_minor *drm_minor_acquire(unsigned int minor_id)
sys/dev/drm/drm_drv.c:292:void drm_minor_release(struct drm_minor *minor)
sys/dev/drm/drm_drv.c:1024:	minor = drm_minor_acquire(iminor(inode));
sys/dev/drm/drm_drv.c:1043:	drm_minor_release(minor);
sys/dev/drm/drm_file.c:325:	minor = drm_minor_acquire(iminor(inode));
sys/dev/drm/drm_file.c:357:	drm_minor_release(minor);
sys/dev/drm/drm_file.c:373:	struct drm_minor *minor = drm_minor_acquire(iminor(inode));
sys/dev/drm/drm_file.c:445:	drm_minor_release(minor);
sys/dev/drm/drm_file.c:623:	drm_minor_release(minor);

== drm_open(): acquire at entry, release only under err_undo ==
	struct drm_device *dev;
	struct drm_minor *minor;
	int retcode;
	int need_setup = 0;

	minor = drm_minor_acquire(iminor(inode));
	if (IS_ERR(minor))
		return PTR_ERR(minor);

	dev = minor->dev;
	if (!dev->open_count++)
		need_setup = 1;

	/* share address_space across all char-devs of a single device */
#if 0
	filp->f_mapping = dev->anon_inode->i_mapping;
#endif

#ifdef __DragonFly__
	retcode = drm_open_helper(kdev, flags, filp, minor);
#else
	retcode = drm_open_helper(filp, minor);
#endif
	if (retcode)
		goto err_undo;
	if (need_setup) {
		retcode = drm_setup(dev);
		if (retcode)
			goto err_undo;
	}
#ifdef __DragonFly__
	device_busy(dev->dev->bsddev);
#endif
	return 0;

err_undo:
	dev->open_count--;
	drm_minor_release(minor);
	return retcode;
}

== drm_release() dead on DragonFly ==
int drm_release(struct inode *inode, struct file *filp)
{
	struct drm_file *file_priv = filp->private_data;
	struct drm_minor *minor = file_priv->minor;
	struct drm_device *dev = minor->dev;

#ifdef __DragonFly__
	/* dev is not correctly set yet */
	return 0;
#endif


== drm_cdevpriv_dtor never registered (no devfs_set_cdevpriv caller) ==
(none: dtor dead)

PROVEN: open's acquire leaks; per open/close cycle net +1 dev kref.