Print this page
XXXX cpudrv attach error handling is leaky
@@ -312,10 +312,16 @@
* activities.
*/
cpudsp->cpudrv_pm.tq = ddi_taskq_create(dip,
"cpudrv_monitor", CPUDRV_TASKQ_THREADS,
TASKQ_DEFAULTPRI, 0);
+ if (cpudsp->cpudrv_pm.tq == NULL) {
+ cpudrv_enabled = B_FALSE;
+ cpudrv_free(cpudsp);
+ ddi_soft_state_free(cpudrv_state, instance);
+ return (DDI_FAILURE);
+ }
mutex_init(&cpudsp->cpudrv_pm.timeout_lock, NULL,
MUTEX_DRIVER, NULL);
cv_init(&cpudsp->cpudrv_pm.timeout_cv, NULL,
CV_DEFAULT, NULL);
@@ -346,10 +352,11 @@
if (!cpudrv_mach_init(cpudsp)) {
cmn_err(CE_WARN, "cpudrv_attach: instance %d: "
"cpudrv_mach_init failed", instance);
cpudrv_enabled = B_FALSE;
+ ddi_taskq_destroy(cpudsp->cpudrv_pm.tq);
cpudrv_free(cpudsp);
ddi_soft_state_free(cpudrv_state, instance);
return (DDI_FAILURE);
}