diff --git a/dev/core.c b/dev/core.c index bea49ad..d3abfd0 100644 --- a/dev/core.c +++ b/dev/core.c @@ -1,6 +1,7 @@ #include #include #include +#include #include #include @@ -203,6 +204,13 @@ kern_status_t device_register(struct device *dev, struct driver *owner, struct d device_lock_irqsave(dev, &flags); driver_lock(owner); + if (owner->drv_major == DEV_MAJOR_INVALID) { + driver_unlock(owner); + device_unlock_irqrestore(dev, flags); + /* TODO better error message for lack of resources? */ + return KERN_INVALID_ARGUMENT; + } + unsigned int minor = driver_alloc_minor(owner); if (minor == DEV_MINOR_INVALID) { @@ -236,7 +244,6 @@ kern_status_t device_register(struct device *dev, struct driver *owner, struct d break; } - driver_unlock(owner); device_unlock_irqrestore(dev, flags);