o Make sure to clear f->f_devdata if d_dev->dv_open() fails. It
would otherwise cause devclose() to free() the memory again. o Refactor devopen() so that it's more readable.
This commit is contained in:
parent
65deb9d947
commit
ac2bbfc8cf
@ -35,20 +35,25 @@ __FBSDID("$FreeBSD$");
|
||||
int
|
||||
devopen(struct open_file *f, const char *fname, const char **file)
|
||||
{
|
||||
struct devdesc *dev;
|
||||
int result;
|
||||
struct devdesc *dev;
|
||||
int result;
|
||||
|
||||
if ((result = archsw.arch_getdev((void *)&dev, fname, file)) == 0) { /* get the device */
|
||||
/* point to device-specific data so that device open can use it */
|
||||
f->f_devdata = dev;
|
||||
if ((result = dev->d_dev->dv_open(f, dev)) == 0) { /* try to open it */
|
||||
/* reference the devsw entry from the open_file structure */
|
||||
f->f_dev = dev->d_dev;
|
||||
} else {
|
||||
free(dev); /* release the device descriptor */
|
||||
}
|
||||
result = archsw.arch_getdev((void **)&dev, fname, file);
|
||||
if (result)
|
||||
return (result);
|
||||
|
||||
/* point to device-specific data so that device open can use it */
|
||||
f->f_devdata = dev;
|
||||
result = dev->d_dev->dv_open(f, dev);
|
||||
if (result != 0) {
|
||||
f->f_devdata = NULL;
|
||||
free(dev);
|
||||
return (result);
|
||||
}
|
||||
return(result);
|
||||
|
||||
/* reference the devsw entry from the open_file structure */
|
||||
f->f_dev = dev->d_dev;
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
|
Loading…
Reference in New Issue
Block a user